實戰詳細講解ffmpeg命令的使用(來自一線的經驗,視頻合併&avi轉MP4&補空白音頻【收藏下來一定用的到】)

2021-12-23 碼農飛哥

您好,我是碼農飛哥,感謝您閱讀本文,歡迎一鍵三連哦本文從實戰的角度出發詳細講解ffmpeg命令的使用。
乾貨滿滿,建議收藏,需要用到時常看看。小夥伴們如有問題及需要,歡迎踴躍留言哦~ ~ ~。

前言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編號設置要輸出的音頻幀數輸出
-ar 頻率設置音頻採樣頻率,對於輸出流,它默認設置為相應輸入流的頻率。對於輸入流,此選項僅對音頻抓取設備和原始解復用器有意義輸入/輸出-ar 24000 (以24000Hz採集音頻)-aq q設置音頻質量(只作用於編解碼器,VBR)輸出
-ac 通道設置音頻通道數。對於輸出流,它默認設置為輸入音頻通道的數量輸入/輸出,每個流-ac 2 (聲道數設置為2)-an作為輸入選項,阻止文件的所有音頻流被過濾或自動選擇或映射到任何輸出,作為輸出選項,禁用音頻記錄,即任何音頻流的自動選擇或映射輸入/輸出
-acodec編解碼器設置音頻編解碼器輸入/輸出-acodec aac (音頻編碼用aac)-vol 百分比設置百分之多少的音量輸入/輸出-vol 150(150%的音量)-map file:stream設置輸入/輸出流映射輸入/輸出
ffmpeg的實戰

說完了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的官方文檔

我是碼農飛哥,再次感謝您讀完本文

