⑴ FFmpeg命令行使用
FFmpeg的命令非常多,經常看著會雲里霧里的,個人認為沒必要去硬背,只要打開Terminal,輸入 ffmpeg -help 命令,這條命令會告述你FFmpeg支持的大部分常用命令以及使用方式。查看這些輸出的信息,基本上就會使用很多常用的命塌雀令了。
你會發現執行 ffmpeg -help 會輸出一大坨,那都是些啥玩意呢,不著急,咱們一步一步來慢慢品嘗。
第一個就是輸出我們安裝的FFmpeg的版本號
--prefix 是指FFmpeg的安裝路徑
--enable 是你安裝的FFmpeg支持的三方庫 這里可以看出支持 libx264 、 libx265 的編碼,以及支持 videotoolbox , videotoolbox 是Mac、iOS上的一個系統自帶硬編解碼庫,FFmpeg也給予了支持,非常的給力。
這是輸出FFmpeg裡麵包含的庫,這些都是獨立的,是可以單獨拎出來使用的,你如果只要編解碼,那你就只要在項目中導入 libavcodec 即可
這是告訴我們命令行使用格式
[options] 這個是全局參數
[infile options] 這個是輸入文件的參數
infile 這個是輸入文件的路徑
[outfile options] 這個是輸出文件的參數
outfile 這個是輸出文件的路徑
細心的你肯定發現 infile 、 outfile 的後面有個 ... ,這是在告訴我們輸入、輸出文件可以分別有一個或者多個。
比如執行 ffmpeg -i test.h264 -i test.aac -c test.mp4
這條命令會把一個h264文件和一個aac的音頻文件合並並輸出一個mp4格式的文件,這其中就團旦早有兩個輸入文件、一個輸出文件。
這些是詳細的幫助信息
-h long 列印更多的選項參數。
-h full 列印所有的選項參數,包括所有針對於 format 和 codec 的選項,信息特別的長。
man ffmpeg : 查看FFmpeg的幫助手冊。
-h type=name 列印指定名稱的 decoder/encoder/demuxer/muxer/filter 的所有選項信息。
比如你要查詢 scale 濾鏡的使用方式,我們就執行 ffmpeg -h filter=scale
輸出如下:
這就告訴我們 scale 濾鏡有 w 、 h 等參數,我們就這樣使用 scale 濾鏡,
ffmpeg -i input.mp4 -filter_complex "scale=w=iw/2h=ih/2" output.mp4
其中 iw 代表輸入視頻的寬, ih 代表輸入視頻的高,這條命令就把輸入的視頻縮小一倍,這里你可能會有疑問,我都不記得那些濾鏡的名字,就無法使用這個去查了,哈哈不要急,還記得上面的幫助命令嗎, ffmpeg -filters 可以輸出所有的濾鏡名字了,如果你覺的輸出太多,你不好找的話,你只要記得這個濾鏡大概是叫什麼名字、包含什麼字母,你就藉助 grep 指令去輸出裡面搜索關鍵字,這樣就只會輸出你關心的濾鏡名了,如 ffmpeg -filters | grep over
以上是幫助命令,如果你忘記了某個編譯器、像素格式或者濾鏡的名字,你就可以用這些命令去查看。
以上就是全局參數
以上是音視頻的公共參數
以上是視頻處理相關參數
以上是音頻處理相關
以上字幕處理相關參數
以上就是遲洞 ffmpeg -help 的輸出說明了,下面咱們來看看常用的命令。
-r 10 表示1秒視頻會生成10張圖片
-f avfoundation 指定採用avfoundation採集數據使用
-i 1:0 表示 指定視頻設備索引為1,指定錄音設備索引為0。
使用 ffmpeg -list_devices 1 -f avfoundation -i '' 可以列印出設備列表,如下:
因此上述命令中的 -i 1:0 表示採用【Capture screen 0】【Built-in Microphone】即採用屏幕和系統自帶的麥克風進行採集。
⑵ 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〃
文/騷之哈塞給(作者)
⑶ linux 下怎麼檢測ffmpeg版本
你沒說是系統系統版本的,不同版本之前命令也是不同的。給你紅帽系統,也可以用作Centos查看的命令:命令 作用
yum repolist all 列出所有倉庫。
yum list all 列出倉庫中所有軟體包
yum info 軟體包名稱 查看軟體包信息
yum install 軟體包名稱 安裝軟體包
yum reinstall 軟體包名稱 重新安裝軟體包
yum update 軟體包名稱 升級軟體包
yum remove 軟體包 移除軟體包
yum clean all 清除所有倉庫緩存
yum check-update 檢查可更新的軟體包
yum grouplist 查看系統中已經安裝的軟體包組
yum groupinstall 軟體包組 安裝指定的軟體包組
yum groupremove軟體包組 移除指定的軟體包組
yum groupinfo 軟體包組 查詢指定的軟體包組信息
⑷ 怎麼查看ffmpeg源碼版本號
桌面上右鍵「打開終端」。 也可以使用ctrl+alt+t就可以打開終端窗口。啟基 在裡面輸入查看版本的命令。 $ffmpeg -version 回車執行命令,我們沖旁尺會發現第一行就是ffmpeg的版本。 如果在windows系統下,我們可以WIN+R打開左散高下角的運行窗口,在裡面輸入cmd...
⑸ ffmpeg 硬體解碼手冊
https://trac.ffmpeg.org/wiki/HWAccelIntro
如何查看硬體加速器
找ffmpeg3.2版本執行ffmpeg -hwaccels
qsv可以解碼的類型有h264,h264/hevc,mpeg2,vc1
qsv解碼裡面已經自帶了h264_mp4toannexb的碼流轉化器,需要先將mp4中的h264碼率轉換成annexb格式,再進行解碼
如果對於非mp4文件中的碼流,則繞過了纖春碼流轉化器。
用qsv編碼:
ffmpeg -i INPUT -c:v h264_qsv -preset:v faster out.qsv.mp4
用qsv解碼
ffmpeg -hwaccel qsv -i INPUT -f null - -benchmark
linux下如何安裝intel media sdk
http://blog.csdn.net/nonmarking/article/details/46391767
intel media sdk 2016 [支持intel 酷扮豎手睿 4,5代cpu]
intel media sdk 2016 [支持intel 酷睿 6代cpu]
硬體編碼測試實驗
ffmpeg -threads 64 -stream_loop -1 -s 1920x1080 -i out.yuv -c:v h264_qsv -f null out.264
在centos[i6700k] 能編碼140fps 【cpu:20%,gpu:63%]
在win7[hd4600,i5,4核心] 能編碼85fps 【cpu:65,gpu:52%]
nvenc decoder and encoder
./ffmpeg -c:v h264_cuvid -i out.mp4 /tmp/out.yuv
./廳嫌ffmpeg -threads 16 -f lavfi -i testsrc=size=1920x1080 -c:v h264_nvenc out.mp4
如何測試並發編碼
⑹ Mac M1晶元安裝ffmpeg 以及使用
1 首先要安裝brew
2 git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
3 cd ffmpeg
4 執行腳本 ./configure --prefix=/opt/local
5 編譯 make
6 安裝 make install
7 安裝成功,查看 ffmpeg版本 /opt/local/bin/ffmpeg -version
這樣已經安裝成功。
8 open /opt/缺銀敗local/bin/ 在此文件下,有2個關於ffmpeg的可執行文件
9 例子:查詢某音頻文件詳細信息
剛開始使用會出現 zsh: command not found:的提示。伏顫可能是cmd使用錯誤。
其實是使用錯誤了。搏念
./ffprobe -show_format (更多關於ffprobe、ffmpeg 的使用請自行網路,這里不多說)
⑺ 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中。
顯示效果如下: