[FFMPEG-CLI]合并不同分辨率帧率视频注意事项-出现合并后时长问题

[FFMPEG-CLI]合并不同分辨率帧率视频注意事项-出现合并后时长问题,第1张

ffmpeg在做音视频编解码时非常方便,所以很多场景下转码使用的是ffmpeg,通过ffmpeg –-help可以看到ffmpeg常见的命令大概分为六部分:

命令格式如下:

下面罗列一些ffmpeg常用的信息查询命令:

1、查询版本信息

2、ffmpeg查询是否支持对应的视频文件格式

使用ffmpeg转吗,有时候可能会遇到无法解析的视频文件或者无法生成视频文件,报错提示不支持生成对应的视频文件,这时候就需要查看当前使用的ffmpeg是否支持对应的视频文件格式,需要使用ffmpeg -formats参数来查看:

根据上面输出的信息可以看到,输出的内容分为3个部分,具体如下。

输出信息中包含了三部分内容,具体如下。

输出信息的内容分为四列,具体如下。

从输出的帮助信息中可以看到,FLV的muxer的信息包含两大部分,具体如下。

从输出的帮助信息可以看到,FLV的demuxer的信息包含两大部分:

从帮助信息可以看到,H264(AVC)的编码参数包含两大部分,具体如下。

从帮助信息可以看到,H264(AVC)的解码参数查看包括两大部分,具体如下:

从帮助信息可以看到,colorkey滤镜查看信息包含两大部分,具体如下。

ffmpeg的封装转换(转封装)功能包含在AVFormat模块中,通过libavformat库进行Mux和Demux *** 作;多媒体文件的格式有很多种,这些格式中的很多参数在Mux与Demux的 *** 作参数中是公用的,下面来详细介绍一下这些公用的参数。

通过查看ffmpeg --help full信息,找到AVFormatContext参数部分,该参数下的所有参数均为封装转换可使用的参数。下表列出了ffmpeg AVFormatContext的主要参数及说明。

这些都是通用的封装、解封装 *** 作时使用的参数,后续章节中介绍转封装 *** 作、解封装 *** 作、封装 *** 作时,上述参数可以与对应的命令行参数搭配使用。

ffmpeg编解码部分的功能主要是通过模块AVCodec来完成的,通过libavcodec库进行Encode与Decode *** 作。多媒体编码格式的种类有很多,但是还是有很多通用的基本 *** 作参数设置,下面来详细介绍这些公用的参数。

通过命令ffmpeg --help full可以看到AVCodecContext参数列表信息。该选项下面的所有参数均为编解码可以使用的参数。

ffmpeg还有一些更细化的参数,本节中并未详细提及,可以根据本节中提到的查看方法查看ffmpeg的帮助文件以查看更多的内容,本节中介绍的是重点及常用的通用参数,后续章节中介绍编码 *** 作时,上述参数可以配合对应的例子使用。

ffmpeg工具的主要用途为编码、解码、转码以及媒体格式转换,ffmpeg常用于进行转码 *** 作,使用ffmpeg转码的主要原理如图

通过之前介绍的参数,可以设置转码的相关参数,如果转码 *** 作频涉及封装的改变,则可以通过设置AVCodec与AVFormat的 *** 作参数进行封装与编码的改变,下面示例:

从输出信息中可以看到,以上输出的参数中使用了前面介绍过的参数,具体如下。

在 FFmpeg套件中,除了ffmpeg作为多媒体处理工具之外,还有ffprobe多媒体信息查看工具,ffprobe主要用来查看多媒体文件的信息,下面就来看一下ffprobe中常见的基本命令。

usage: ffprobe [OPTIONS] [INPUT_FILE] the other

ffprobe常用的参数比较多,可以通过ffprobe --help来查看详细的帮助信息。

这些输出的帮助信息既是ffprobe常用的 *** 作参数,也是ffrpobe的基础参数。例如查看log,查看每一个音频数据包信息或者视频数据包信息,查看节目信息,查看流信息,查看每一个流有多少帧以及每一个流有多少个音视频包,查看视频像素点的格式等。下面就来根据以上的输出参数重点列举几个例子。

1)使用下面的命令,查看多媒体数据包信息:

通过show_packets查看的多媒体数据包信息使用PACKET标签括起来,其中包含的信息主要如下:

