您好,我是碼農飛哥,感謝您閱讀本文,歡迎一鍵三連哦,
本文從實戰的角度出發詳細講解ffmpeg命令的使用,
干貨滿滿,建議收藏,需要用到時常看看, 小伙伴們如有問題及需要,歡迎踴躍留言哦~ ~ ~,
文章目錄
- ffmpeg的介紹以及安裝
- 基本概念說明
- ffmpeg命令使用的通用格式
- ffmpeg一些常用命令引數
- 通用選項
- 視頻選項
- 音頻選項
- ffmpeg的實戰
- 1.webm轉mp4的命令
- 2. 視頻合并命令
- 3. 視頻剪切
- 4. 提取音頻
- 5. 音量調整
- 6. 音頻同軌
- 7. 配音音頻補空白音頻
- 8. 給視頻添加聲音(視頻和音頻結合)
- 9. avi轉mp4
- 總結
- 參考
- Python知識圖譜
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的官方檔案
Python知識圖譜
為了更好幫助更多的小伙伴對Python從入門到精通,我從CSDN官方那邊搞來了一套 《Python全堆疊知識圖譜》,尺寸 870mm x 560mm,展開后有一張辦公桌大小,也可以折疊成一本書的尺寸,有興趣的小伙伴可以了解一下------掃描下圖中的二維碼即可購買,
我本人也已經用上了,感覺非常好用,圖譜桌上放,知識心中留,
我是碼農飛哥,再次感謝您讀完本文,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295763.html
標籤:其他