概述
ffmpeg的官方介紹如下:
A complete, cross-platform solution to record, convert and stream audio and video.
ffmpeg是一種跨平臺的以多樣化的方式處理視頻、音頻的解決方案。
它從磁盤文件、網絡推流、採集設備…等獲取輸入,經過多樣化的處理(比如改變視頻的幀率、碼率、分辨率,轉換格式,提取音頻,截取等)後輸出。
輸入與輸出可以是一個或多個。
處理流程示意圖:
輸入的文件被拆分器拆分(比如一個視頻文件的視頻、音頻、字幕被分開),得到編碼過的數據包,然後解碼,得到解碼後的數據,解碼後的數據被過濾器處理,然後被再次編碼,得到編碼的數據包,再由合成器合成後輸出文件。
以下內容主要是學習了ffmpeg基礎使用後結合自己的實踐,做的一個記錄和梳理。其中借鑑了原文的一些內容。
基礎命令
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
這是官方給的命令行概述,所有的命令都是以此爲模版,通過填充參數構成的。
下文用到的處理視頻、音頻相關的一些參數,這裏先列出來,後面看到它們的使用就會明白:
-i 設定輸入流
-f 設定輸出格式
-ss 開始時間
-t 時間長度
視頻參數:
-b 設定視頻流量(碼率),默認爲200Kbit/s
-r 設定幀速率,默認爲25
-s 設定畫面的寬與高
-aspect 設定畫面的比例
-vn 不處理視頻
-vcodec 設定視頻編解碼器,未設定時則使用與輸入流相同的編解碼器
音頻參數:
-ar 設定採樣率
-ac 設定聲音的Channel數
-acodec 設定聲音編解碼器,未設定時則使用與輸入流相同的編解碼器
-an 不處理音頻
1. 視頻剪切
ffmpeg -ss 02:19:15 -t 00:01:10 -i input.mp4 -vcodec copy -acodec copy output.mp4
假如我想把電影裏某個精彩片段剪切出來,就用上面這個命令,其中-ss表示開始的時間,-t表示時長,這個命令就是從2時19分15秒開始,剪切出時長大約1分鐘10秒的視頻出來,說大約是因爲ffmpeg對視頻幀的處理機制會使時間不會絕對精確,結果可能會多一兩秒。
2. 提取視頻或者音頻
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
用上面命令可以從一個視頻文件中把視頻部分提取出來,而去掉音頻。
相反地,比如我有一個“曉松奇談”,可是我不想看到他的臉,只想聽聲音,咋辦?
ffmpeg -i 曉松奇談.mp4 -acodec copy -vn output.aac
上面的命令,默認mp4的audio codec是aac,如果不是會出錯,咱可以暴力一點,不管什麼音頻,都轉爲最常見的aac。
ffmpeg -i 曉松奇談.mp4 -acodec aac -vn output.aac
備註:aac是一種在mp3基礎上開發的旨在取代mp3的音頻格式。
3. 視頻格式轉換與視頻編碼格式轉換
視頻格式即容器,就是把編碼器生成的多媒體內容(視頻,音頻,字幕,章節信息等)混合封裝在一起的標準。像avi、mp4、rmvb、mov等都是視頻格式。
視頻編解碼格式是數據按哪種方式編碼壓縮,以便於網絡傳輸和降低帶寬的需要。原始視頻通過攝像頭採集進來以後很龐大,要想在互聯網上進行傳輸就必須要進行壓縮,於是就有了編解碼標準。像MPEG-4、VC-1、H.264等都是編碼標準。
假如一個視頻是avi格式,要改爲mp4格式,可以用下面命令:
ffmpeg -i input.avi output.mp4
假如一個視頻的編碼是MPEG4,要改用H264編碼,可以用下面命令:
ffmpeg -i input.mp4 -vcodec h264 output.mp4
反過來也一樣
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
4. 碼率(也叫比特率,bitrate)控制
bitrate = file size / duration
碼率就是數據傳輸時單位時間傳送的數據位數,一般我們用的單位是kbps即千bit每秒。視頻的碼率控制對於在線視頻比較重要,因爲在線視頻需要考慮其能提供的帶寬。
比如一個文件20.8M,時長1分鐘,碼率就是:
biterate = 20.8M bit/60s = 20.8*1024*1024*8 bit/60s= 2831Kbps
一般音頻的碼率只有固定幾種,比如是128Kbps, 那麼視頻部分的就是
video biterate = 2831Kbps -128Kbps = 2703Kbps。
ffmpg控制碼率有3種選擇,-minrate -b:v -maxrate
-
-b:v主要是控制平均碼率,設置b:v時,同時加上 -bufsize
-bufsize 用於設置碼率控制緩衝器的大小,設置的好處是,讓整體的碼率更趨近於希望的值,減少波動。(簡單來說,比如1,2的平均值是1.5, 1.49,1.51 也是1.5, 當然是第二種比較好)ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4
-
-minrate -maxrate就簡單了,在線視頻有時候,希望碼率波動,不要超過一個閾值,可以設置maxrate
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
5. 過濾器
-
改變視頻的分辨率,比如將1920x1080縮小到960x540輸出:
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
如果540不寫,寫成-1,即scale=960:-1, 那也是可以的,ffmpeg會通知縮放濾鏡在輸出時保持原始的寬高比 -
爲視頻添加logo,比如我有這樣一張圖片
想要貼到一個視頻上,可以用如下命令:ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4
結果如下:
6. 抓取視頻的一些幀,存爲jpeg圖片
比如一個視頻,我想提取一些幀,存爲圖片,可以用以下命令:
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-r 表示每一秒幾幀
-q:v 表示存儲jpeg的圖像質量,一般2是高質量
這樣ffmpeg會把input.mp4,每隔一秒,存一張圖片下來。假設有60s,那會有60張。60張?這麼多?不要不要。。。。。不要咋辦?? 可以設置開始的時間,和你想要截取的時間。
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-ss 表示開始時間
-t 表示要多長時間
這樣ffmpeg會從input.mp4的第20s時間開始,往下10s,即20~30s這10秒鐘之間,每隔1s就抓一幀,總共會抓10幀
7. 驚喜
假如我在網上看到一段視頻想保留下來,可以用下面的命令實現,雖然很簡單,但是我覺得有點像黑科技了(不要濫用),視頻地址通過F12的方式獲取,就不細說了。
ffmpeg -i "https://apd-e34da9b89994bb483210ec97a524cf20.v.......rre.mp4?sdtfrom=v1010&guid=7498e7fceb3a3e6786144867c5e63316&vkey=43......7" output.mp4