2)除了以上字段和信息之外,还可以通过如下的组合参数来查看包中的具体数据:

和上面的比起来多了一个data字段,具体如下

[PACKET]

codec_type=video

stream_index=0

pts=379904

pts_time=24733333

dts=379904

dts_time=24733333

duration=512

duration_time=0033333

size=2010

pos=3272564

flags=__

data=

00000000: 0000 07d6 419a cc21 3ffa 5800 0031 9893 A!X1

00000010: d7e7 0641 039b 27c5 e0f8 5175 1abc 0e4f A'QuO

00000020: d710 f401 3224 0093 a2e5 c07e 9c30 0003 2$~0

略过一大段数据

00000770: 1ebe 840a 5ac2 4f9a 614c 5697 8eab fef8 ZOaLV

00000780: 0b59 9647 cc6d 8a4b f8c0 89e8 798e f569 YGmKyI

00000790: 2aca ec22 e1f5 d2e5 31b1 010e 7725 e127 "1w%'

000007a0: c5f4 7051 f07b 8449 649f 3fab 6a3d 3913 pQ{Idj=9

000007b0: d9e4 bdd6 0f22 fa77 2b32 35f5 f4f7 5393 "w+25S

000007c0: 1c9d fe72 1550 ba41 c774 5031 96d5 aef5 rPAtP1

000007d0: f1b9 77a7 ad54 0800 010f wT

[/PACKET]

从输出的内容中可以看到多媒体包中包含的数据,那么我们可以根据上述输出内容中的pos,也就是文件偏移位置来查看,pos的值为3272564,将其转换为十六进制位置为0x31EF74,这就是这个包在flv文件中的偏移量,可以使用Linux下的xxd 1mp4命令进行查看:

0031ef70: 0000 000e 0000 07d6 419a cc21 3ffa 5800 A!X

0031ef80: 0031 9893 d7e7 0641 039b 27c5 e0f8 5175 1A'Qu

0031ef90: 1abc 0e4f d710 f401 3224 0093 a2e5 c07e

0031efa0: 9c30 0003 389a 06b7 f211 fb06 362c 95a9 086,

0031efb0: 0020 8f32 e280 6773 015e 78d2 87a3 e114 2gs^x

0031efc0: f3b3 9d2d ffd7 b202 2233 923f 3d42 bc7f -"3=B

可以看到从0x31EF74开始的数据和上面一致:0000 07d6 419a cc21 3ffa 5800。

通过ffprobe读取packets来进行对应的数据分析,使用show_packets与show_data配合可以进行更加精确的分析。

3)除了packets与data之外,ffprobe还可以分析多媒体的封装格式,其使用FORMAT标签括起来显示:

[FORMAT]

filename=1mp4

nb_streams=2

nb_programs=0

format_name=mov,mp4,m4a,3gp,3g2,mj2

format_long_name=QuickTime / MOV

start_time=0000000

duration=25704000

size=3307949

bit_rate=1029551

probe_score=100

TAG:major_brand=isom

TAG:minor_version=512

TAG:compatible_brands=isomiso2avc1mp41

TAG:encoder=Lavf5533100

[/FORMAT]

下面是对输出信息关键字段的说明:

4)使用下面的命令可以查看视频文件的帧信息,输出的帧信息将使用FRAME标签括起来:

[FRAME]

media_type=video

stream_index=0

key_frame=1

pts=0

pts_time=0000000

pkt_dts=0

pkt_dts_time=0000000

best_effort_timestamp=0

best_effort_timestamp_time=0000000

pkt_duration=512

pkt_duration_time=0033333

pkt_pos=22995

pkt_size=1888

width=720

height=1280

pix_fmt=yuv420p

sample_aspect_ratio=N/A

pict_type=I

coded_picture_number=0

display_picture_number=0

interlaced_frame=0

top_field_first=0

repeat_pict=0

color_range=tv

color_space=bt709

color_primaries=bt709

color_transfer=bt709

chroma_location=left

[/FRAME]

通过-show-frames参数可以查看每一帧的信息,下面就来介绍一下其中重要的信息,

在Windows下常用的Elecard StreamEye工具中打开查看MP4时,会很直观地看到帧类型显示,用ffprobe的pict_type同样可以看到视频的帧是I帧,P帧或者B帧;每一帧的大小同样也可以通过ffprobe的pkt_size查看到。

