FFmpeg命令幫你實現音視訊編輯

語言: CN / TW / HK

作者|戶銳,單位:中國移動智慧家庭運營中心

Labs 導讀

FFmpeg是一個非常著名的多媒體框架開源專案,它可用於編碼,解碼,轉碼,音視訊複用,音視訊解複用,播放等重要功能。FFmpeg作為一個多媒體框架被各大音視訊播放器軟體使用於支援廣泛的音視訊格式,還有很多Android ROM為了提高音視訊的相容性也內建了ffmpeg。FFmpeg專案中的ffmpeg工具具有非常強大的功能,可以滿足我們日常對視訊裁剪,合併和編輯的需求。

Part 01  FFmpeg簡介

FFmpeg是一個非常著名的多媒體框架,它可用於編碼,解碼,轉碼,音視訊複用,音視訊解複用,播放等重要功能,ffmpeg採用LGPL V2.1, 其中部分可選元件採用GPL V2許可證,其官網地址:https://ffmpeg.org/。

FFmpeg作為一個多媒體框架被各大音視訊播放器軟體使用用於支援廣泛的音視訊格式,還有很多Android ROM為了提高音視訊的相容性也內建了ffmpeg,中國移動的AOS-RM作業系統也內建了ffmpeg用於提供強大的相容性。另一方面FFmpeg專案還提供了幾個重要工具,分別是ffmpeg, ffplay, ffprobe。其中ffmpeg主要用於視訊編輯操作,比如轉碼,為視訊新增背景音樂,新增特效等, ffplay工具主要用於播放音視訊檔案,ffprobe則用於檢視音視訊檔案的詳細資訊。

Part 02  FFmpeg工具下載和安裝

​Windows版本下載頁面:https://ffmpeg.org/download.html#build-windows

Windows版本5:https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-5.0.1-full_build.7z

下載後解壓到本地,並配置環境變數,將ffmpeg/bin路徑加入到PATH中。

開啟Windows命令列,輸出ffmpeg -version,驗證ffmpeg命令是否可以正常執行。

Part 03  FFmpeg命令使用

方式ffmpeg主要用於視訊編輯操作,比如轉碼,為視訊新增背景音樂,新增特效等

時間單位說明:-t 後面的時間單位為秒, -ss後面的時間格式是HH:MM:SS(時:分:秒)

3.1. 調整視訊檔案解析度

命令:ffmpeg -i 輸入檔名 -s 寬度*高度 輸出檔名

  • 示例:ffmpeg -i 1.mp4 -s 640*480 out.mp4
  • 示例說明:將1.mp4檔案的解析度修改為640*480

3.2.視訊檔案容器格式轉換

命令:ffmpeg -i 輸入檔案 輸出檔案

  • 示例:ffmpeg -i 1.mp4 1.avi
  • 示例說明:將mp4格式轉換為avi格式
  • 檢視支援的格式:ffmpeg  -formats

3.3.視訊檔案編碼器格式轉換

命令:ffmpeg -i 輸入檔案 -vcodec 視訊格式 -acodec 音訊格式輸出檔案

  • 示例:ffmpeg -i 1.mp4 -vcodec hevc -acodec mp3 out.mp4
  • 示例說明:將視訊編碼格式轉為HEVC,音訊編碼格式轉換為MP3
  • 檢視支援的格式:ffmpeg  -codecs

3.4.多個視訊合併

3.4.1.使用FFmpeg concat分離器

說明:要求編碼格式一致。建議合併前將各個檔案的解析度轉換為一致,否則會導致視訊無法正常播放。另外使用此命令前需要先生成視訊列表檔案,可以手動建立也可以使用命令。

命令:ffmpeg -f concat -i 視訊列表檔案 -c copy 輸出檔案

  • 示例:ffmpeg -f concat -i filelist.txt -c copy output.mp4
  • 示例說明:將filelist.txt中指定的檔案合併為output.mp4

在windows命令列生成filelist.txt(讀取my開頭的mp4檔案):(for %i in (my*.mp4) do @echo file '%i') > filelist.txt

  • filelist.txt的內容
  • file 'my1.mp4'
  • file 'my2.mp4'
  • file 'my3.mp4'

