FFmpeg命令幫你實(shí)現(xiàn)音視頻編輯
作者|戶銳,單位:中國移動智慧家庭運(yùn)營中心
Labs 導(dǎo)讀
FFmpeg是一個非常著名的多媒體框架開源項目,它可用于編碼,解碼,轉(zhuǎn)碼,音視頻復(fù)用,音視頻解復(fù)用,播放等重要功能。FFmpeg作為一個多媒體框架被各大音視頻播放器軟件使用于支持廣泛的音視頻格式,還有很多Android ROM為了提高音視頻的兼容性也內(nèi)置了ffmpeg。FFmpeg項目中的ffmpeg工具具有非常強(qiáng)大的功能,可以滿足我們?nèi)粘σ曨l裁剪,合并和編輯的需求。
Part 01 FFmpeg簡介
FFmpeg是一個非常著名的多媒體框架,它可用于編碼,解碼,轉(zhuǎn)碼,音視頻復(fù)用,音視頻解復(fù)用,播放等重要功能,ffmpeg采用LGPL V2.1, 其中部分可選組件采用GPL V2許可證,其官網(wǎng)地址:https://ffmpeg.org/。
FFmpeg作為一個多媒體框架被各大音視頻播放器軟件使用用于支持廣泛的音視頻格式,還有很多Android ROM為了提高音視頻的兼容性也內(nèi)置了ffmpeg,中國移動的AOS-RM操作系統(tǒng)也內(nèi)置了ffmpeg用于提供強(qiáng)大的兼容性。另一方面FFmpeg項目還提供了幾個重要工具,分別是ffmpeg, ffplay, ffprobe。其中ffmpeg主要用于視頻編輯操作,比如轉(zhuǎn)碼,為視頻添加背景音樂,添加特效等, ffplay工具主要用于播放音視頻文件,ffprobe則用于查看音視頻文件的詳細(xì)信息。
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
下載后解壓到本地,并配置環(huán)境變量,將ffmpeg/bin路徑加入到PATH中。
打開Windows命令行,輸出ffmpeg -version,驗證ffmpeg命令是否可以正常執(zhí)行。
Part 03 FFmpeg命令使用
方式ffmpeg主要用于視頻編輯操作,比如轉(zhuǎn)碼,為視頻添加背景音樂,添加特效等
時間單位說明:-t 后面的時間單位為秒, -ss后面的時間格式是HH:MM:SS(時:分:秒)
3.1. 調(diào)整視頻文件分辨率
命令:ffmpeg -i 輸入文件名 -s 寬度*高度 輸出文件名
- 示例:ffmpeg -i 1.mp4 -s 640*480 out.mp4
- 示例說明:將1.mp4文件的分辨率修改為640*480
3.2.視頻文件容器格式轉(zhuǎn)換
命令:ffmpeg -i 輸入文件 輸出文件
- 示例:ffmpeg -i 1.mp4 1.avi
- 示例說明:將mp4格式轉(zhuǎn)換為avi格式
- 查看支持的格式:ffmpeg -formats
3.3.視頻文件編碼器格式轉(zhuǎn)換
命令:ffmpeg -i 輸入文件 -vcodec 視頻格式 -acodec 音頻格式輸出文件
- 示例:ffmpeg -i 1.mp4 -vcodec hevc -acodec mp3 out.mp4
- 示例說明:將視頻編碼格式轉(zhuǎn)為HEVC,音頻編碼格式轉(zhuǎn)換為MP3
- 查看支持的格式:ffmpeg -codecs
3.4.多個視頻合并
3.4.1.使用FFmpeg concat分離器
說明:要求編碼格式一致。建議合并前將各個文件的分辨率轉(zhuǎn)換為一致,否則會導(dǎo)致視頻無法正常播放。另外使用此命令前需要先生成視頻列表文件,可以手動創(chuàng)建也可以使用命令。
命令: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的內(nèi)容
- file 'my1.mp4'
- file 'my2.mp4'
- file 'my3.mp4'
3.4.2.使用FFmpeg concat協(xié)議
說明:只有特定格式的文件能連接-如: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.多張圖片轉(zhuǎn)為視頻
命令:ffmpeg -r 每秒圖片張數(shù) -i 圖片文件名 視頻文件名
- 示例:ffmpeg -r 3 -i %3d.jpg out.mp4
- 示例說明:將當(dāng)前目錄001.jpg到999.jpg的圖片,以每秒3張圖片的速度合成視頻文件out.mp4
3.6.多張圖片轉(zhuǎn)為視頻并添加背景音樂
命令:ffmpeg -r 每秒圖片張數(shù) -i 圖片文件名 -i 音頻文件 視頻文件名
- 示例:ffmpeg -r 3 -i %3d.jpg -i test.mp3 out2.mp4
- 示例說明:將當(dāng)前目錄001.jpg到999.jpg的圖片,以每秒3張圖片的速度合成視頻文件out.mp4,同時添加音頻
- 補(bǔ)充:如果音頻文件的長度大于視頻的文件,則合成后的視頻會停留在最后一個畫面播放音頻,此時可以加上-shortest參數(shù),完整的命令ffmpeg -r 3 -i %3d.jpg -i test.mp3 -shortest out2.mp4
3.7.從視頻中提取圖片
命令:ffmpeg -i 原始視頻文件 -ss 開始時間 -t 時間長度 -s 寬度*高度 -r 每秒圖片張數(shù) 輸出圖片文件名
- 示例:ffmpeg -i 1.mp4 -ss 00:00:05 -t 5 -s 640*624 -r 3 %3d.jpg
- 示例說明:從1.mp4文件的5秒開始往后的5s內(nèi)容獲取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];將背景音無限循環(huán), [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 參數(shù)-1代表循環(huán)輸入源(背景音樂),[0:a][1:a]amix 將0和1號的音頻流進(jìn)行混合, -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秒的內(nèi)容,保存到out.mp4
3.11.2.保留中間區(qū)域
命令:ffmpeg -ss 開始時間 -t 剪輯后的時間總長度 -i 原始視頻文件 剪輯后的視頻文件 時間單位為秒
- 示例:ffmpeg -ss 5 -t 10 -i 1.mp4 out.mp4
- 示例說明:獲取1.mp4文件的5s開始保留10s長度的內(nèi)容,保存到out.mp4
3.11.3.保留中間區(qū)域
命令:fmpeg -ss 開始時間 -i 原始視頻文件 -to 結(jié)束時間 -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的內(nèi)容,保存到out.mp4
3.12.加快播放速度
3.12.1.視頻加速
命令:ffmpeg -i 原始視頻文件 -filter:v "setpts=倍速的倒數(shù)*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倍慢速播放。倍速的倒數(shù)范圍[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配置區(qū)間在0.5和2.0之間, -vn表示移除視頻
3.12.3.音視頻同時加速
命令:ffmpeg -i 原始視頻文件 -filter:v "setpts=倍速的倒數(shù)*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,因此設(shè)置了兩次
3.13.圖片轉(zhuǎn)場特效
命令:ffmpeg -loop 1 -t 時長 -i 圖片文件名 -loop 1 -t 時長 -i 圖片文件名 -filter_complex "xfade=transition=特效名:duration=特效時長:offset=視頻做轉(zhuǎn)場的起始位置,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表示轉(zhuǎn)場效果從第2秒開始持續(xù)1秒。transition=rectcrop是轉(zhuǎn)場效果,rectcrop可以修改為其他轉(zhuǎn)場效果
可以用的特效參考:https://trac.ffmpeg.org/wiki/Xfade
3.14.命令常用選項介紹
參考:https://ffmpeg.org/ffmpeg.html