5)通过-show_streams参数可以查看到多媒体文件中的流信息,流的信息将使用STREAM标签括起来:

[STREAM]

index=0

codec_name=h264

codec_long_name=H264 / AVC / MPEG-4 AVC / MPEG-4 part 10

profile=Main

codec_type=video

codec_tag_string=avc1

codec_tag=0x31637661

width=720

height=1280

coded_width=720

coded_height=1280

closed_captions=0

film_grain=0

has_b_frames=0

sample_aspect_ratio=N/A

display_aspect_ratio=N/A

pix_fmt=yuv420p

level=42

color_range=tv

color_space=bt709

color_transfer=bt709

color_primaries=bt709

chroma_location=left

field_order=progressive

refs=1

is_avc=true

nal_length_size=4

id=0x1

r_frame_rate=30/1

avg_frame_rate=30/1

time_base=1/15360

start_pts=0

start_time=0000000

duration_ts=388608

duration=25300000

bit_rate=964695

max_bit_rate=N/A

bits_per_raw_sample=8

nb_frames=759

nb_read_frames=N/A

nb_read_packets=N/A

extradata_size=39

DISPOSITION:default=1

DISPOSITION:dub=0

DISPOSITION:original=0

DISPOSITION:comment=0

DISPOSITION:lyrics=0

DISPOSITION:karaoke=0

DISPOSITION:forced=0

DISPOSITION:hearing_impaired=0

DISPOSITION:visual_impaired=0

DISPOSITION:clean_effects=0

DISPOSITION:attached_pic=0

DISPOSITION:timed_thumbnails=0

DISPOSITION:captions=0

DISPOSITION:descriptions=0

DISPOSITION:metadata=0

DISPOSITION:dependent=0

DISPOSITION:still_image=0

TAG:language=und

TAG:handler_name=VideoHandler

TAG:vendor_id=[0][0][0][0]

[/STREAM]

如以上输出内容所示,从中可以看到流的信息,具体属性及说明如下表

fprobe 使用前面的参数可以获得key-value格式的显示方式,但是阅读起来因为习惯不同,可能有的人会认为方便,有的人认为不方便;如果要进行格式化的显示,这样就需要用到ffprobe -print_format 或者 ffprobe -of 参数来进行相应的格式输出,而-print_format 支持多种格式输出,包括XML,INI,JSON,CSV,FLAT等。下面列举几种常见的格式输出的例子

<xml version="10" encoding="UTF-8">

<ffprobe>

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1mp4':

Metadata:

major_brand : isom

minor_version : 512

compatible_brands: isomiso2avc1mp41

encoder : Lavf5533100

Duration: 00:00:2570, start: 0000000, bitrate: 1029 kb/s

Stream #0:0 0x1 : Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 720x1280, 964 kb/s, 30 fps, 30 tbr, 15360 tbn (default)

Metadata:

handler_name : VideoHandler

vendor_id : [0][0][0][0]

Stream #0:1 0x2 : Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 72 kb/s (default)

Metadata:

handler_name : SoundHandler

vendor_id : [0][0][0][0]

<streams>

<stream index="0" codec_name="h264" codec_long_name="H264 / AVC / MPEG-4 AVC / MPEG-4 part 10" profile="Main" codec_type="video" codec_tag_string="avc1" codec_tag="0x31637661" width="720" height="1280" coded_width="720" coded_height="1280" closed_captions="0" film_grain="0" has_b_frames="0" pix_fmt="yuv420p" level="42" color_range="tv" color_space="bt709" color_transfer="bt709" color_primaries="bt709" chroma_location="left" field_order="progressive" refs="1" is_avc="true" nal_length_size="4" id="0x1" r_frame_rate="30/1" avg_frame_rate="30/1" time_base="1/15360" start_pts="0" start_time="0000000" duration_ts="388608" duration="25300000" bit_rate="964695" bits_per_raw_sample="8" nb_frames="759" extradata_size="39">

<disposition default="1" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0"/>

<tag key="language" value="und"/>

<tag key="handler_name" value="VideoHandler"/>

<tag key="vendor_id" value="[0][0][0][0]"/>

</stream>

