參考
ffmpeg常用命令
ffmpeg參數(shù)中文詳細(xì)解釋
[總結(jié)]FFMPEG視音頻編解碼零基礎(chǔ)學(xué)習(xí)方法
一渺蒿、安裝
打開https://ffmpeg.zeranoe.com/builds/简珠,該網(wǎng)站中的FFMPEG分為3個(gè)版本:Static棒假,Shared蕊程,Dev。
前兩個(gè)版本可以直接在命令行中使用狰晚,他們的區(qū)別在于:Static里面只有3個(gè)應(yīng)用程序:ffmpeg.exe盏筐,ffplay.exe,ffprobe.exe晋柱,每個(gè)exe的體積都很大优构,相關(guān)的Dll已經(jīng)被編譯到exe里面去了。Shared里面除了3個(gè)應(yīng)用程序:ffmpeg.exe雁竞,ffplay.exe钦椭,ffprobe.exe之外拧额,還有一些Dll,比如說avcodec-54.dll之類的彪腔。Shared里面的exe體積很小侥锦,他們在運(yùn)行的時(shí)候,到相應(yīng)的Dll中調(diào)用功能德挣。Dev版本是用于開發(fā)的恭垦,里面包含了庫文件xxx.lib以及頭文件xxx.h,這個(gè)版本不包含exe文件格嗅。
這里下載了static版本番挺,是個(gè)zip壓縮文件,解壓到指定目錄屯掖,去配置環(huán)境變量玄柏,比如e:\ffmpeg20180919\bin,這樣bin下面的ffmpeg.exe就可以在命令行中使用了贴铜,可以用ffmpeg -version測試一下:
放一個(gè)mp4視頻粪摘,然后把聲音提取到output.acc,用命令測試一下:
ffmpeg -i mov_bbb.mp4 -acodec copy -vn output.aac
注:新版本安裝方式绍坝,可以參考Windows下載FFmpeg最新版
二徘意、常用命令
主要參數(shù):
-i 設(shè)定輸入流
-f 設(shè)定輸出格式
-ss 開始時(shí)間
視頻參數(shù):
-b 設(shè)定視頻流量(碼率),默認(rèn)為200Kbit/s
-r 設(shè)定幀速率轩褐,默認(rèn)為25
-s 設(shè)定畫面的寬與高
-aspect 設(shè)定畫面的比例
-vn 不處理視頻
-vcodec 設(shè)定視頻編解碼器映砖,未設(shè)定時(shí)則使用與輸入流相同的編解碼器
音頻參數(shù):
-ar 設(shè)定采樣率
-ac 設(shè)定聲音的Channel數(shù)
-acodec 設(shè)定聲音編解碼器,未設(shè)定時(shí)則使用與輸入流相同的編解碼器
-an 不處理音頻
1. 視頻格式轉(zhuǎn)換
(其實(shí)格式轉(zhuǎn)換說法不太準(zhǔn)確灾挨,但大家都這么叫邑退,準(zhǔn)確的說,應(yīng)該是視頻容器轉(zhuǎn)換)
比如一個(gè)avi文件劳澄,想轉(zhuǎn)為mp4地技,或者一個(gè)mp4想轉(zhuǎn)為ts。
ffmpeg -i input.avi output.mp4
ffmpeg -i input.mp4 output.ts
插個(gè)號外:某天我在知乎上看到一段視頻秒拔,想轉(zhuǎn)給微信好友看莫矗,怎么操作呢。這里參考如何全自動下載知乎上的視頻到本地(注意不要濫用)砂缩,先打開要觀看的視頻頁面作谚,再F12清空,然后開始播放視頻庵芭,就能看到類似https://vdn.vzuu.com/SD/49c84c7c-c61a-11e8-8bad-0242ac112a0a.mp4?auth_key=1539832492-0-0-c61c22f39c&expiration=1539832492&disable_local_cache=1
這樣的字符串妹懒,然后用ffmpeg -i "https://vdn.vzuu.com/SD/49c8..." output.mp4
即可下載。弄到電腦上双吆,用電腦QQ發(fā)送到手機(jī)QQ上眨唬,在手機(jī)QQ上點(diǎn)擊選擇保存到手機(jī)上会前。然后在微信里選照片就能看到這個(gè)視頻了(注意視頻文件不要超過20M,另外最開始用的不是電腦QQ匾竿,而是百度網(wǎng)盤瓦宜,發(fā)現(xiàn)不行……)。
2. 提取音頻
比如我有一個(gè)“曉松奇談”岭妖,可是我不想看到他的臉临庇,我只想聽聲音, 地鐵上可以聽昵慌,咋辦假夺?
ffmpeg -i 曉松奇談.mp4 -acodec copy -vn output.aac
上面的命令,默認(rèn)mp4的audio codec是aac废离,如果不是會出錯(cuò)侄泽,咱可以暴力一點(diǎn)礁芦,不管什么音頻蜻韭,都轉(zhuǎn)為最常見的aac。
ffmpeg -i 曉松奇談.mp4 -acodec aac -vn output.aac
(-vn 不處理視頻 )
3. 提取視頻
我目測有些IT員工柿扣,特別是做嵌入式的肖方,比如機(jī)頂盒,想debug一下未状,沒有音頻的情況下俯画,播放一個(gè)視頻幾天幾夜會不會crash,這時(shí)候你需要一個(gè)純視頻文件司草,可以這么干艰垂。
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
-an 不處理音頻
4. 視頻剪切
經(jīng)常要測試視頻,但是只需要測幾秒鐘埋虹,可是視頻卻有幾個(gè)G猜憎,咋辦?切吧巍胰柑!
下面的命令,就可以從時(shí)間為00:00:15開始爬泥,截取5秒鐘的視頻柬讨。
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
-ss表示開始切割的時(shí)間,-t表示要切多少袍啡。上面就是從開始踩官,切5秒鐘出來。
注意一個(gè)問題境输,ffmpeg 在切割視頻的時(shí)候無法做到時(shí)間絕對準(zhǔn)確卖鲤,因?yàn)橐曨l編碼中關(guān)鍵幀(I幀)和跟隨它的B幀肾扰、P幀是無法分割開的,否則就需要進(jìn)行重新幀內(nèi)編碼蛋逾,會讓視頻體積增大集晚。所以,如果切割的位置剛好在兩個(gè)關(guān)鍵幀中間区匣,那么 ffmpeg 會向前/向后切割偷拔,所以最后切割出的 chunk 長度總是會大于等于應(yīng)有的長度。
5. 碼率控制
碼率控制對于在線視頻比較重要亏钩。因?yàn)樵诰€視頻需要考慮其能提供的帶寬莲绰。
那么,什么是碼率姑丑?很簡單: bitrate = file size / duration
比如一個(gè)文件20.8M蛤签,時(shí)長1分鐘,那么栅哀,碼率就是:
biterate = 20.8M bit/60s = 20.8*1024*1024*8 bit/60s= 2831Kbps
一般音頻的碼率只有固定幾種震肮,比如是128Kbps, 那么留拾,video的就是
video biterate = 2831Kbps -128Kbps = 2703Kbps戳晌。
說完背景了。好了痴柔,來說ffmpeg如何控制碼率沦偎。 ffmpg控制碼率有3種選擇,-minrate -b:v -maxrate
-b:v主要是控制平均碼率咳蔚。 比如一個(gè)視頻源的碼率太高了豪嚎,有10Mbps,文件太大谈火,想把文件弄小一點(diǎn)侈询,但是又不破壞分辨率。
ffmpeg -i input.mp4 -b:v 2000k output.mp4
上面把碼率從原碼率轉(zhuǎn)成2Mbps碼率堆巧,這樣其實(shí)也間接讓文件變小了妄荔。目測接近一半。不過谍肤,ffmpeg官方wiki比較建議啦租,設(shè)置b:v時(shí),同時(shí)加上 -bufsize
-bufsize 用于設(shè)置碼率控制緩沖器的大小荒揣,設(shè)置的好處是篷角,讓整體的碼率更趨近于希望的值,減少波動系任。(簡單來說恳蹲,比如1 2的平均值是1.5虐块, 1.49 1.51 也是1.5, 當(dāng)然是第二種比較好)ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4
-minrate -maxrate就簡單了,在線視頻有時(shí)候嘉蕾,希望碼率波動贺奠,不要超過一個(gè)閾值,可以設(shè)置maxrate错忱。
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
6. 視頻編碼格式轉(zhuǎn)換
比如一個(gè)視頻的編碼是MPEG4儡率,想用H264編碼,咋辦以清?
ffmpeg -i input.mp4 -vcodec h264 output.mp4
相反也一樣
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
當(dāng)然了儿普,如果ffmpeg當(dāng)時(shí)編譯時(shí),添加了外部的x265或者X264掷倔,那也可以用外部的編碼器來編碼眉孩。(不知道什么是X265,可以Google一下勒葱,簡單的說浪汪,就是她不包含在ffmpeg的源碼里,是獨(dú)立的一個(gè)開源代碼错森,用于編碼HEVC吟宦,ffmpeg編碼時(shí)可以調(diào)用它篮洁。當(dāng)然了涩维,ffmpeg自己也有編碼器)
ffmpeg -i input.mp4 -c:v libx265 output.mp4
ffmpeg -i input.mp4 -c:v libx264 output.mp4
7. 只提取視頻ES數(shù)據(jù)
這個(gè)可能做開發(fā)的人會用到,順便提一下吧袁波。
ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264
8. 過濾器的使用
這個(gè)我在另一篇博客提到了瓦阐,具體參考ffmpeg filter過濾器 基礎(chǔ)實(shí)例及全面解析
8.1 將輸入的1920x1080縮小到960x540輸出:
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
//ps: 如果540不寫,寫成-1篷牌,即scale=960:-1, 那也是可以的睡蟋,ffmpeg會通知縮放濾鏡在輸出時(shí)保持原始的寬高比。
8.2 為視頻添加logo
比如枷颊,我有這么一個(gè)圖片
想要貼到一個(gè)視頻上戳杀,那可以用如下命令:
./ffmpeg -i input.mp4 -i iQIYI_logo.png -filter_complex overlay output.mp4
結(jié)果如下所示:
9. 抓取視頻的一些幀,存為jpeg圖片
比如夭苗,一個(gè)視頻信卡,我想提取一些幀,存為圖片题造,咋辦傍菇?
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-r 表示每一秒幾幀
-q:v表示存儲jpeg的圖像質(zhì)量,一般2是高質(zhì)量界赔。
如此丢习,ffmpeg會把input.mp4牵触,每隔一秒,存一張圖片下來咐低。假設(shè)有60s揽思,那會有60張。60張见擦?什么绰更?這么多?不要不要锡宋。儡湾。。执俩。徐钠。不要咋辦?役首? 可以設(shè)置開始的時(shí)間尝丐,和你想要截取的時(shí)間呀。
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-ss 表示開始時(shí)間
-t表示共要多少時(shí)間衡奥。
如此爹袁,ffmpeg會從input.mp4的第20s時(shí)間開始,往下10s矮固,即20~30s這10秒鐘之間失息,每隔1s就抓一幀,總共會抓10幀档址。
10.輸出YUV420原始數(shù)據(jù)
對于做底層編解碼的人來說盹兢,有時(shí)候常要提取視頻的YUV原始數(shù)據(jù)。 怎么做守伸?很簡單: ffmpeg -i input.mp4 output.yuv
怎么樣绎秒,是不是太簡單啦?D崮 <邸!哈哈(如果你想問yuv的數(shù)據(jù)蠢涝,如何播放玄呛,我不會告訴你,RawPlayer挺好用的;莺铡把鉴!)
那如果我只想要抽取某一幀YUV呢? 簡單,你先用上面的方法庭砍,先抽出jpeg圖片场晶,然后把jpeg轉(zhuǎn)為YUV。 比如: 你先抽取10幀圖片怠缸。 ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
結(jié)果:
-rw-rw-r-- 1 chenxf chenxf 296254 7月 20 16:08 pic-001.jpeg
-rw-rw-r-- 1 chenxf chenxf 300975 7月 20 16:08 pic-002.jpeg
-rw-rw-r-- 1 chenxf chenxf 310130 7月 20 16:08 pic-003.jpeg
-rw-rw-r-- 1 chenxf chenxf 268694 7月 20 16:08 pic-004.jpeg
-rw-rw-r-- 1 chenxf chenxf 301056 7月 20 16:08 pic-005.jpeg
-rw-rw-r-- 1 chenxf chenxf 293927 7月 20 16:08 pic-006.jpeg
-rw-rw-r-- 1 chenxf chenxf 340295 7月 20 16:08 pic-007.jpeg
-rw-rw-r-- 1 chenxf chenxf 430787 7月 20 16:08 pic-008.jpeg
-rw-rw-r-- 1 chenxf chenxf 404552 7月 20 16:08 pic-009.jpeg
-rw-rw-r-- 1 chenxf chenxf 412691 7月 20 16:08 pic-010.jpeg
然后诗轻,你就隨便挑一張,轉(zhuǎn)為YUV: ffmpeg -i pic-001.jpeg -s 1440x1440 -pix_fmt yuv420p xxx3.yuv
如果-s參數(shù)不寫揭北,則輸出大小與輸入一樣扳炬。當(dāng)然了,YUV還有yuv422p啥的搔体,你在-pix_fmt 換成yuv422p就行啦恨樟!
11.H264編碼profile & level控制
舉3個(gè)例子吧
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 output.mp4
ffmpeg -i input.mp4 -profile:v main -level 4.2 output.mp4
ffmpeg -i input.mp4 -profile:v high -level 5.1 output.mp4
如果ffmpeg編譯時(shí)加了external的libx264,那就這么寫:
ffmpeg -i input.mp4 -c:v libx264 -x264-params "profile=high:level=3.0" output.mp4
從壓縮比例來說疚俱,baseline< main < high劝术,對于帶寬比較局限的在線視頻,可能會選擇high呆奕,但有些時(shí)候养晋,做個(gè)小視頻,希望所有的設(shè)備基本都能解碼(有些低端設(shè)備或早期的設(shè)備只能解碼baseline)梁钾,那就犧牲文件大小吧绳泉,用baseline。自己取舍吧姆泻!
12.旋轉(zhuǎn)視頻
在手機(jī)上錄的視頻零酪,在電腦放,是顛倒的麦射,需要旋轉(zhuǎn)90度蛾娶。使用格式工廠失敗了……
參考ffmpeg視頻的翻轉(zhuǎn)vflip灯谣、hflip潜秋,旋轉(zhuǎn)rotate、transpose
使用ffmpeg -i 3.mp4 -vf rotate=PI/2 rotate8.mp4
畫面確實(shí)旋轉(zhuǎn)過來了胎许,但是尺寸不對峻呛,變成橫屏后,兩側(cè)的畫面看不到了辜窑。改用ffmpeg -i 3.mp4 -vf transpose=1 rotate8.mp4
解決了問題
13.dshow
參考FFMPEG學(xué)習(xí)(一)---【命令行】采集視頻和音頻
Windows DirectShow輸入設(shè)備,用于采集windows下的視頻和音頻設(shè)備钩述。
通過命令 ffmpeg -list_devices true -f dshow -i dummy
查看支持的設(shè)備列表,包含設(shè)備名稱穆碎,設(shè)備類型等信息牙勘。
得到如下結(jié)果
[dshow @ 0000022890f18f40] DirectShow video devices (some may be both video and audio devices)
[dshow @ 0000022890f18f40] "HP TrueVision HD Camera"
[dshow @ 0000022890f18f40] Alternative name "@device_pnp_\\?
\usb#vid_0408&pid_5365&mi_00#6&193fc2d2&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
[dshow @ 0000022890f18f40] DirectShow audio devices
[dshow @ 0000022890f18f40] "麥克風(fēng)陣列 (英特爾? 智音技術(shù))"
[dshow @ 0000022890f18f40] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-
00A0C911CE86}\wave_{1F376599-992B-457F-A4B1-45C06BD5C148}"
dummy: Immediate exit requested
使用以下命令錄制視頻或音頻,按Q可以停止。
ffmpeg -f dshow -i video="HP TrueVision HD Camera" -vcodec libx264 001.mp4
ffmpeg -f dshow -i audio="麥克風(fēng)陣列 (英特爾? 智音技術(shù))" -ar 16000 -ac 1 lib.wav
音視頻聯(lián)合錄制
ffmpeg -f dshow -i video="HP TrueVision HD Camera":audio="麥克風(fēng)陣列 (英特爾? 智音技術(shù))"
-s 640x360 -b:v 1000k -b:a 128k output.mkv
音視頻推流
ffmpeg -f dshow -i video="HP TrueVision HD Camera":audio="麥克風(fēng)陣列 (英特爾? 智音技術(shù))"
-vcodec libx264 -r 25 -preset:v ultrafast -tune:v zerolatency -f rtsp rtsp://127.0.0.1/test
14.FFmpeg使用gdigrab采集窗口
FFmpeg采集設(shè)備(3)
三方面、小丸工具箱
小丸工具箱是一款用于處理音視頻等多媒體文件的軟件放钦。是一款x264、ffmpeg等命令行程序的圖形界面恭金。它的目標(biāo)是讓視頻壓制變得簡單操禀、輕松。
主要功能:
- 高質(zhì)量的H264+AAC視頻壓制
- ASS/SRT字幕內(nèi)嵌到視頻
- AAC/WAV/FLAC/ALAC音頻轉(zhuǎn)換
- MP4/MKV/FLV的無損抽取和封裝
參考自小丸FAQ:小丸工具箱是一個(gè)x264(taro編譯版,現(xiàn)在是7mod)横腿、MP4Box颓屑、ffmpeg、MediaInfo等軟件的GUI耿焊。工具箱只是一個(gè)調(diào)用其他程序的程序揪惦,自己沒有壓制功能!只是把平常需要命令行完成的工作圖形化了罗侯!其實(shí)一切轉(zhuǎn)換軟件都是這個(gè)意思丹擎。
四、fluent-ffmpeg
參考自
[FFmpeg探秘]Ep.(1) 什么是FFmpeg?
[FFmpeg探秘]Ep.(2) 從node-fluent-ffmpeg開始
NODEJS基于FFMPEG視頻推流測試
該nodejs包封裝了ffmpeg的命令行調(diào)用部分,加強(qiáng)了代碼的可讀性,若熟悉ffmpeg 命令行使用手冊,亦可不使用該包歇父。
npm install --save fluent-ffmpeg
//使用js編碼的用戶,可以忽略下條命令
npm install --save @types/fluent-ffmpeg
五蒂培、使用ffmpeg推RTMP直播流
1.安裝nignx環(huán)境
參考windows使用nginx配置rtmp,hls,httpflv
2.參考手把手教你搭建Nginx-rtmp流媒體服務(wù)器+使用ffmpeg推流
在上述下載的demo中,看一下conf/nginx.conf配置文件:
rtmp {
server {
listen 1935;
application live {
live on;
}
application vod {
play video;
}
application hls {
live on;
hls on;
hls_path temp/hls;
hls_fragment 8s;
}
}
}
其中rtmp就是rtmp服務(wù)器模塊榜苫,端口是1935护戳,application我理解為一個(gè)路徑〈共牵可以通過訪問rtmp://localhost/live
來訪問live這個(gè)資源媳荒。live on 表示這是實(shí)時(shí)的傳輸,這不同于點(diǎn)播驹饺,點(diǎn)播就好比我在某視頻網(wǎng)站上想看一個(gè)視頻钳枕,無論我什么時(shí)候去點(diǎn)擊,它會從頭開始播放赏壹。而實(shí)時(shí)傳輸(直播)鱼炒,就是好比看電視,我在19:20去打開電視(打開直播路)蝌借,視頻不會從頭開始播放昔瞧,而是從當(dāng)前(19:20)的視頻數(shù)據(jù)開始播放。
然后在nginx.exe路徑下命令行運(yùn)行nginx -s reload重新加載配置菩佑。
3.使用ffmpeg推流
參考使用FFmpeg在B站直播的姿勢
ffmpeg -re -i 1.mp4 -vcodec copy -f flv rtmp://localhost/live
或者
ffmpeg -re -i 1.mp4 -vcodec copy -acodec copy
-b:v 800k -b:a 32k -f flv rtmp://localhost/live
-re : 表示使用文件的原始幀率進(jìn)行讀取自晰,因?yàn)閒fmpeg讀取視頻幀的速度很快,如果不使用這個(gè)參數(shù)稍坯,ffmpeg可以在很短時(shí)間就把video.mp4中的視頻幀全部讀取完并進(jìn)行推流酬荞,這樣就無法體現(xiàn)出視頻播放的效果了。官方文檔中對這個(gè)參數(shù)的解釋是:
-re (input)
Read input at native frame rate. Mainly used to simulate a grab device, or live input stream (e.g. when reading from a file). Should not be used with actual grab devices or live input streams (where it can cause packet loss). By default ffmpeg attempts to read the input(s) as fast as possible. This option will slow down the reading of the input(s) to the native frame rate of the input(s). It is useful for real-time output (e.g. live streaming).
-vcodec copy : -vcodec表示使用的視頻編解碼器 ,前綴v表示video混巧。后面緊跟的copy 表示復(fù)制使用源文件的視頻編解碼器糟把,比如原文件的編解碼器(codec)是h264,則這里就使用h264牲剃。
-acodec copy : -acodec表示使用的音頻編解碼器遣疯,前綴a表示audio。后面的copy 表示使用源文件的音頻編解碼器凿傅。
-b:v 800k : -b:v表示視頻的比特率(bitrate) 缠犀,為800k。
-b:a 32k : 表示音頻的比特率為32k聪舒。
-f flv : -f表示format 辨液,就是強(qiáng)制輸出格式為flv,這一步其實(shí)也叫封裝(mux)箱残,封裝要做的事就是把視頻和音頻混合在一起滔迈,進(jìn)行同步。緊跟在后面的rtmp://localhost/live
表示輸出的"文件名"被辑,這個(gè)文件名可以是一個(gè)本地的文件燎悍,也可以指定為rtmp流媒體地址。指定為rtmp流媒體地址后盼理,則ffmpeg就可以進(jìn)行推流谈山。
4.可以使用VLC或ffplay進(jìn)行播放了
六、FFMPEG使用參數(shù)詳解
-g gop_size 設(shè)置圖像組大小 這里設(shè)置GOP大小宏怔,也表示兩個(gè)I幀之間的間隔