相關焦點

  • ffmpeg常用命令集錦
    在實際工作中,通常需要ffmpeg作為工具來驗證一個問題,比如播放一個視頻,提取一個碼流,轉碼視頻,轉封格式等,用的時候才發現忘記了相關命令,Google
  • 教你如何用youtube-dl下載YouTube視頻
    安裝過程很簡單,可以按照默認一直下一步就可以了,注意兩個地方:一是勾選add to Path的複選框,即添加到系統的環境變量中,這樣你就可以直接在命令行中輸入python以運行python命令了。二是勾選安裝pip的複選框,pip是用來安裝python的包的程序,一定要勾選,否則手動安裝pip可是有點麻煩哦~
  • 編程開發 | 171128DUBBO分布式項目實戰 數據交換平臺項目+SpringMVC+maven+dubbo項目+商城系統
    18.mp4│  ├單點登錄19.mp4│  ├單點登錄20.mp4│  ├單點登錄21.mp4│  ├單點登錄22.mp4│  ├單點登錄23.mp4│  ├分布式實戰項目1.mp4│  ├分布式實戰項目10.mp4│  ├分布式實戰項目11.mp4│  ├分布式實戰項目12.mp4│  ├分布式實戰項目13.mp4
  • 全平臺AI視頻補幀工具(DAIN/CAIN/RIFE-ncnn-vulkan)
    ,大概是在CAIN吧,也是從那個時候起開始對視頻插幀產生了興趣。功能支持的作業系統MacOS(Happy體驗過多次,切實好用,哈哈)支持的顯卡特性DAIN 支持任意時刻點補幀,如0.1,0.3,0.99這樣,速度較慢,顯存佔用高CAIN/RIFE 只支持0.5時刻點補幀,速度較快,顯存佔用低下載地址DAIN:https://github.com/nihui/dain-ncnn-vulkan/releasesCAIN
  • ffmpeg第五彈:Qt+SDL+ffmpeg視頻播放演示
    一、前言 在前幾篇文章當中,有提到過用源碼去搭建ffmpeg的命令環境開發,為啥要這樣去搭建環境,為什麼不用直接用下面這個命令在ubuntu下安裝多快,簡單又方便:sudo apt install ffmpeg
  • FFmpeg 時間戳詳解
    音頻中 DTS 和 PTS 是相同的。視頻中由於 B 幀需要雙向預測,B 幀依賴於其前和其後的幀,因此含 B 幀的視頻解碼順序與顯示順序不同,即 DTS 與 PTS 不同。當然,不含 B 幀的視頻,其 DTS 和 PTS 是相同的。
  • ffmpeg數據結構簡介
    name:封裝格式名稱long_name:封裝格式的長名稱extensions:封裝格式的擴展名id:封裝格式ID一些封裝格式處理的接口函數3、AVStream 視頻文件中每個視頻(音頻)流對應一個該結構體。
  • YUV圖像處理實戰
    ❝在YUV格式通透解析一文中,詳細描述了YUV格式的概念、優點、採樣格式和存儲格式,在文末,還放置了一些對YUV圖像進行分量處理的效果圖,本文就是那些效果圖的實戰源碼解析,理論與實踐相結合,助你更進一步理解YUV格式。
  • linux、windows常用命令大全(建議收藏)
    例:cd /d d:\src // 進入d:\src目錄例:cd prj\src\view // 進入當前目錄下的prj\src\view文件夾pushd popd 使用棧來維護當前目錄md d:\mp3 // 在D:\建立mp3文件夾md d:\mp4 // 在D:\建立mp4文件夾cd /d d:\mp4 //
  • 不習慣在終端使用 youtube-dl?可以使用這些 GUI 應用 | Linux 中國
    它是一個非常有用的命令行工具,可以讓你 從 YouTube 和其他一些網站下載視頻。使用 youtube-dl 並不複雜,但我明白使用命令來完成這種任務並不是每個人都喜歡的方式。好在有一些應用為 youtube-dl 工具提供了 GUI 前端。
  • 《基於Csharp+OpenCV圖像處理實戰》帶你從一線實戰視角,實打實分析具體視覺問題
    EmguCV經過長期的發展,雖然比較完備,但是這兩者的調用需要引入全部算法,同時使用它自定義的語法進行編寫,而且升級不一定及時。本課程將比較詳細介紹OpenCVSharp,它提供了較為原生的代碼編寫體驗,著重推薦GOCW,它採用「Csharp基於CLR直接調用Opencv編寫的算法庫」方法,能夠將的OpenCV技術引入進來,同時保證生成程序的最小化。
  • 計算機視覺進階指南:從CV基礎到目標檢測實戰
    在對比了幾家機構的課程後,我最終選則 七月在線的【計算機視覺 特訓】課程,如果你正想要學習CV,同時又缺少項目實戰經驗,那麼一定要學習下這門課,課程內容詳細講解了從CV基礎到目標檢測實戰。最重要的是全套課程 才賣9.9元,學會些理論和實戰經驗還是很值得的!課程從CV基礎理論講解開始,進而到CNN卷積神經網絡理論講解及實踐調參技巧,實踐涉及圖搜索技術、車輛重識別、目標檢測及圖像分割等內容。
  • 一天內鹹魚瘋轉 6.8w 次,最終被所有大廠封殺!
    MyBatis逆向工程使用.mp4   17.項目公共類介紹.mp4   19.下單接口定義和編碼步驟分析.mp4   20.校驗訂單流程分析.mp4   21.校驗訂單實現.mp4   22.生成預訂單流程分析1.mp4   23.生成預訂單代碼實現1.mp4   24.生成預訂單代碼實現2.mp4
  • 【彈力帶教程合集】26個動作詳細講解!看完就會!(健身必看)
    用通俗易懂的語言分享實用的健身知識這期視頻可能是網絡上最全面最詳細的彈力帶教學合集
  • 在Linux命令行下令人驚嘆的驚嘆號(!)
    例如,運行一個在history輸出中編號是1551的命令。$ !1551[history命令輸出的序號]便可以調用它。2. 運行之前的倒數第二個、第七個命令等您可以以另一種方式來運行之前執行的命令,通過使用-1代表最後的命令,-2代表倒數第二個命令,-7代表倒數第七個命令等。首先使用history命令來獲得執行過的命令的列表。
  • 鮮為人知而又實用的 Linux 命令大全
    在下篇文章中,我將涉及一些其他很少有人知道的有趣的Linux命令。到那時連接 Tecmint保持收看。喜歡和分享將有助於我們傳播。12. <空格> 命令你在終端上鍵入的每個命令都會記錄到history,也能用history命令重新調用。如何騙過history 命令呢?呵呵,你可以輕而易舉地做到。
  • Linux 下最好的圖片截取和視頻截錄工具 | Linux 中國
    它也有一個擴展菜單,展示在 GNOME 頂部面板,使得用戶進入軟體變得更人性化,非常方便使用。你可以截取選區、窗口、桌面、當前光標下的窗口、區域、菜單、提示框或網頁。Shutter 允許用戶直接上傳屏幕截圖到設置內首選的雲服務商。它同樣允許用戶在保存截圖之前編輯器圖片;同時提供了一些可自由添加或移除的插件。
  • Git常用命令使用大全
    ,當你本地創建了一個工作目錄,你可以進入這個目錄,使用'git init'命令進行初始化;Git以後就會對該目錄下的文件進行版本控制,這時候如果你需要將它放到遠程伺服器上,可以在遠程伺服器上創建一個目錄,並把可訪問的URL記錄下來,此時你就可以利用'git remote add'命令來增加一個遠程伺服器端,例如:git  remote  add  origin  git://github.com