ffmpeg介紹及其常用指令說明
FFmpeg是一套視頻處理和存儲等的技術方案,關鍵詞——“開源”、“免費”,“最主流的視頻處理技術方案”,“各大廠商基本上都用”,“支持大部分系統(tǒng)”,“支持大部分的視頻格式(插件方式)”。下面將分幾部分介紹各方面都很強大的ffmpeg。
1.ffmpeg系列框架
1)官網:https://ffmpeg.org
2)定義(來自官網的權威解釋)
3)工具
主要包含ffmpeg命令行工具(支持多種操作系統(tǒng))
主要下載鏈接:https://ffmpeg.org/download.html
Windows鏈接:https://ffmpeg.zeranoe.com/builds/
macOS鏈接:https://evermeet.cx/ffmpeg/
Linux鏈接:wget http://ffmpeg.org/releases/ffmpeg***.tar.bz2(其他版本另說)
播放器:ffplay,這款也是相當神奇,后面將和另外一款強大的播放器vlc統(tǒng)一介紹。
視頻分析:ffprobe,這款之前用得不多,但是一開始用,感覺好用到不行,也是強烈推薦。
4)各種庫,libavutil?、libavcodec?等等。官網都有詳細說明...
5)源碼,那更不用說了吧...
2.ffmpeg命令行基本概念
官網指令詳述鏈接:https://ffmpeg.org/ffmpeg.html
1)每個轉碼都可以描述為如下的過程:
視頻源經過分流器,解碼器,編碼器,混流器,最終輸出為處理后的視頻文件。(下圖為官網的流程圖介紹)
當然不是每個視頻處理都嚴格按照上述流程,有些可以略過。這里就要知道一些概念:
視頻中的流信息:一般包括音頻流、視頻流,它們各有自己的編解碼器,但是分流和混流器,在視頻中有多個流時,就需要用到。
流復制處理:假設音頻流或視頻流直接采用copy的方式,則不需要進行編解碼過程。常見的比如,acodec copy等。
2)指令行語法
ffmpeg [gl-opt] {[input-file-opt] -i input-url} ... {[output-file-opt] output-url} ...
3)指令行主要參數(shù)
下圖是官網的,在ffmpeg的命令行工具中,輸入-help 也能找到相似的說明。
4)ffmpeg其他參數(shù)和指令說明
萬能ffmpeg -help,或者搜索引擎
3.ffmpeg命令行實操(針對Linux環(huán)境)
1)分析視頻
這是我比較常用的方法了,簡單粗暴,可以看有沒有數(shù)據,還能解析出視頻中的一些信息。
ffmpeg -i '文件or url',比如 ffmpeg -i a.mp4
針對某個文件,輸出入下信息,從下圖中可以得到:
這個視頻是m3u8文件,解析的第一個ts文件
視頻ts的url并不是它的真實存儲位置,中間經過了跳轉,是不是抓包的時候很懵逼,明白為啥了吧
duration為N/A,猜測直播,點播一般能將視頻時長弄出來。不過現(xiàn)在沒有m3u8的點播,不然也可以對比下。
bitrate,這個一般能夠將碼率解析出來,直播m3u8貌似也是無能為力
接下來看Stream*,一般可以看到有多個,包括視頻和音頻,但是這里只有Video,說明整個文件只有視頻流,沒有音頻流。
這個視頻流中,yuv是按4:2:0,分辨率是1920*1080。
2)常用的指令
涵蓋了各方面,而且功能無比強大,基本上只有你沒有想到的,沒有它做不到的。而且你猜cdn or 存儲廠商開放出來的視頻處理的指令接口,他們是不是通過ffmpeg指令集進行操作。如果是的話,這些指令你也知道,是不是覺得自己很牛,哈哈。這里就舉一些常用&有重大用途的
視頻錄制
ffmpeg –i rtsp://192.168.3.2:5256/src –vcodec copy out.mp4
上述是將直播源的數(shù)據,輸出為out.mp4進行存儲,如果不退出,則一直存。
視頻轉碼(內容巨多)
視頻封裝
流復制
ffmpeg –i input.mp4 –vcodec copy -f ouput.mkv
當封裝格式中可以音視頻流部分通用的,則可以進行流復制。如果這里都是h264的格式,但是-vcodec copy改為 -vcodec libx264,則不是流復制,而是強制轉碼了。
非流復制
ffmpeg –i input.rmvb –vcodec libx264 -f ouput.m3u8
這里主要是因為兩者之間的視頻流兼容格式不相同。這里改封裝的時候,其實也轉碼了。
這里只簡單寫了m3u8,但是由于m3u8是分片類型的格式,也有很多控制參數(shù),比如設置分片的時間間隔。
視頻碼率轉換
ffmpeg –i input.mp4 –vcodec libx264 -acodec libfaac –s 352*278 ?-b 2000k ?-r 30 output.mp4
-vcodec?指定視頻編碼;-acodec?指定音頻編碼;-s?指定分辨率;-b?指定比特率;-r?指定幀率;封裝格式按最后的來算。
還可以包含其他的參數(shù),類型非常多,比如設置VBR,CBR的編碼模式;設置B幀個數(shù);設置GOP等
轉碼時,可以將多種因素都統(tǒng)一一起考慮和設置,也可以單獨設置某項
視頻水印
添加文字水印
ffmpeg –i input.mp4 -vf "drawtext=fontfile=simhei.ttf: text=‘川大爺’:x=12:y=12:fontsize=12:fontcolor=white:shadowy=5" output.mp4
-vf和-filter_complex其實都可以
注意,上面的操作可能執(zhí)行不成功,報“No such filter: 'drawtext'”,因為編譯時filter沒有被編譯進去,重新編譯ffmpeg加上“--enable-libfreetype”后即可。
這里fontfile:字體類型
text:要添加的文字內容
x和y是需要展示的位置
fontsize:字體大小
fontcolor:字體color
圖片水印
ffmpeg -i input.ts -i logo.png ?-filter_complex ?"overlay=20:20" output.mp4
將logo.png圖片加到視頻中形成水印,水印位置為
可以設置的類型很多,比如設置多個圖片水印
可以設置水印出現(xiàn)的時間,比如只在前60s出現(xiàn),或者每10s出現(xiàn)一次
可以設置圖片水印的移動等。
以上可以通過文檔進一步去了解。
去除水印
ffmpeg -i input.mp4 -vf delogo=x=0:y=0:w=120:h=120 output.mp4
輸入如上指令后,出現(xiàn)了如下錯誤,是因為ffmpeg在編譯過程中缺少了--delogo相關參數(shù),重新configure下就好了,
./configure --prefix=/usr/local/ffmpeg --enable-gpl ?--enable-nonfree ? ?--enable-filter=delogo --enable-debug --disable-optimizations --enable-shared ?--enable-pthreads,
之后再make clean&& make install 就可以了
視頻截取
ffmpeg -i input.mp4 -ss 00:05:00 -t 00:22:00 output.mp4
-ss:開始截取的視頻的位置(開始時間)
-t:需要截取的時長
裁剪視頻(只需要視頻的某塊區(qū)域)
ffmpeg -i input.mp4 -strict -2 -vf crop=720:720:0:360 out.mp4
crop=width:height:x:y,其中 width 和 height 表示裁剪后的尺寸(輸出大小),x:y 表示裁剪區(qū)域的左上角坐標
-strict -2 代表aac音頻編碼
視頻截圖
ffmpeg -i input.mp4 -ss 0.01 -t 0.001 -y -s 352x240 ? output.png
-ss 15.683 :將視頻指向 0.01 秒開始
-y:強制覆蓋文件(防止因為重名出錯)
-t 0.001 :持續(xù)時間
-s:截取視頻的圖片的分辨率
注意-ss和-t最好一起,否則會概率性出錯。同時需要根據視頻的時長,再去設置-ss的位置,如果-ss設置超過,也會導致截圖失敗。
生成gif
ffmpeg -i input.mp4 -ss 0:0:30 -t 10 -s 320x320 -pix_fmt rgb24 output.gif
-ss:開始時間
-t:時長
-s:輸出分辨率
-pix_fmt:指定編碼,這里用的是rgb24,想想看yuv呢,比如yuv420p
視頻合并
音視頻合并
ffmpeg -i input.mp4 -i input.aac -vcodec copy -acodec copy output.mp4
音頻流處理
提取音頻
ffmpeg -i input.mp4 -vn -y -acodec copy output.aac
-y 覆蓋輸出文件
-vn從視頻中提取音頻部分
剔除音頻(靜音)
ffmpeg -i input.mp4 -an output.mp4
視頻流處理
提取視頻
ffmpeg -i input.mp4 -vcodec copy -an ?output.mp4
-an從視頻中提取視頻部分
字幕處理
添加字幕
ffmpeg -i input.mp4 -i input.srt -vcodec copy output3.mkv
字幕格式可以有.srt , .ass 文件等
視頻倍速
音頻倍速減半
ffmpeg -i input.mp3 -af atempo=0.5 output.mp3
音頻兩倍速
ffmpeg -i input.mp3 -af atempo=2 output.mp3
視頻加速
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4
視頻倍速
ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" output.mp4
當然,上面的指令還可以根據實際情況進行組合輸出,ffmpeg很強大,想象力到應該大部分都能實現(xiàn)。
視頻直播 視頻
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。