3.4.2.使用FFmpeg concat協議

說明:只有特定格式的檔案能連線-如:mpg或mpeg transport stream格式

命令:ffmpeg -i "concat:檔案1|檔案2|檔案3" -c copy 輸出檔案

  • 示例:ffmpeg -i "concat:1.mpg|2.mpg|3.mpg" -c copy output.mpg

ffmpeg -i "concat:1.ts|2.ts|3.ts" -c copy output.ts

  • 示例說明:將1.mpg, 2.mpg, 3.mpg檔案合併為output.mpg

3.5.多張圖片轉為視訊

命令:ffmpeg -r 每秒圖片張數 -i  圖片檔名 視訊檔名

  • 示例:ffmpeg -r 3 -i %3d.jpg out.mp4
  • 示例說明:將當前目錄001.jpg到999.jpg的圖片,以每秒3張圖片的速度合成視訊檔案out.mp4

3.6.多張圖片轉為視訊並新增背景音樂

命令:ffmpeg -r 每秒圖片張數 -i 圖片檔名 -i 音訊檔案 視訊檔名

  • 示例:ffmpeg -r 3 -i %3d.jpg -i test.mp3  out2.mp4
  • 示例說明:將當前目錄001.jpg到999.jpg的圖片,以每秒3張圖片的速度合成視訊檔案out.mp4,同時新增音訊
  • 補充:如果音訊檔案的長度大於視訊的檔案,則合成後的視訊會停留在最後一個畫面播放音訊,此時可以加上-shortest引數,完整的命令ffmpeg -r 3 -i %3d.jpg -i test.mp3 -shortest  out2.mp4

3.7.從視訊中提取圖片

命令:ffmpeg -i 原始視訊檔案 -ss 開始時間 -t 時間長度 -s  寬度*高度 -r 每秒圖片張數 輸出圖片檔名

  • 示例:ffmpeg -i 1.mp4 -ss 00:00:05 -t 5 -s 640*624 -r 3 %3d.jpg
  • 示例說明:從1.mp4檔案的5秒開始往後的5s內容獲取640*624解析度的圖片,每秒獲取3張圖片,%3d.jpg表示圖片的名字以001.jpg, 002,.jpg的形式存在。圖片的解析度最好和視訊的解析度一致,可以用ffproble -i 1.mp4的方式獲取視訊的解析度資訊。

3.8.視訊檔案去除音訊

命令:ffmpeg -i 原始視訊檔案 -vcodec copy -an 去除音訊後的視訊檔案

  • 示例:ffmpeg -i 1.mp4 -vcodec copy -an out.mp4
  • 示例說明:-vcodec copy表示視訊編碼格式不變, -an表示刪除音訊

3.9.視訊檔案新增背景音樂

命令1:ffmpeg -i 原始視訊檔案 -i 背景音樂檔案 -filter_complex [1:a]aloop=loop=-1:size=2e+09[out];[out][0:a]amix -t 視訊時間 新增背景音樂後的視訊檔案

  • 示例:ffmpeg -i 1.mp4 -i test.mp3 -filter_complex [1:a]aloop=loop=-1:size=2e+09[out];[out][0:a]amix -t 10 out.mp4
  • 示例說明:-filter_complex濾鏡,  [1:a]aloop=loop=-1:size=2e+09[out];將背景音無限迴圈, [out][0:a]amix將背景音和視訊中的音訊混合, -t 10檔案時長,單位為秒,建議取值原始視訊總時長

命令2:ffmpeg -i 原始視訊檔案 -stream_loop -1 -i 背景音樂檔案 -filter_complex [0:a][1:a]amix -t 時長 新增背景音樂後的視訊檔案

  • 示例:ffmpeg -i video.mp4 -stream_loop -1 -i test.mp3 -filter_complex [0:a][1:a]amix -t 10  out4.mp4
  • 示例說明:-stream_loop -1 引數-1代表迴圈輸入源(背景音樂),[0:a][1:a]amix 將0和1號的音訊流進行混合, -t 10檔案時長,單位為秒,建議取值原始視訊總時長

