您好,我是碼農飛哥,感謝您閱讀本文,歡迎一鍵三連哦。本文從實戰的角度出發詳細講解ffmpeg命令的使用。
乾貨滿滿,建議收藏,需要用到時常看看。小夥伴們如有問題及需要,歡迎踴躍留言哦~ ~ ~。
ffmpeg是一個非常快速的視頻和音頻轉換器,也可以從實時音頻/視頻源中抓取。它還可以在任意採樣率之間進行轉換,並使用高質量的多相濾波器動態調整視頻大小。他能夠兼容Windows,Linux以及mac三種作業系統(說白了就是這三種作業系統都能用)。ffmpeg的下載地址是:ffmpeg的下載地址 安裝過程沒啥好說的,按照提示一直點下一步就行了。這裡需要說明的一點是ffmpeg安裝好之後最好在PATH中配置ffmpeg的環境變量。配置好之後在命令行中輸入ffmpeg會出現如下結果:
基本概念說明比特率:指的是每秒傳送的比特(bit)數,單位是bps。幀速率:指的是每秒刷新的圖片的幀數,也可以理解為圖形處理器每秒鐘能夠刷新幾次。單位是fps(Frames per Second)或者"赫茲(Hz)"。
ffmpeg命令使用的通用格式ffmpeg命令使用的通用格式如下所示:
ffmpeg [ global_options ] {[ input_file_options ] -i 輸入文件地址} ... {[ output_file_options ] 輸出文件地址} ...
ffmpeg :表示調用ffmpeg程序的命令,如果沒有配置環境變量的話則需要指定ffmpeg.exe的絕對路徑,就像下面這樣D:\\develop\\ffmpeg-4.3.2-2021-02-20-full_build\\bin\\ffmpeg.exe global_options:用於指定全局操作參數,比如 -y 參數,可選的參數。input_file_options:用於指定輸入文件的操作參數,比如:-f concat 參數等 -i: 指定輸入文件的地址,必要參數。output_file_options: 用於指定輸出文件的操作參數,可選參數。
ffmpeg一些常用命令參數要想熟練的使用ffmpeg命令,就需要掌握ffmpeg的一些常用命令參數。
通用選項通用選項就是指對音頻視頻都使用的命令參數。| 參數| 作用 | 作用範圍 | 示例 | |--|--|--|--| | -f |強制輸入或輸出文件格式,通常會自動檢測輸入文件的格式,並根據輸出文件的文件擴展名猜測格式,因此在大多數情況下不需要此選項 |全局 | | | -i 地址|輸入文件的地址 |輸入 | | | -y |覆蓋輸出文件,即當output.mp4存在時,不經提示覆蓋該文件 |全局 | | | -i | 指定輸入文件的地址,如果跟ffmpeg則可以寫 xxx.mp4,否則則需要寫全路徑 | 輸入|| | -n | 不要覆蓋輸出文件,即如果指定的輸出文件已經存在,則立即退出 | 全局|| | -stream_loop編號 | 設置輸入流應循環的次數。循環 0 表示不循環,循環 -1 表示無限循環。| 輸入|| | -c[: stream_specifier ]| 編解碼器 |輸入/輸出,每個流 | -c copy (就是按照輸入流的編碼稱呼輸出流)| | -codec[: stream_specifier ]| 編解碼器,為一個或多個流選擇編碼器(在輸出文件之前使用時)或者解碼器(在輸入文件之前使用時) |輸入/輸出,每個流 |ffmpeg -i 輸入 -map 0 -c:v libx264 -c:a 複製輸出 (使用 libx264 編碼所有視頻流並複製所有音頻流。)| | -t| 持續時間 |輸入/輸出,當用作輸入選項時,限制從輸入文件讀取數據的持續時間。當用作輸出選項時(在輸出url之前),在其持續時間達到duration後停止寫入輸出。duration必須是持續時間 |-t 20 (持續20秒) | | -fs limit_size| 是指文件大小限制,以字節為單位。超出限制後不會再寫入更多的字節塊。輸出文件的大小略大於請求的文件大小。|輸出 || | -ss位置| 當用作輸入選項時,在輸入文件中尋找位置,多用於視頻剪切 |輸入/輸出 |-ss 15 (從第15秒開始)| | -ss位置| 當用作輸入選項時,在輸入文件中尋找位置,多用於視頻剪切 |輸入/輸出 |-ss 15 (從第15秒開始)| | -dn| 作為輸入選項,阻止文件的所有數據流被過濾或自動選擇或映射用於任何輸出|輸入/輸出 |-ss 15 (從第15秒開始)| | -frames[: stream_specifier ]幀數| 即是生成指定幀數的視頻|輸出 || | -filter[: stream_specifier ] filtergraph ( output,per-stream )| 創建由filtergraph指定的filtergraph並使用它來過濾流,filtergraph是對應用於流的 filtergraph 的描述,並且必須具有相同類型的流的單個輸入和單個輸出。|輸出 ||
視頻選項視頻選項,指的是只作用於視頻的命令參數。| 參數| 作用 | 作用範圍 | 示例 | |--|--|--|--| |-vframes數 |設置要輸出的視頻幀數 | | | |-r fps |設置幀率(HZ值、分數或縮寫),作為輸入選項,會忽略視頻文件的視頻時長,而是假設恆定幀速率fps生成時間戳。作為輸出選項,複製或刪除輸入幀以實現恆定的輸出幀速率fps。| 輸入/輸出 | -r 30 (30幀/秒) | |-s 大小 |設置幀大小,格式為'寬高' | 輸入/輸出,每個流 | | |-vn |作為輸入選項,阻止文件的所有視頻流被過濾或自動選擇或映射到任何輸出,作為輸出選項,即自動選擇或映射任何視頻流,可用於從視頻中提取音頻 | 輸入/輸出 | |
音頻選項音頻選項,指的是只作用於音頻的命令參數。
參數作用作用範圍示例-aframes編號設置要輸出的音頻幀數輸出說完了ffmpeg的命令參數,接著就讓我們來實戰一下。示例中的所有視頻和音頻都放在了D:\\ffmpeg_test目錄下。
1.webm轉mp4的命令webm格式的視頻是所有瀏覽器支持的視頻格式,前端在錄製好視頻之後傳入給後端一個webm格式的視頻,通常我們需要將webm格式的視頻轉成mp4格式的視頻。
ffmpeg -y -i D:\\ffmpeg_test\\1.webm -r 30 D:\\ffmpeg_test\\1.mp4
這裡就是將1.webm的視頻轉成每秒30幀的視頻1.mp4。這裡指定1.mp4的絕對路徑,如果不指定的話則生成的視頻文件會落到當前ffmpeg命令的執行目錄下。運行結果是:
2. 視頻合併命令當上傳的視頻比較大時或者用戶分段錄製視頻時,前端會傳入多段視頻給後端,這時候就需要進行視頻的合併操作。使用ffmpeg命令進行視頻合併操作分為兩步。
首先新建一個名為filelist.txt 的文件,在該文件中將需要合併的視頻地址寫入該文件。比如D:\ ffmpeg_test目錄下有 1.mp4和2.mp4需要合併。則寫入的格式如下:
執行視頻合併的ffmpeg的命令:
ffmpeg -f concat -safe 0 -y -i D:\\ffmpeg_test\\filelist.txt -c copy -strict -2 D:\\ffmpeg_test\\concated.mp4
命令的解釋:這裡就是將前面的filelist.txt記錄的1.mp4和2.mp4兩個視頻合併成一個名為concated.mp4的視頻。-f concat:指定該操作是合併操作 -safe 0:用於避免操作輸入流的權限問題 -c copy:用於指定輸出視頻流和輸入視頻流的編碼格式保持一致 -strict -2:用於避免opus in MP4 support is experimental這個問題。詳細可以參考使用ffmpeg進行視頻合併時幾個問題記錄 Operation not permitted 運行結果是:
3. 視頻剪切原始視頻弄好之後,用戶可能對視頻不太滿意,需要將不好的視頻片段剪切掉。其操作命令也很簡單。這就就是將原始視頻concated.mp4從第15秒開始剪切,剪切成一個25秒的新視頻clip.mp4。
ffmpeg -ss 15 -t 25 -i D:\\ffmpeg_test\\concated.mp4 -c:v libx264 -c:a aac -strict experimental D:\\ffmpeg_test\\clip.mp4
參數介紹:-ss 15 :從第15秒開始剪切視頻。-t 25 :指定剪切後的視頻時長為25秒。-c:v libx264:指定視頻的編碼格式為libx264格式。-c:a aac :指定音頻的編碼格式為aac格式。-strict experimental :安全處理。運行結果是:
4. 提取音頻現在用戶滿意的視頻剪切好了,用戶可以進入配音環節了。在進行配音之前我們首先需要將原視頻的音頻從原視頻中分離出來。提取音頻的操作比較簡單。其命令是:
ffmpeg -y -i D:\\ffmpeg_test\\concated.mp4 -vn D:\\ffmpeg_test\\output.wav
這裡就是從concated.mp4視頻中提測其原音頻,原音頻的名字是output.wav。這裡 -vn 指定了輸出音頻的編碼格式跟視頻的音頻格式保持一致。運行結果是:
5. 音量調整原視頻的音頻分離出來之後,用戶可以一邊播放原音頻,一邊錄製配音了。這時候用戶可能需要想調整音頻的音量。調整音量的操作也很簡單。下面就是將音頻的音量調整為原來的80%。
ffmpeg -y -i D:\\ffmpeg_test\\output.wav -af "volume=0.8" D:\\ffmpeg_test\\output_80.wav
或者
ffmpeg -y -i D:\\ffmpeg_test\\output.wav -vol 80 D:\\ffmpeg_test\\output_80.wav
這裡需要注意的是如果是第一種方式的話-af "volume=數值" volume的數值必須是除以100之後的值。而-vol 數值 數值直接傳入百分比。運行結果是:
6. 音頻同軌配音配好之後,我們想著將原音頻和配音音頻合併成一條音頻,這裡就需要進行音頻同軌了。其命令是:
ffmpeg -y -i D:\\ffmpeg_test\\org_video_sound_input.wav -i D:\\ffmpeg_test\\org_voice_input.wav -filter_complex amix=inputs=2:duration=longest D:\\ffmpeg_test\\org_voice_output.wav
這裡就是將音頻org_video_sound_input.wav和org_voice_input.wav音頻合併成一條音頻org_voice_output.wav。其核心的命令參數是:-filter_complex amix=inputs=2:duration=longest:這裡使用-filter_complex指定複雜的過濾器圖,amix=inputs=2:duration=longest採用amix過濾器指定輸入音頻的數量是2個,時長取最長的那個音頻的時長。運行結果是:
7. 配音音頻補空白音頻配音配好之後,但是一般情況下配音音頻的時長不等於原音頻的時長。這時候就需要將沒有配音的時長補空白音頻。補空白音頻的操作稍微有點複雜。其操作思路分為三步。
生成一個跟原音頻時長一樣的空白音頻,其命令是:這裡假設原音頻的時長是20秒,所以就生成一個時長為20秒的空白音頻。
ffmpeg -y -f lavfi -i anullsrc -t 20 D:\\ffmpeg_test\\silence.wav
將配音音頻開頭部分補空白音頻(比如用戶是從原音頻的第2秒處還是配音,那麼配音音頻的前2秒就需要補空白音頻),其命令是:
ffmpeg -y -i D:\\ffmpeg_test\\silence.wav -i D:\\ffmpeg_test\\org_voice_input.wav -filter_complex "aevalsrc=0:d=2 [s1];[s1][1:a]concat=n=2:v=0:a=1[aout]" -c:v copy -map [aout] D:\\ffmpeg_test\\org_voice_output_silence.wav
其中:D:\ffmpeg_test\silence.wav 是第一步生成的空白音頻,D:\ffmpeg_test\org_voice_input.wav 是用戶配音的音頻。d=2 :用於指定是補空白的點,就將0秒到2秒這段時長補空白。-c:v copy:音頻的編碼格式不變。4. 將補完空白音頻的配音音頻跟第一步生成的空白音頻同軌就得到了一個和原音頻時長一樣的配音音頻。其命令是同第前面的第6節,在此就不在贅述了。
ffmpeg -y -i D:\\ffmpeg_test\\org_voice_output_silence.wav -i D:\\ffmpeg_test\\silence.wav -filter_complex amix=inputs=2:duration=longest D:\\ffmpeg_test\\org_voice_output_result.wav
運行結果是:
8. 給視頻添加聲音(視頻和音頻結合)視頻和音頻的結合,就是將前面生成的帶配音的音頻和原視頻結合。其命令是:
ffmpeg -y -i D:\\ffmpeg_test\\user_video.avi -i D:\\ffmpeg_test\\org_voice_output_result.wav -c:v copy -c:a aac -strict experimental D:\\ffmpeg_test\\user_video_target.avi
輸入視頻是:user_video.mp4,輸入音頻是:org_voice_output_result.wav。輸出視頻是:org_voice_output_result.avi -c:v copy:指定輸出視頻的格式和輸入視頻的格式保持一致。-c:a aac : 指定輸出視頻的音頻編碼格式是aac格式。運行結果是:
9. avi轉mp4有點遺憾的是生成的avi格式的視頻不能在瀏覽器上直接播放。所以,我們需要將avi格式的視頻轉成mp4格式的視頻。其轉換命令是:
ffmpeg -y -i D:\\ffmpeg_test\\user_video_target.avi -c:v libx264 -crf 19 -preset slow -c:a aac -b:a 192k -ac 2 D:\\ffmpeg_test\\user_video_target.mp4
這裡輸入視頻是:user_video_target.avi,輸出視頻是:user_video_target.mp4。-c:v libx264 :指定視頻的編碼格式是libx264格式。-c:a aac :指定音頻的編碼格式是aac格式。-b:a 192k :指定輸出視頻的比特率是192kbits。運行結果是:
總結本文從實戰的角度出發詳細介紹了ffmpeg的使用。相信對讀者朋友們一定大有幫助。
參考ffmpeg 常用命令總結:(avi轉MP4、MP4轉ts、視頻壓縮、去除視頻聲音、合併音頻和視頻) ffmpeg的官方文檔
我是碼農飛哥,再次感謝您讀完本文。