<stream index="1" codec_name="aac" codec_long_name="AAC (Advanced Audio Coding)" profile="LC" codec_type="audio" codec_tag_string="mp4a" codec_tag="0x6134706d" sample_fmt="fltp" sample_rate="44100" channels="2" channel_layout="stereo" bits_per_sample="0" id="0x2" r_frame_rate="0/0" avg_frame_rate="0/0" time_base="1/44100" start_pts="0" start_time="0000000" duration_ts="1133511" duration="25703197" bit_rate="72863" nb_frames="1107" extradata_size="2">

<disposition default="1" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0"/>

<tag key="language" value="und"/>

<tag key="handler_name" value="SoundHandler"/>

<tag key="vendor_id" value="[0][0][0][0]"/>

</stream>

</streams>

</ffprobe>

从输出的内容可以看到,输出的内容格式为XML格式,如果原有的业务本身就可以解析XML格式,那么就不需要更改解析引擎,直接将输出内容输出为XML格式即可,解析引擎解析Packet信息是会更方便。

输出INI格式:

输出FLAT格式:

输出JSON格式:

输出CSV格式:

通过各种格式的输出,可以使用对应的绘图方式绘制出可视化图形。

CSV格式输出后可以使用Excel打开表格形式

可以在命令行中自行输出,输出的frame信息全部为视频相关的信息。

使用ffprobe还可以查看很多信息,我们可以通过本节介绍的help方法查看更多更详细的信息

在FFmpeg中通常使用ffplay作为播放器,其实ffplay同样也可作为很多音视频的图形化分析工具,通过ffplay可以看到视频图像的运动估计方向、音频数据的波形等,以下将介绍更多参数并举例说明。

1)ffplay常用参数

ffplay不仅仅是播放器,同时也是测试ffmpeg的codec引擎、format引擎,以及filter引擎的工具,并且还可以进行可视化的媒体参数分析。其可以通过ffplay --help进行查看:

Simple media player

usage: ffplay [options] input_file

Main options:

-L show license

-h topic show help

- topic show help

-help topic show help

--help topic show help

-version show version

-buildconf show build configuration

-formats show available formats

-muxers show available muxers

-demuxers show available demuxers

-devices show available devices

-codecs show available codecs

-decoders show available decoders

-encoders show available encoders

-bsfs show available bit stream filters

-protocols show available protocols

-filters show available filters

-pix_fmts show available pixel formats

-layouts show standard channel layouts

-sample_fmts show available audio sample formats

-dispositions show available stream dispositions

-colors show available color names

-loglevel loglevel set logging level

-v loglevel set logging level

-report generate a report

-max_alloc bytes set maximum size of a single allocated block

-sources device list sources of the input device

-sinks device list sinks of the output device

-x width force displayed width

-y height force displayed height

-s size set frame size (WxH or abbreviation)

-fs force full screen

-an disable audio

-vn disable video

-sn disable subtitling

-ss pos seek to a given position in seconds

-t duration play "duration" seconds of audio/video

-bytes val seek by bytes 0=off 1=on -1=auto

-seek_interval seconds set seek interval for left/right keys, in seconds

-nodisp disable graphical display

-noborder borderless window

-alwaysontop window always on top

-volume volume set startup volume 0=min 100=max

-f fmt force format

-window_title window title set window title

-af filter_graph set audio filters

-showmode mode select show mode (0 = video, 1 = waves, 2 = RDFT)

-i input_file read specified file

-codec decoder_name force decoder

-autorotate automatically rotate video

这只是Main options里面的部分,另外还有Advanced options,AVCodecContext AVOptions等等很多内容。就上述帮助信息的输出所示,有些是前面已经介绍过的参数,这里就不再一一赘述,一些未介绍的参数说明见下表

常见参数可以手动进行尝试,下面列举几个示例。

如果希望从视频的第5秒开始播放,播放5秒钟的文件,则可以使用如下命令

如果希望视频播放时播放器的窗口显示标题为自定义标题,则可以使用如下命令

如果希望使用ffplay打开网络直播流,则可以使用如下命令:

可以看出ffplay可以支持的协议有多种,ramp,rtmp,>

以上就是关于[FFMPEG-CLI]合并不同分辨率/帧率视频注意事项-出现合并后时长问题全部的内容,包括:[FFMPEG-CLI]合并不同分辨率/帧率视频注意事项-出现合并后时长问题、基于ffmpeg的视频处理汇总、ffmpeg图片转视频,图片+音频合成视频每秒一张图等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9498033.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存