FFmpeg工具

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ù)及說明躲查。


image.png

這些都是通用的封裝、解封裝操作時使用的參數(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ù)。


image.png

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)碼的主要原理如圖


02c2035d611b45ffb0ff1fa9d104e600.png

通過之前介紹的參數(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打開表格形式

img.jpg

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)容

image.png

可以看到播放器播放的窗口標題已經(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

播放的效果如下:


image.png

可以看出剑辫,視頻中已經(jīng)將SRT格式的文字字幕加入到視頻中并展現(xiàn)了出來干旧。
2)ffplay的數(shù)據(jù)可視化分析應用
使用ffplay除了可以播放視頻流媒體文件之外,還可以作為可視化的視頻流媒體分析工具妹蔽,例如播放音頻文件時椎眯,如果不確定文件的聲音是否正常,則可以直接使用ffplay播放音頻文件胳岂,播放的時候其將會把解碼后的音頻數(shù)據(jù)以音頻波形的形式顯示出來编整,

ffplay -showmode 1 1.mp3

命令行執(zhí)行后的效果如下:


企業(yè)微信截圖_8d1f0d92-71ae-4cc7-9782-8c5e4da7be6e.png

從圖中可以看到,音頻播放時的波形可以通過振幅顯示出來乳丰,可以用來查看音頻的播放情況掌测。
當播放視頻時想要體驗解碼器是如何解碼每個宏塊的,可以使用如下命令

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中庙睡。
顯示效果如下:

image.png

注意事項:
早期版本的 ffmpeg 沒有此過濾器事富,但支持現(xiàn)已棄用的 -vismv 選項。
此選項不適用于不導出運動矢量的編解碼器(大多數(shù)非基于 MPEG 的編解碼器)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乘陪,一起剝皮案震驚了整個濱河市统台,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暂刘,老刑警劉巖饺谬,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谣拣,居然都是意外死亡募寨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門森缠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拔鹰,“玉大人,你說我怎么就攤上這事贵涵×兄” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵宾茂,是天一觀的道長瓷马。 經(jīng)常有香客問我,道長跨晴,這世上最難降的妖魔是什么欧聘? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮端盆,結果婚禮上怀骤,老公的妹妹穿的比我還像新娘。我一直安慰自己焕妙,他們只是感情好蒋伦,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焚鹊,像睡著了一般痕届。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上末患,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天爷抓,我揣著相機與錄音,去河邊找鬼阻塑。 笑死,一個胖子當著我的面吹牛果复,可吹牛的內(nèi)容都是我干的陈莽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼走搁!你這毒婦竟也來了独柑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤私植,失蹤者是張志新(化名)和其女友劉穎忌栅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曲稼,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡索绪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了贫悄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瑞驱。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖窄坦,靈堂內(nèi)的尸體忽然破棺而出唤反,到底是詐尸還是另有隱情,我是刑警寧澤鸭津,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布彤侍,位于F島的核電站,受9級特大地震影響逆趋,放射性物質(zhì)發(fā)生泄漏盏阶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一父泳、第九天 我趴在偏房一處隱蔽的房頂上張望般哼。 院中可真熱鬧,春花似錦惠窄、人聲如沸蒸眠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽楞卡。三九已至,卻和暖如春脾歇,著一層夾襖步出監(jiān)牢的瞬間蒋腮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工藕各, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留池摧,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓激况,卻偏偏與公主長得像作彤,于是被迫代替她去往敵國和親膘魄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容