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

語言: CN / TW / HK

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

Labs 導讀

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

Part 01  FFmpeg簡介

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

FFmpeg作為一個多媒體框架被各大音視頻播放器軟件使用用於支持廣泛的音視頻格式,還有很多Android ROM為了提高音視頻的兼容性也內置了ffmpeg,中國移動的AOS-RM操作系統也內置了ffmpeg用於提供強大的兼容性。另一方面FFmpeg項目還提供了幾個重要工具,分別是ffmpeg, ffplay, ffprobe。其中ffmpeg主要用於視頻編輯操作,比如轉碼,為視頻添加背景音樂,添加特效等, ffplay工具主要用於播放音視頻文件,ffprobe則用於查看音視頻文件的詳細信息。

Part 02  FFmpeg工具下載和安裝

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

Windows版本5:http://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可以修改為其他轉場效果

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

3.14.命令常用選項介紹

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