3.10.視訊檔案替換音訊

命令:ffmpeg -an -i 原始視訊檔案 -stream_loop -1 -i 背景音樂檔案 -t 時長 輸出視訊檔案

  • 示例:ffmpeg -an -i 1.mp4 -stream_loop -1 -i test.mp3 -t 11 out.mp4
  • 示例說明:將test.mp3檔案新增到1.mp4中,並替換1.mp4中的原始音訊

3.11.視訊剪輯:保留部分片段

3.11.1.去除片頭

命令:ffmpeg -ss 開始時間  -i 原始視訊檔案  剪輯後的視訊檔案

  • 示例:ffmpeg -ss 5 -t 10 -i  1.mp4  out.mp4
  • 示例說明:去除片頭5秒的內容,儲存到out.mp4

3.11.2.保留中間區域

命令:ffmpeg -ss 開始時間 -t 剪輯後的時間總長度 -i 原始視訊檔案  剪輯後的視訊檔案  時間單位為秒

  • 示例:ffmpeg -ss 5 -t 10 -i  1.mp4  out.mp4
  • 示例說明:獲取1.mp4檔案的5s開始保留10s長度的內容,儲存到out.mp4

3.11.3.保留中間區域

命令:fmpeg -ss 開始時間 -i 原始視訊檔案 -to 結束時間 -c 剪輯後的視訊文

  • 示例:fmpeg -ss 00:00:05 -i 1.mp4 -to 00:00:10 -c copy out.mp4
  • 示例說明:獲取1.mp4檔案的00:00:05到00:00:10的內容,儲存到out.mp4

3.12.加快播放速度

3.12.1.視訊加速

命令:ffmpeg -i 原始視訊檔案  -filter:v "setpts=倍速的倒數*PTS"  編輯後的視訊檔案

  • 示例:ffmpeg -i test.mp4  -filter:v "setpts=0.5*PTS" output.mp4
  • 示例說明:-filter:v "setpts=0.5*PTS"表示2倍速,0.5=1/2,取值0.25表示4倍速,取值為2時表示0.5倍慢速播放。倍速的倒數範圍[0.25, 4]

3.12.2.音訊加速

命令:ffmpeg -i 原始視訊檔案 -filter:"atempo = 倍速" -vn 編輯後的視訊檔案

  • 示例:ffmpeg -i test.mp4 -filter:"atempo = 2.0" -vn output.mp4
  • 示例說明:--filter:"atempo = 2.0"表示2倍速atempo配置區間在0.5和2.0之間, -vn表示移除視訊

3.12.3.音視訊同時加速

命令:ffmpeg -i 原始視訊檔案  -filter:v "setpts=倍速的倒數*PTS"  編輯後的視訊檔案

  • 示例:ffmpeg -i test.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output2.mp4
  • 示例說明:音訊和視訊都2倍速
  • 示例2:ffmpeg -i test.mp4 -filter_complex "[0:v]setpts=0.25*PTS[v];[0:a]atempo=2.0,atempo=2.0[a]" -map "[v]" -map "[a]" output3.mp4
  • 示例2說明:音訊和視訊都4倍速,由於atempo最大值為2,因此設定了兩次

3.13.圖片轉場特效

命令:ffmpeg -loop 1 -t 時長 -i 圖片檔名 -loop 1 -t 時長 -i 圖片檔名 -filter_complex "xfade=transition=特效名:duration=特效時長:offset=視訊做轉場的起始位置,format=yuv420p" 編輯後的視訊檔案

  • 示例:ffmpeg -loop 1 -t 3 -i 1.jpg -loop 1 -t 3 -i 2.jpg -filter_complex "xfade=transition=rectcrop:duration=1:offset=2,format=yuv420p" out.mp4
  • 示例說明:要求圖片1.jpg和2.jpg的解析度一致,duration=1:offset=2表示轉場效果從第2秒開始持續1秒。transition=rectcrop是轉場效果,rectcrop可以修改為其他轉場效果

可以用的特效參考:https://trac.ffmpeg.org/wiki/Xfade

3.14.命令常用選項介紹

參考:https://ffmpeg.org/ffmpeg.html