先看代碼:
ffmpeg.exe ^
-i "D:/test/video.mp4" ^
-i "D:/test/voice.mp3" ^
-i "D:/test/music.mp3" ^
-i "D:/test/voice.srt" ^
-filter_complex "[1:a]volume=1.0,asetpts=PTS-STARTPTS[a_voice];[2:a]volume=0.5,asetpts=PTS-STARTPTS[a_music];[a_voice][a_music]amix=inputs=2:duration=first[audio_mixed];[0:v]subtitles='D\:/test/voice.srt':force_style='Fontsize=24,Fontcolor=white'[vout]" ^
-map "[vout]" ^
-map "[audio_mixed]" ^
-c:v libx264 -crf 23 -preset veryfast -c:a aac -b:a 128k ^
-disposition:a:0 default ^
"D:/test/output_final.mp4"
以上代碼成功完成了添加語音、背景音樂和字幕,完美。
再看解釋:
這個復雜濾鏡鏈由多個部分組成,用分號(;)分隔,每個部分負責處理不同的輸入流或組合它們。
調整語音音量及時間戳:
-
[1:a]volume=1.0,asetpts=PTS-STARTPTS[a_voice]
[1:a] 指的是第二個輸入文件(voice.mp3)的音頻部分。
volume=1.0 設置音量為原始音量的100%(無增減)。
asetpts=PTS-STARTPTS 重置音頻的時間戳,確保與視頻同步。
最后 [a_voice] 是這個處理后的音頻流的標簽。
調整背景音樂音量及時間戳: -
[2:a]volume=0.5,asetpts=PTS-STARTPTS[a_music]
類似地,處理第三個輸入文件(music.mp3)的音頻。
volume=0.5 將音量設置為原始的一半。
同樣使用asetpts重置時間戳。
[a_music] 標記處理后的音頻流。
音頻混合: -
[a_voice][a_music]amix=inputs=2:duration=first[audio_mixed]
[a_voice] 和 [a_music] 被送入amix濾鏡進行混合。
inputs=2 指明有兩個輸入流參與混合。
duration=first 確保混合后的音頻長度與第一個輸入([a_voice])相同,這樣如果voice.mp3的長度與視頻匹配,則音頻不會過長。
字幕疊加到視頻: -
[0:v]subtitles=‘D:/test/voice.srt’:force_style=‘Fontsize=24,Fontcolor=white’[vout]
[0:v] 表示第一個輸入文件(video.mp4)的視頻流。
subtitles=‘D:/test/voice.srt’ 將指定的SRT字幕文件疊加到視頻上。
force_style=‘Fontsize=24,Fontcolor=white’ 設置字幕樣式:字體大小為24,顏色為白色。
[vout] 標簽表示處理后的視頻流,包含疊加了字幕的視頻。 -
其他重要參數
-map “[vout]” -map “[audio_mixed]” 指定最終輸出使用哪些流:處理過的視頻流[vout]和混合后的音頻流[audio_mixed]。
-t $(ffprobe …) 動態獲取視頻的時長,并將其作為輸出的持續時間,確保輸出與源視頻時長相符。
其余參數涉及視頻和音頻的編碼設置,如使用H.264編碼器(-c:v libx264)、CRF值(-crf 23)、預設(-preset veryfast)、AAC音頻編碼(-c:a aac)和音頻比特率(-b:a 128k)等,用于控制輸出文件的質量和兼容性。