A. ffmpeg轉碼及日誌輸出相關命令
1.轉碼
ffmpeg -re -i <source_url> -acodec aac -b:a 64k -vcodec h264 -b:v 1024k -loglevel level+verbose -hide_banner -level 31 -vprofile baseline -g 20 -r 20 -vsync 2 -strict -2 -f flv <target_url>
更多命令參考:
ffmpeg推送保存rtmp流命令
2.日誌重定向到文件
在命令輸完以後加入 > logfilename 2>&1 即可保存到自己指定的logfilename中
3.日誌中加入自定義標識
要關注的av_log中加入自己的標識,之後用這個標識過濾就行
B. Android NDK開發之旅38--FFmpeg視頻添加水印
Android NDK開發之旅 目錄
Android也是利用FFmpeg命令行的形式(混編),進行視頻轉碼壓縮。
水印位置參數的第一個數值是水印圖片的左上角的x軸像素值,第二個數值是水印圖片的左上角的y軸像素值。
水印位置參數除了使用數值外,還可以使用以下幾個參數:
對應地可以將overlay參數設置成如下值來改變水印圖片的位置:
所以質量會下降,在參數中添加設置 如:-b 1024k 會提高視頻質量
C. FFMPEG進階系列03-ffmpeg轉碼專題(中)x264參數詳解
更多音視頻知識請點擊 : 專注音視頻開發
x264編碼參數簡介
x264.exe --fullhelp 列印
用於簡化命令行而設計的系統。各預設模板所對應的參數設定,詳見幫助:x264.exe --fullhelp.
21. frame-packing
默認: 20
根據給定的半徑對量化曲線進行高斯模糊(gaussian blur)。分配給各幀的量化值在時間方向上與相鄰幾幀相模糊,以限制量化值波動。
當mb-tree開啟時,cplxblur無效。
參見: --qcomp, --qblur, --no-mbtree
手動忽略標准碼率控制。選擇一個文件,強制指定某些幀的量化值和幀類型。格式為「幀號 幀類型 量化值」。例子:
也叫--subme
默認: 未設定
這些選項在輸出流中設定標志,可以被解碼工具讀取並做相應處理。值得注意的是,大多數選項在大多數情境下都是無意義 的,所以通常都被解碼軟體所忽略。
參見: Gamma Correction
推薦值: 默認,除非你知道源用的是哪種
'auto'會自動根據輸出文件的文件名來挑選。
D. 我想用ffmpeg命令行轉換一個視頻文件,視、音頻編碼格式不變,只是將畫面旋轉90度,請問命令行該如何寫
在你的轉碼命令裡面添加上-vf rotate=PI/2或者-vf rotate=3*PI/2,例如
ffmpeg -i E:\ffmpeg\test.mp4 -y -vf rotate=PI/2 E:\ffmpeg\dest1.mp4
E. FFmpeg功能命令匯總
前言
如此強大的FFmpeg,能夠實現視頻採集、視頻格式轉化、視頻截圖、視頻添加水印、視頻切片、視頻錄制、視頻推流、更改音視頻參數功能等。通過終端命令如何實現這些功能,Richy在本文做一記錄,以備之後查閱。
注意:下面一一列舉的命令,未歸類整理,命令參數供參考。
如果參數有誤,大家可對照文章- FFmpeg參數命令 ,進行修改。
第一組
1.分離視頻音頻流
ffmpeg -i input_file -vcodec -an output_file_video//分離視頻流ffmpeg -i input_file -acodec -vn output_file_audio//分離音頻流
2.視頻解復用
ffmpeg –i test.mp4 –vcodec –an –f m4v test.264
ffmpeg –i test.avi –vcodec –an –f m4v test.264
3.視頻轉碼
ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264
//轉碼為碼流原始文件
ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264 //轉碼為碼流原始文件
ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //轉碼為封裝文件
說明: -bf B幀數目控制,-g 關鍵幀間隔控制,-s 解析度控制
4.視頻封裝
ffmpeg –i video_file –i audio_file –vcodec –acodec output_file
5.視頻剪切
ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg //提取圖片
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec -acodec output.avi //剪切視頻//-r 提取圖像的頻率,-ss 開始時間,-t 持續時間
6.視頻錄制
ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec out.avi
7、利用ffmpeg視頻切片
主要把視頻源切成若干個.ts格式的視頻片段然後生成一個.m3u8的切片文件索引提供給html5的video做hls直播源
命令如下:
ffmpeg -i 視頻源地址 -strict -2 -c:v libx264 -c:a aac -f hls m3u8文件輸出地址
8、ffmpeg縮放視頻
假設原始視頻尺寸是 1080p(即 1920×1080 px,16:9),使用下面命令可以縮小到 480p:
命令如下:
ffmpeg -i 視頻源地址 -vf scale=853:480 -acodec aac -vcodec h264 視頻輸出地址(如:out.mp4)
各個參數的含義:-i a.mov 指定待處理視頻的文件名-vf scale=853:480 vf 參數用於指定視頻濾鏡,其中 scale 表示縮放,後面的數字表示縮放至 853×480 px,其中的 853px 是計算而得,因為原始視頻的寬高比為 16:9,所以為了讓目標視頻的高度為 480px,則寬度 = 480 x 9 / 16 = 853-acodec aac 指定音頻使用 aac 編碼。註:因為 ffmpeg 的內置 aac 編碼目前(寫這篇文章時)還是試驗階段,故會提示添加參數 「-strict -2」 才能繼續,盡管添加即可。又或者使用外部的 libfaac(需要重新編譯 ffmpeg)。-vcodec h264 指定視頻使用 h264 編碼。註:目前手機一般視頻拍攝的格式(封裝格式、文件格式)為 mov 或者 mp4,這兩者的音頻編碼都是 aac,視頻都是 h264。out.mp4 指定輸出文件名上面的參數 scale=853:480 當中的寬度和高度實際應用場景中通常只需指定一個,比如指定高度為 480 或者 720,至於寬度則可以傳入 「-1」 表示由原始視頻的寬高比自動計算而得。即參數可以寫為:scale=-1:480,當然也可以 scale=480:-1
9、ffmpeg裁剪
有時可能只需要視頻的正中一塊,而兩頭的內容不需要,這時可以對視頻進行裁剪(crop),比如有一個豎向的視頻 1080 x 1920,如果指向保留中間 1080×1080 部分命令如下:ffmpeg -i 視頻源地址 -strict -2 -vf crop=1080:1080:0:420 視頻輸出地址(如:out.mp4)
其中的 crop=1080:1080:0:420 才裁剪參數,具體含義是 crop=width:height:x:y,其中 width 和 height 表示裁剪後的尺寸,x:y 表示裁剪區域的左上角坐標。比如當前這個示例,我們只需要保留豎向視頻的中間部分,所以 x 不用偏移,故傳入0,而 y 則需要向下偏移:(1920 – 1080) / 2 = 420
10. 轉視頻格式
ffmpeng -i source.mp4 -c:v libx264 -crf 24 destination.flv
其中 -crf 很重要,是控制轉碼後視頻的質量,質量越高,文件也就越大。
此值的范圍是 0 到 51:0 表示高清無損;23 是默認值(如果沒有指定此參數);51 雖然文件最小,但效果是最差的。
值越小,質量越高,但文件也越大,建議的值范圍是 18 到 28。而值 18 是視覺上看起來無損或接近無損的,當然不代表是數據(技術上)的轉碼無損。
第二組
1.ffmpeg 把文件當做直播推送至伺服器 (RTMP + FLV)
ffmpeg - re -i demo.mp4 -c - f flv rtmp://w.gslb.letv/live/streamid
2.將直播的媒體保存到本地
ffmpeg -i rtmp://r.glsb.letv/live/streamid -c streamfile.flv
3.將一個直播流,視頻改用h264壓縮,音頻改用faac壓縮,送至另一個直播伺服器
ffmpeg -i rtmp://r.glsb.letv/live/streamidA -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://w.glsb.letv/live/streamb
4.提取視頻中的音頻,並保存為mp3 然後輸出
ffmpeg -i input.avi -b:a 128k output.mp3
第三組
1.獲取視頻的信息
ffmpeg -i video.avi
2.將圖片序列合成視頻
ffmpeg -f image2 -i image%d.jpg video.mpg
上面的命令會把當前目錄下的圖片(名字如:image1.jpg. image2.jpg. 等...)合並成video.mpg
3.將視頻分解成圖片序列
ffmpeg -i video.mpg image%d.jpg
上面的命令會生成image1.jpg. image2.jpg. ...
支持的圖片格式有:PGM. PPM. PAM. PGMYUV. JPEG. GIF. PNG. TIFF. SGI
4.為視頻重新編碼以適合在iPod/iPhone上播放
ffmpeg -i source_video.avi input -acodec aac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x180 -title X final_video.mp4
5.為視頻重新編碼以適合在PSP上播放
ffmpeg -i source_video.avi -b 300 -s 320x240 -vcodec xvid -ab 32 -ar 24000 -acodec aac final_video.mp4
6.從視頻抽出聲音.並存為Mp3
ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3
7.將wav文件轉成Mp3
ffmpeg -i son_origine.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 son_final.mp3
8.將.avi視頻轉成.mpg
ffmpeg -i video_origine.avi video_finale.mpg
9.將.mpg轉成.avi
ffmpeg -i video_origine.mpg video_finale.avi
10.將.avi轉成gif動畫(未壓縮)
ffmpeg -i video_origine.avi gif_anime.gif
11.合成視頻和音頻
ffmpeg -i son.wav -i video_origine.avi video_finale.mpg
12.將.avi轉成.flv
ffmpeg -i video_origine.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv video_finale.flv
13.將.avi轉成dv
ffmpeg -i video_origine.avi -s pal -r pal -aspect 4:3 -ar 48000 -ac 2 video_finale.dv
或者:
ffmpeg -i video_origine.avi -target pal-dv video_finale.dv
14.將.avi壓縮成divx
ffmpeg -i video_origine.avi -s 320x240 -vcodec msmpeg4v2 video_finale.avi
15.將Ogg Theora壓縮成Mpeg dvd
ffmpeg -i film_sortie_cinelerra.ogm -s 720x576 -vcodec mpeg2video -acodec mp3 film_terminate.mpg
16.將.avi壓縮成SVCD mpeg2
NTSC格式:
ffmpeg -i video_origine.avi -target ntsc-svcd video_finale.mpg
PAL格式:
ffmpeg -i video_origine.avi -target pal-dvcd video_finale.mpg
17.將.avi壓縮成VCD mpeg2
NTSC格式:
ffmpeg -i video_origine.avi -target ntsc-vcd video_finale.mpg
PAL格式:
ffmpeg -i video_origine.avi -target pal-vcd video_finale.mpg
18.多通道編碼
ffmpeg -i fichierentree -pass 2 -passlogfile ffmpeg2pass fichiersortie-2
19.從flv提取mp3
ffmpeg -i source.flv -ab 128k dest.mp3
第四組
1、將文件當做直播送至live
ffmpeg -re -i localFile.mp4 -c -f flv rtmp://server/live/streamName
2、將直播媒體保存至本地文件
ffmpeg -i rtmp://server/live/streamName -c mp.flv
3、將其中一個直播流,視頻改用h264壓縮,音頻不變,送至另外一個直播服務流
ffmpeg -i rtmp://server/live/originalStream -c:a -c:v libx264 -vpre slow -f flv rtmp://server/live/h264Stream
4、將其中一個直播流,視頻改用h264壓縮,音頻改用faac壓縮,送至另外一個直播服務流
ffmpeg -i rtmp://server/live/originalStream -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://server/live/h264Stream
5、將其中一個直播流,視頻不變,音頻改用faac壓縮,送至另外一個直播服務流
ffmpeg -i rtmp://server/live/originalStream -acodec libfaac -ar 44100 -ab 48k -vcodec -f flv rtmp://server/live/h264_AAC_Stream
6、將一個高清流,復制為幾個不同視頻清晰度的流重新發布,其中音頻不變
ffmpeg -re -i rtmp://server/live/high_FMLE_stream -acodec -vcodec x264lib -s 640×360 -b 500k -vpre medium -vpre baseline rtmp://server/live/baseline_500k -acodec -vcodec x264lib -s 480×272 -b 300k -vpre medium -vpre baseline rtmp://server/live/baseline_300k -acodec -vcodec x264lib -s 320×200 -b 150k -vpre medium -vpre baseline rtmp://server/live/baseline_150k -acodec libfaac -vn -ab 48k rtmp://server/live/audio_only_AAC_48k
7、功能一樣,只是採用-x264opts選項
ffmpeg -re -i rtmp://server/live/high_FMLE_stream -c:a -c:v x264lib -s 640×360 -x264opts bitrate=500:profile=baseline:preset=slow rtmp://server/live/baseline_500k -c:a -c:v x264lib -s 480×272 -x264opts bitrate=300:profile=baseline:preset=slow rtmp://server/live/baseline_300k -c:a -c:v x264lib -s 320×200 -x264opts bitrate=150:profile=baseline:preset=slow rtmp://server/live/baseline_150k -c:a libfaac -vn -b:a 48k rtmp://server/live/audio_only_AAC_48k
8、將當前攝像頭及音頻通過DSSHOW採集,視頻h264、音頻faac壓縮後發布
ffmpeg -r 25 -f dshow -s 640×480 -i video=」video source name」:audio=」audio source name」 -vcodec libx264 -b 600k -vpre slow -acodec libfaac -ab 128k -f flv rtmp://server/application/stream_name
9、將一個JPG圖片經過h264壓縮循環輸出為mp4視頻
ffmpeg.exe -i INPUT.jpg -an -vcodec libx264 -coder 1 -flags +loop -cmp +chroma -subq 10 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -flags2 +dct8x8 -trellis 2 -partitions +parti8x8+parti4x4 -crf 24 -threads 0 -r 25 -g 25 -y OUTPUT.mp4
10、將普通流視頻改用h264壓縮,音頻不變,送至高清流服務(新版本FMS live=1)
ffmpeg -i rtmp://server/live/originalStream -c:a -c:v libx264 -vpre slow -f flv 「rtmp://server/live/h264Stream live=1〃
文/騷之哈塞給(作者)
F. FFmpeg工具
ffmpeg在做音視頻編解碼時非常方便,所以很多場景下轉碼使用的是ffmpeg,通過ffmpeg –-help可以看到ffmpeg常見的命令大概分為六部分:
命令格式如下:
下面羅列一些ffmpeg常用的信息查詢命令:
1、查詢版本信息
2、ffmpeg查詢是否支持對應的視頻文件格式
使用ffmpeg轉嗎,有時候可能會遇到無法解析的視頻文件或者無法生成視頻文件,報錯提示不支持生成對應的視頻文件,這時候就需要查看當前使用的ffmpeg是否支持對應的視頻文件格式,需要使用ffmpeg -formats參數來查看:
根據上面輸出的信息可以看到,輸出的內容分為3個部分,具體如下。
輸出信息中包含了三部分內容,具體如下。
輸出信息的內容分為四列,具體如下。
從輸出的幫助信息中可以看到,FLV的muxer的信息包含兩大部分,具體如下。
從輸出的幫助信息可以看到,FLV的demuxer的信息包含兩大部分:
從幫助信息可以看到,H.264(AVC)的編碼參數包含兩大部分,具體如下。
從幫助信息可以看到,H.264(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=24.733333
dts=379904
dts_time=24.733333
ration=512
ration_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..
略過一大段數據
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]
從輸出的內容中可以看到多媒體包中包含的數據,那麼我們可以根據上述輸出內容中的pos,也就是文件偏移位置來查看,pos的值為3272564,將其轉換為十六進制位置為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開始的數據和上面一致:0000 07d6 419a cc21 3ffa 5800。
通過ffprobe讀取packets來進行對應的數據分析,使用show_packets與show_data配合可以進行更加精確的分析。
3)除了packets與data之外,ffprobe還可以分析多媒體的封裝格式,其使用FORMAT標簽括起來顯示:
[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
ration=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]
下面是對輸出信息關鍵欄位的說明:
4)使用下面的命令可以查看視頻文件的幀信息,輸出的幀信息將使用FRAME標簽括起來:
[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_ration=512
pkt_ration_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參數可以查看每一幀的信息,下面就來介紹一下其中重要的信息,
在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=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
ration_ts=388608
ration=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:b=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="1.0" encoding="UTF-8"?>
<ffprobe>
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from Ƈ.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: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="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" ration_ts="388608" ration="25.300000" bit_rate="964695" bits_per_raw_sample="8" nb_frames="759" extradata_size="39">
<disposition default="1" b="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" ration_ts="1133511" ration="25.703197" bit_rate="72863" nb_frames="1107" extradata_size="2">
<disposition default="1" b="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 ration play "ration" 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,http等等都支持。
顯示如下窗口內容
下面將這些參數與前面介紹過的一些參數進行組合,舉幾個例子。
1⃣️從10秒播放一個視頻,播放時長為5秒,播放完畢後自動退出ffplay,播放器的窗口標題為「Hello World」,為了確認播放時長正確,可以通過系統命令time查看命令運行時長:
可以看到輸出結果如下:
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的視頻,將會報錯
我們這個視頻是h264編碼,所以可以正常播放。
查看視頻編碼可以使用
查看ffmpeg支持的解碼格式
下面這個方式解碼就會報錯
前面舉過的例子中,我們看到的比較多的是單節目的流,多節目的流,常用於廣電行業的視頻。當視頻中出現多個Program時,播放Program與常規的播放方式有所不同,需要指定對應的流,可以通過vst,ast,sst參數來指定,例如希望播放Program 13中的音視頻流,視頻編號為4,音頻編號為5,則可以通過如下命令進行制定:
有條件的朋友可以自己找視頻來查看。
3⃣️如果使用ffplay播放視頻時希望載入字幕文件,則可以通過載入ASS或者SRT字幕文件來解決,下面列舉一個載入SRT字幕的例子,首先編輯SRT字幕文件,內容如下:
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將字幕文件載入到播放數據中,使用命令如下:
播放的效果如下:
可以看出,視頻中已經將SRT格式的文字字幕加入到視頻中並展現了出來。
2)ffplay的數據可視化分析應用
使用ffplay除了可以播放視頻流媒體文件之外,還可以作為可視化的視頻流媒體分析工具,例如播放音頻文件時,如果不確定文件的聲音是否正常,則可以直接使用ffplay播放音頻文件,播放的時候其將會把解碼後的音頻數據以音頻波形的形式顯示出來,
命令行執行後的效果如下:
從圖中可以看到,音頻播放時的波形可以通過振幅顯示出來,可以用來查看音頻的播放情況。
當播放視頻時想要體驗解碼器是如何解碼每個宏塊的,可以使用如下命令
新版FFmpeg此方法已經不再支持啦,可參考
https://trac.ffmpeg.org/wiki/Debug/MacroblocksAndMotionVectors
我們可以使用ffmpeg或者ffplay來分析視頻文件中的運動向量。ffmpeg的早期版本(2017年10月之前)也允許分析宏塊,但此選項已被刪除。
'codecview'過濾器可用於將運動向量顯示為每個宏塊的小箭頭。它採用一個叫mv的選項,它指定了要繪制的運動向量的類型:
你可以使用如下的命令
第一條命令是直接用ffplay顯示視頻。
第二條命令是把生成的帶有運動向量的視頻保存到output.mp4中。
顯示效果如下: