ffmpeg在做音視頻編解碼時非常方便敷钾,所以很多場景下轉(zhuǎn)碼使用的是ffmpeg职辅,通過ffmpeg –-help可以看到ffmpeg常見的命令大概分為六部分:
ffmpeg --help
- ffmpeg信息查詢部分
- 公共做操參數(shù)部分
- 文件主要操作參數(shù)部分
- 視頻操作參數(shù)部分
- 音頻操作參數(shù)部分
- 字幕操作參數(shù)部分
一搜锰、ffmpeg信息查詢
命令格式如下:
ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
下面羅列一些ffmpeg常用的信息查詢命令:
1缭乘、查詢版本信息
ffmpeg -version
2司蔬、ffmpeg查詢是否支持對應的視頻文件格式
使用ffmpeg轉(zhuǎn)嗎邑茄,有時候可能會遇到無法解析的視頻文件或者無法生成視頻文件,報錯提示不支持生成對應的視頻文件俊啼,這時候就需要查看當前使用的ffmpeg是否支持對應的視頻文件格式肺缕,需要使用ffmpeg -formats參數(shù)來查看:
ffmpeg -formats
根據(jù)上面輸出的信息可以看到,輸出的內(nèi)容分為3個部分授帕,具體如下同木。
- 第一列是多媒體文件封裝格式的Demuxing支持與Muxing支持;
- 第二列是多媒體文件格式跛十;
- 第三列是文件格式的詳細說明;
3彤路、使用ffmpeg命令時,可能會出現(xiàn)ffmpeg不支持某種編碼格式或者某種解碼格式的錯誤提示信息,這種錯誤常見于并未將該編碼器或者解碼器集成到ffmpeg中,若想查看ffmpeg是否支持H.264編碼或者解碼, - 可以通過ffmpeg -codecs查看全部信息,
- 也可以通過ffmpeg -encoders查看ffmpeg是否支持H.264編碼器,
- 或者通過ffmpeg -decoders查看ffmpeg是否支持H.264解碼器。
ffmpeg -codecs
ffmpeg -encoders
ffmpeg -decoders
輸出信息中包含了三部分內(nèi)容,具體如下芥映。
- 第一列包含6個字段,第一個字段用來表示此編碼器為音頻洲尊、視頻還是字幕,第二個字段表示幀級別的多線程支持,第三個字段表示分片級別的多線程,第四個字段表示該編碼為試驗版本,第五個字段表示draw horiz band模式支持,第六個字段表示直接渲染模式支持
- 第二列是編碼格式
- 第三列是編碼格式的詳細說明
4、除了查看ffmpeg支持的封裝(Muxer)格式與解封裝(Demuxer)格式奈偏、編碼(Encoder)類型與解碼(Decoder)類型,還可以通過ffmpeg -filters查看ffmpeg支持哪些濾鏡:
ffmpeg -filters
輸出信息的內(nèi)容分為四列坞嘀,具體如下。
- 第一列總共有3個字段:第一個字段是時間軸支持惊来;第二個字段是分片線程處理支持丽涩;第三個字段是命令支持;
- 第二列是濾鏡名唁盏;
- 第三列是轉(zhuǎn)換方式内狸,入音頻轉(zhuǎn)音頻(A->A),視頻轉(zhuǎn)視頻(V->V)厘擂,創(chuàng)建音頻(|->A)昆淡,創(chuàng)建視頻(|->V)等操作;
- 第四列是濾鏡作用說明刽严;
5昂灵、如果要了解ffmpeg支持的具體某一中demuxer,muxer類型舞萄,可以通過ffmpeg -h查看該類型的詳細參數(shù)眨补,包括encoder、decoder所支持的操作參數(shù)倒脓,filter所支持的參數(shù)撑螺,下面是幾個對應的例子。
1)查看FLV封裝器的參數(shù)支持
ffmpeg -h muxer=flv
從輸出的幫助信息中可以看到崎弃,F(xiàn)LV的muxer的信息包含兩大部分甘晤,具體如下含潘。
- 第一部分為FLV封裝的默認配置描述,如擴展名线婚、MIME類型遏弱、默認的視頻編碼格式、默認的音頻編碼格式
- 第二部分為FLV封裝時可以支持的配置參數(shù)及相關說明
2)查看flv解封裝器的參數(shù)支持
ffmpeg -h demuxer=flv
從輸出的幫助信息可以看到塞弊,F(xiàn)LV的demuxer的信息包含兩大部分:
- 第一部分為FLV解封裝默認的擴展名漱逸。
- 第二部分為FLV解封裝時可以支持的配置參數(shù)及相關說明。
3)查看H.264(AVC)的編碼參數(shù)支持
ffmpeg -h encoder=h264
從幫助信息可以看到游沿,H.264(AVC)的編碼參數(shù)包含兩大部分饰抒,具體如下。
- 第一部分為h.264所支持的基本編碼方式奏候,支持的多線程編碼方式(例如幀級別多線程編碼或Slice級別多線程編碼)循集,編碼器所支持的像素的色彩格式
- 第二部分為編碼的具體配置參數(shù)及相關說明
4)查看H.264(AVC)的解碼參數(shù)支持
ffmpeg -h decoder=h264
從幫助信息可以看到,H.264(AVC)的解碼參數(shù)查看包括兩大部分蔗草,具體如下:
- 第一部分為解碼H.264時可以采用的常規(guī)支持、多線程方式支持(幀級別多線程解碼或Slice級別多線程解碼)
- 第二部分為解碼H.264時可以采用的解碼參數(shù)及相關說明
5)查看colorkey濾鏡的參數(shù)支持
ffmpeg -h filter=colorkey
從幫助信息可以看到疆柔,colorkey濾鏡查看信息包含兩大部分咒精,具體如下炬搭。
- colorkey所支持的色彩格式信息樟凄,colorkey所支持的多線程處理方式,輸入或輸出正常
- colorkey所支持的參數(shù)及說明
關于ffmpeg的幫助信息查詢部分已經(jīng)介紹完畢新啼,下面詳細介紹ffmpeg的封裝轉(zhuǎn)換鞋屈。
二范咨、ffmpeg的封裝轉(zhuǎn)換
ffmpeg的封裝轉(zhuǎn)換(轉(zhuǎn)封裝)功能包含在AVFormat模塊中,通過libavformat庫進行Mux和Demux操作厂庇;多媒體文件的格式有很多種渠啊,這些格式中的很多參數(shù)在Mux與Demux的操作參數(shù)中是公用的,下面來詳細介紹一下這些公用的參數(shù)权旷。
通過查看ffmpeg --help full信息替蛉,找到AVFormatContext參數(shù)部分,該參數(shù)下的所有參數(shù)均為封裝轉(zhuǎn)換可使用的參數(shù)拄氯。下表列出了ffmpeg AVFormatContext的主要參數(shù)及說明躲查。
這些都是通用的封裝、解封裝操作時使用的參數(shù)译柏,后續(xù)章節(jié)中介紹轉(zhuǎn)封裝操作镣煮、解封裝操作、封裝操作時鄙麦,上述參數(shù)可以與對應的命令行參數(shù)搭配使用典唇。
三邮弹、ffmpeg的轉(zhuǎn)碼參數(shù)
ffmpeg編解碼部分的功能主要是通過模塊AVCodec來完成的,通過libavcodec庫進行Encode與Decode操作蚓聘。多媒體編碼格式的種類有很多腌乡,但是還是有很多通用的基本操作參數(shù)設置,下面來詳細介紹這些公用的參數(shù)夜牡。
通過命令ffmpeg --help full可以看到AVCodecContext參數(shù)列表信息与纽。該選項下面的所有參數(shù)均為編解碼可以使用的參數(shù)。
ffmpeg還有一些更細化的參數(shù)塘装,本節(jié)中并未詳細提及急迂,可以根據(jù)本節(jié)中提到的查看方法查看ffmpeg的幫助文件以查看更多的內(nèi)容,本節(jié)中介紹的是重點及常用的通用參數(shù)蹦肴,后續(xù)章節(jié)中介紹編碼操作時僚碎,上述參數(shù)可以配合對應的例子使用。
四阴幌、ffmpeg的基本轉(zhuǎn)碼原理
ffmpeg工具的主要用途為編碼勺阐、解碼、轉(zhuǎn)碼以及媒體格式轉(zhuǎn)換矛双,ffmpeg常用于進行轉(zhuǎn)碼操作渊抽,使用ffmpeg轉(zhuǎn)碼的主要原理如圖
通過之前介紹的參數(shù),可以設置轉(zhuǎn)碼的相關參數(shù)议忽,如果轉(zhuǎn)碼操作頻涉及封裝的改變懒闷,則可以通過設置AVCodec與AVFormat的操作參數(shù)進行封裝與編碼的改變,下面示例:
ffmpeg -i test.rmvb -vcodec mpeg4 -b:v 200k -r 15 -an output.mp4
從輸出信息中可以看到栈幸,以上輸出的參數(shù)中使用了前面介紹過的參數(shù)愤估,具體如下。
- 轉(zhuǎn)封裝格式從RMVB格式轉(zhuǎn)換為MP4格式
- 視頻編碼從RV40轉(zhuǎn)換為MPEG4格式
- 視頻碼率從原來的674kbit/s轉(zhuǎn)換為200kbit/s
- 視頻幀率從原來的30fps轉(zhuǎn)換為15fps
- 轉(zhuǎn)換后的文件中不包括音頻(-an參數(shù))
- 分辨率保持不變852x480
可以分析出速址,這個例子的流程與前面提到的流程相同玩焰,首先解封裝,需要解的封裝為RMVB壳繁;然后解碼震捣,其中視頻編碼格式為RV40 ,音頻為COOK闹炉;然后解碼后的視頻編碼為MPEG4蒿赢;最后封裝為一個沒有音頻的MP4文件。
四渣触、ffprobe常用命令
在 FFmpeg套件中羡棵,除了ffmpeg作為多媒體處理工具之外,還有ffprobe多媒體信息查看工具嗅钻,ffprobe主要用來查看多媒體文件的信息皂冰,下面就來看一下ffprobe中常見的基本命令店展。
usage: ffprobe [OPTIONS] [INPUT_FILE] the other
ffprobe常用的參數(shù)比較多,可以通過ffprobe --help來查看詳細的幫助信息秃流。
這些輸出的幫助信息既是ffprobe常用的操作參數(shù)赂蕴,也是ffrpobe的基礎參數(shù)。例如查看log舶胀,查看每一個音頻數(shù)據(jù)包信息或者視頻數(shù)據(jù)包信息概说,查看節(jié)目信息,查看流信息嚣伐,查看每一個流有多少幀以及每一個流有多少個音視頻包糖赔,查看視頻像素點的格式等。下面就來根據(jù)以上的輸出參數(shù)重點列舉幾個例子轩端。
1)使用下面的命令放典,查看多媒體數(shù)據(jù)包信息:
ffprobe -show_packets 1.mp4
通過show_packets查看的多媒體數(shù)據(jù)包信息使用PACKET標簽括起來,其中包含的信息主要如下:
[PACKET]
codec_type=video
stream_index=0
pts=369664
pts_time=24.066667
dts=369664
dts_time=24.066667
duration=512
duration_time=0.033333
size=2875
pos=3204521
flags=__
[/PACKET]
字段 | 說明 |
---|---|
codec_type | 多媒體類型基茵,如視頻包奋构、音頻包等 |
stream_index | 多媒體的stream索引 |
pts | 多媒體的顯示時間值 |
pts_time | 根據(jù)不同格式計算過后的多媒體的顯示時間 |
dts | 多媒體的解碼時間值 |
dts_time | 根據(jù)不同格式計算過后的多媒體解碼時間 |
duration | 多媒體占用的時間值 |
duration_time | 根據(jù)不同格式計算過后的多媒體所占用的時間值 |
size | 多媒體包的大小 |
pos | 多媒體所在的文件偏移位置 |
flags | 多媒體包標記,如關鍵包與非關鍵包的標記 |
2)除了以上字段和信息之外耿导,還可以通過如下的組合參數(shù)來查看包中的具體數(shù)據(jù):
ffprobe -show_data -show_packets 1.mp4
和上面的比起來多了一個data字段声怔,具體如下
[PACKET]
codec_type=video
stream_index=0
pts=379904
pts_time=24.733333
dts=379904
dts_time=24.733333
duration=512
duration_time=0.033333
size=2010
pos=3272564
flags=__
data=
00000000: 0000 07d6 419a cc21 3ffa 5800 0031 9893 ....A..!?.X..1..
00000010: d7e7 0641 039b 27c5 e0f8 5175 1abc 0e4f ...A..'...Qu...O
00000020: d710 f401 3224 0093 a2e5 c07e 9c30 0003 ....2$.....~.0..
略過一大段數(shù)據(jù)
00000770: 1ebe 840a 5ac2 4f9a 614c 5697 8eab fef8 ....Z.O.aLV.....
00000780: 0b59 9647 cc6d 8a4b f8c0 89e8 798e f569 .Y.G.m.K....y..I
00000790: 2aca ec22 e1f5 d2e5 31b1 010e 7725 e127 *.."....1...w%.'
000007a0: c5f4 7051 f07b 8449 649f 3fab 6a3d 3913 ..pQ.{.Id.?.j=9.
000007b0: d9e4 bdd6 0f22 fa77 2b32 35f5 f4f7 5393 .....".w+25...S.
000007c0: 1c9d fe72 1550 ba41 c774 5031 96d5 aef5 ...r.P.A.tP1....
000007d0: f1b9 77a7 ad54 0800 010f ..w..T....
[/PACKET]
從輸出的內(nèi)容中可以看到多媒體包中包含的數(shù)據(jù),那么我們可以根據(jù)上述輸出內(nèi)容中的pos舱呻,也就是文件偏移位置來查看,pos的值為3272564悠汽,將其轉(zhuǎn)換為十六進制位置為0x31EF74箱吕,這就是這個包在flv文件中的偏移量,可以使用Linux下的xxd 1.mp4命令進行查看:
0031ef70: 0000 000e 0000 07d6 419a cc21 3ffa 5800 ........A..!?.X.
0031ef80: 0031 9893 d7e7 0641 039b 27c5 e0f8 5175 .1.....A..'...Qu
0031ef90: 1abc 0e4f d710 f401 3224 0093 a2e5 c07e
0031efa0: 9c30 0003 389a 06b7 f211 fb06 362c 95a9 .0..8.......6,..
0031efb0: 0020 8f32 e280 6773 015e 78d2 87a3 e114 . .2..gs.^x.....
0031efc0: f3b3 9d2d ffd7 b202 2233 923f 3d42 bc7f ...-...."3.?=B..
可以看到從0x31EF74開始的數(shù)據(jù)和上面一致:0000 07d6 419a cc21 3ffa 5800柿冲。
通過ffprobe讀取packets來進行對應的數(shù)據(jù)分析茬高,使用show_packets與show_data配合可以進行更加精確的分析。
3)除了packets與data之外假抄,ffprobe還可以分析多媒體的封裝格式怎栽,其使用FORMAT標簽括起來顯示:
ffprobe -show_format 1.mp4
[FORMAT]
filename=1.mp4
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=25.704000
size=3307949
bit_rate=1029551
probe_score=100
TAG:major_brand=isom
TAG:minor_version=512
TAG:compatible_brands=isomiso2avc1mp41
TAG:encoder=Lavf55.33.100
[/FORMAT]
下面是對輸出信息關鍵字段的說明:
字段 | 說明 |
---|---|
filename | 文件名 |
nb_streams | 媒體中包含的流的個數(shù) |
nb_programs | 節(jié)目數(shù) |
format_name | 使用的封裝模塊的名稱 |
format_long_name | 封裝的完整名稱 |
start_time | 媒體文件的起始時間 |
duration | 媒體文件的的總時間長度 |
duration_time | 根據(jù)不同格式計算過后的多媒體所占用的時間值 |
size | 媒體文件的大小 |
bit_rate | 媒體文件的碼率 |
4)使用下面的命令可以查看視頻文件的幀信息,輸出的幀信息將使用FRAME標簽括起來:
ffprobe -show_frames 1.mp4
[FRAME]
media_type=video
stream_index=0
key_frame=1
pts=0
pts_time=0.000000
pkt_dts=0
pkt_dts_time=0.000000
best_effort_timestamp=0
best_effort_timestamp_time=0.000000
pkt_duration=512
pkt_duration_time=0.033333
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參數(shù)可以查看每一幀的信息宿饱,下面就來介紹一下其中重要的信息熏瞄,
屬性 | 說明 | 值 |
---|---|---|
media_type | 幀的類型(視頻、音頻谬以、字幕等) | video |
stream_index | 幀所在的索引區(qū)域 | 0 |
key_frame | 是否為關鍵幀 | 1 |
pkt_pts | Frame包的pts | 0 |
pkt_pts_time | Frame包的pts的時間顯示 | 0.000000 |
pkt_dts | Frame包的dts | 0 |
pkt_dts_time | Frame包的dts的時間顯示 | 0.000000 |
pkt_duration | Frame包的時長 | 512 |
pkt_duration_time | Frame包的時長時間顯示 | 0.033333 |
pkt_pos | Frame包所在文件的偏移位置 | 22995 |
width | 幀顯示的寬度 | 720 |
height | 幀顯示的高度 | 1280 |
pix_fmt | 幀的圖像色彩格式 | yuv420p |
pict_type | 幀類型 | I 幀/ P幀 / B幀 |
pkt_size | 每幀的大小 | 1888 |
在Windows下常用的Elecard StreamEye工具中打開查看MP4時强饮,會很直觀地看到幀類型顯示,用ffprobe的pict_type同樣可以看到視頻的幀是I幀为黎,P幀或者B幀邮丰;每一幀的大小同樣也可以通過ffprobe的pkt_size查看到行您。
5)通過-show_streams參數(shù)可以查看到多媒體文件中的流信息,流的信息將使用STREAM標簽括起來:
ffprobe -show_streams 1.mp4
[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / 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=0.000000
duration_ts=388608
duration=25.300000
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]
如以上輸出內(nèi)容所示剪廉,從中可以看到流的信息娃循,具體屬性及說明如下表
屬性 | 說明 | 值 |
---|---|---|
index | 流所在的索引區(qū)域 | 0 |
codec_name | 編碼名 | h264 |
codec_long_name | 編碼全名 | H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 |
profile | 編碼的profile | Main |
level | 編碼的level | 42 |
has_b_frames | 包含B幀信息 | 0 |
codec_type | 編碼類型 | video |
codec_tag_string | 編碼的標簽數(shù)據(jù) | avc1 |
pix_fmt | 圖像顯示的色彩格式 | yuv420p |
coded_width | 圖像的寬度 | 720 |
coded_height | 圖像的高度 | 1280 |
r_frame_rate | 實際幀率 | 30/1 |
avg_frame_rate | 平均幀率 | 30/1 |
time_base | 時間基數(shù)(用來進行timestamp) | 1/15360 |
bit_rate | 碼率 | 964695 |
max_bit_rate | 最大碼率 | N/A |
nb_frames | 幀數(shù) | 759 |
fprobe 使用前面的參數(shù)可以獲得key-value格式的顯示方式,但是閱讀起來因為習慣不同斗蒋,可能有的人會認為方便捌斧,有的人認為不方便;如果要進行格式化的顯示吹泡,這樣就需要用到ffprobe -print_format 或者 ffprobe -of 參數(shù)來進行相應的格式輸出骤星,而-print_format 支持多種格式輸出,包括XML,INI,JSON,CSV,FLAT等爆哑。下面列舉幾種常見的格式輸出的例子
ffprobe -of xml -show_streams 1.mp4
<?xml version="1.0" encoding="UTF-8"?>
<ffprobe>
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf55.33.100
Duration: 00:00:25.70, start: 0.000000, bitrate: 1029 kb/s
Stream #0:00x1: 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:10x2: 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="H.264 / 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="0.000000" duration_ts="388608" duration="25.300000" 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="0.000000" duration_ts="1133511" duration="25.703197" 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>
從輸出的內(nèi)容可以看到洞难,輸出的內(nèi)容格式為XML格式,如果原有的業(yè)務本身就可以解析XML格式揭朝,那么就不需要更改解析引擎队贱,直接將輸出內(nèi)容輸出為XML格式即可,解析引擎解析Packet信息是會更方便潭袱。
輸出INI格式:
ffprobe -of ini -show_streams 1.mp4
輸出FLAT格式:
ffprobe -of flat -show_streams 1.mp4
輸出JSON格式:
ffprobe -of json -show_streams 1.mp4
輸出CSV格式:
ffprobe -of csv -show_streams 1.mp4
通過各種格式的輸出柱嫌,可以使用對應的繪圖方式繪制出可視化圖形。
CSV格式輸出后可以使用Excel打開表格形式
6)使用select_streams可以只查看音頻(a)屯换、視頻(v)编丘,字幕(s)的信息,例如配合show_frames查看視頻的frames信息:
ffprobe -show_frames v -of xml 1.mp4
可以在命令行中自行輸出彤悔,輸出的frame信息全部為視頻相關的信息嘉抓。
使用ffprobe還可以查看很多信息,我們可以通過本節(jié)介紹的help方法查看更多更詳細的信息
四晕窑、ffplay常用命令
在FFmpeg中通常使用ffplay作為播放器抑片,其實ffplay同樣也可作為很多音視頻的圖形化分析工具,通過ffplay可以看到視頻圖像的運動估計方向杨赤、音頻數(shù)據(jù)的波形等敞斋,以下將介紹更多參數(shù)并舉例說明。
1)ffplay常用參數(shù)
ffplay不僅僅是播放器疾牲,同時也是測試ffmpeg的codec引擎植捎、format引擎,以及filter引擎的工具说敏,并且還可以進行可視化的媒體參數(shù)分析鸥跟。其可以通過ffplay --help進行查看:
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等等很多內(nèi)容医咨。就上述幫助信息的輸出所示枫匾,有些是前面已經(jīng)介紹過的參數(shù),這里就不再一一贅述拟淮,一些未介紹的參數(shù)說明見下表
參數(shù) | 說明 |
---|---|
x | 強制設置視頻顯示窗口的寬度 |
y | 強制設置視頻顯示窗口的高度 |
s | 設置視頻顯示的寬高 |
fs | 強制全屏顯示 |
an | 屏蔽音頻 |
vn | 屏蔽視頻 |
sn | 屏蔽字幕 |
ss | 根據(jù)設置的秒進行定位拖動 |
t | 設置播放視頻/音頻的長度 |
bytes | 設置定位拖動的策略干茉,0為不可拖動,1為可拖動很泊,-1為自動 |
nodisp | 關閉圖形化顯示窗口 |
f | 強制使用設置的格式進行解析 |
window_title | 設置顯示窗口的標題 |
af | 設置音頻的濾鏡 |
codec | 強制使用設置的codec進行解碼 |
autorotate | 自動旋轉(zhuǎn)視頻 |
常見參數(shù)可以手動進行嘗試角虫,下面列舉幾個示例。
*如果希望從視頻的第5秒開始播放委造,播放5秒鐘的文件戳鹅,則可以使用如下命令
ffplay -ss 5 -t 5 1.mp4
*如果希望視頻播放時播放器的窗口顯示標題為自定義標題,則可以使用如下命令
ffplay -window_title "Hello World,This is a sample" 1.mp4
*如果希望使用ffplay打開網(wǎng)絡直播流昏兆,則可以使用如下命令:
ffplay -window_title "播放測試" ramp://up.v.test.com/live/stream (已經(jīng)不可用)
ffplay -window_title "播放測試" http://1011.hlsplay.aodianyun.com/demo/game.flv (測試可用)
ffplay -window_title "播放測試" rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov (測試可用)
可以看出ffplay可以支持的協(xié)議有多種枫虏,ramp,rtmp爬虱,http等等都支持隶债。
顯示如下窗口內(nèi)容
可以看到播放器播放的窗口標題已經(jīng)顯示為自定義設置的內(nèi)容啦。
基本參數(shù)介紹完畢跑筝,下面進一步介紹ffplay的高級參數(shù)死讹。
2)ffplay高級參數(shù)
使用ffplay --help展示的幫助信息,其中的Main options部分我們上面已經(jīng)介紹過了曲梗。下面介紹Advanced options的部分赞警。
Advanced options:
-cpuflags flags force specific cpu flags
-cpucount count force specific cpu count
-hide_banner hide_banner do not show program banner
-ast stream_specifier select desired audio stream
-vst stream_specifier select desired video stream
-sst stream_specifier select desired subtitle stream
-pix_fmt format set pixel format
-stats show status
-fast non spec compliant optimizations
-genpts generate pts
-drp let decoder reorder pts 0=off 1=on -1=auto
-lowres
-sync type set audio-video sync. type (type=audio/video/ext)
-autoexit exit at the end
-exitonkeydown exit on key down
-exitonmousedown exit on mouse down
-loop loop count set number of times the playback shall be looped
-framedrop drop frames when cpu is too slow
-infbuf don't limit the input buffer size (useful with realtime streams)
-left x pos set the x position for the left of the window
-top y pos set the y position for the top of the window
-vf filter_graph set video filters
-rdftspeed msecs rdft speed
-default generic catch all option
-acodec decoder_name force audio decoder
-scodec decoder_name force subtitle decoder
-vcodec decoder_name force video decoder
-find_stream_info read and decode the streams to fill missing information with heuristics
-filter_threads number of filter threads per graph
下面就其中的部分詳細說明一下
參數(shù) | 說明 |
---|---|
ast | 設置將要播放的音頻流 |
vst | 設置將要播放的視頻流 |
sst | 設置將要播放的字幕流 |
stats | 輸出多媒體播放狀態(tài) |
fast | 非標準化規(guī)范的多媒體兼容優(yōu)化 |
sync | 音視頻同步設置可根據(jù)音頻時間、視頻時間或者外部擴展時間進行參考 |
autoexit | 多媒體播放完畢之后自動退出ffplay,ffplay默認完畢之后不退出播放器 |
exitonkeydown | 當有按鈕按下事件產(chǎn)生時退出ffplay |
exitonmousedown | 當有鼠標按下事件產(chǎn)生時退出ffplay |
loop | 設置多媒體文件循環(huán)播放的次數(shù) |
framedrop | 當cpu資源占用過高時虏两,自動丟幀 |
infbuf | 設置無極限的播放器buffer仅颇,這個選項常見于實時流媒體播放場景 |
vf | 視頻濾鏡設置 |
acodec | 強制使用設置的音頻解碼器 |
vcodec | 強制使用設置的視頻解碼器 |
scodec | 強制使用設置的字幕解碼器 |
下面將這些參數(shù)與前面介紹過的一些參數(shù)進行組合,舉幾個例子碘举。
1??從10秒播放一個視頻,播放時長為5秒搁廓,播放完畢后自動退出ffplay引颈,播放器的窗口標題為“Hello World”,為了確認播放時長正確境蜕,可以通過系統(tǒng)命令time查看命令運行時長:
time ffplay -window_title "Hello World" -ss 10 -t 5 -autoexit 1.mp4
可以看到輸出結果如下:
ffplay -window_title "Hello World" -ss 10 -t 5 -autoexit 1.mp4 0.94s user 0.52s system 22% cpu 6.502 total
2??如果強制使用H.264解碼器解碼MPEG4的視頻蝙场,將會報錯
ffplay -vcodec h264 1.mp4
我們這個視頻是h264編碼,所以可以正常播放粱年。
查看視頻編碼可以使用
ffprobe test.rmvb //這是一個RV40編碼格式的視頻
查看ffmpeg支持的解碼格式
ffmpeg -decoders
下面這個方式解碼就會報錯
ffplay -vcodec rv40 1.mp4
前面舉過的例子中售滤,我們看到的比較多的是單節(jié)目的流,多節(jié)目的流,常用于廣電行業(yè)的視頻完箩。當視頻中出現(xiàn)多個Program時赐俗,播放Program與常規(guī)的播放方式有所不同,需要指定對應的流弊知,可以通過vst阻逮,ast,sst參數(shù)來指定秩彤,例如希望播放Program 13中的音視頻流叔扼,視頻編號為4,音頻編號為5漫雷,則可以通過如下命令進行制定:
replay -vst 4 -ast 5 demo.ts
有條件的朋友可以自己找視頻來查看瓜富。
3??如果使用ffplay播放視頻時希望加載字幕文件,則可以通過加載ASS或者SRT字幕文件來解決降盹,下面列舉一個加載SRT字幕的例子与柑,首先編輯SRT字幕文件,內(nèi)容如下:
1
00:00:01.000 --> 00:00:05.000
這是我 我是誰
2
00:00:05.001 --> 00:00:10.000
我愛中國
3
00:00:10.001 --> 00:00:15.000
為人民服務
4
00:00:18.001 --> 00:00:20.000
疫情早日結束澎现,國泰民安仅胞!
然后通過filter將字幕文件加載到播放數(shù)據(jù)中,使用命令如下:
ffplay -window_title "我愛祖國" -vf "subtitles = zimu.srt" 1.mp4
播放的效果如下:
可以看出剑辫,視頻中已經(jīng)將SRT格式的文字字幕加入到視頻中并展現(xiàn)了出來干旧。
2)ffplay的數(shù)據(jù)可視化分析應用
使用ffplay除了可以播放視頻流媒體文件之外,還可以作為可視化的視頻流媒體分析工具妹蔽,例如播放音頻文件時椎眯,如果不確定文件的聲音是否正常,則可以直接使用ffplay播放音頻文件胳岂,播放的時候其將會把解碼后的音頻數(shù)據(jù)以音頻波形的形式顯示出來编整,
ffplay -showmode 1 1.mp3
命令行執(zhí)行后的效果如下:
從圖中可以看到,音頻播放時的波形可以通過振幅顯示出來乳丰,可以用來查看音頻的播放情況掌测。
當播放視頻時想要體驗解碼器是如何解碼每個宏塊的,可以使用如下命令
ffplay -debug mb_type -window_title "show vis_mb_type" -ss 5 -t 5 -autoexit test.mp4
新版FFmpeg此方法已經(jīng)不再支持啦产园,可參考
https://trac.ffmpeg.org/wiki/Debug/MacroblocksAndMotionVectors
我們可以使用ffmpeg或者ffplay來分析視頻文件中的運動向量汞斧。ffmpeg的早期版本(2017年10月之前)也允許分析宏塊,但此選項已被刪除什燕。
'codecview'過濾器可用于將運動向量顯示為每個宏塊的小箭頭粘勒。它采用一個叫mv的選項,它指定了要繪制的運動向量的類型:
參數(shù) | 說明 |
---|---|
pf | P幀前向預測運動向量 |
bf | B幀前向預測運動向量 |
bb | B幀后向預測運動向量 |
你可以使用如下的命令
ffplay -flags2 +export_mvs input.mp4 -vf codecview=mv=pf+bf+bb
ffmpeg -flags2 +export_mvs -i input.mp4 -vf codecview=mv=pf+bf+bb output.mp4
第一條命令是直接用ffplay顯示視頻屎即。
第二條命令是把生成的帶有運動向量的視頻保存到output.mp4中庙睡。
顯示效果如下:
注意事項:
早期版本的 ffmpeg 沒有此過濾器事富,但支持現(xiàn)已棄用的 -vismv 選項。
此選項不適用于不導出運動矢量的編解碼器(大多數(shù)非基于 MPEG 的編解碼器)