我有这个运行良好的 ffmpeg 命令:
ffmpeg -i main-video.mp4 -i bg-audio-main-video.mp3 -i watermark.png \
-filter_complex "[0:v]scale=1280:720,setsar=1:1,fps=25[Scaled];\
[Scaled][2]overlay=x=main_w-overlay_w-(main_w*0.01):y=main_h-overlay_h-(main_h*0.01):format=yuv444[v2];\
[v2]fade=t=out:st=$FADE_OUT_START:d=$FADE_OUT_DURATION[outv]" \
-map "[outv]" -map 1:a -shortest \
-c:v libx264 -preset slow -crf 18 -pix_fmt yuv444p \
out.mp4
ffmpeg -i intro.mp4 -i out.mp4 -filter_complex \
"[0:v][0:a][1:v][1:a] concat=n=2:v=1:a=1 [outv] [outa]" \
-map "[outv]" -map "[outa]" output.mp4
但是我想用一个命令将它们合并起来,这个命令会将第二个音频添加到主视频中,但不会被切断(它不适合视频的时间),我希望它适合主视频:
ffmpeg -i intro.mp4 -i main-video.mp4 -i bg-audio-main-video.mp3 -i watermark.png \
-filter_complex "[1:v]scale=1280:720,setsar=1:1,fps=25[Scaled];\
[Scaled]drawtext=/home/luismi/.local/share/fonts/Anton.ttf:text='$telf $City':x=(w-text_w)/2:y=h-text_h-20:fontsize=60:fontcolor=white:box=1:boxborderw=5:[email protected][bg];\
[bg][3]overlay=x=main_w-overlay_w-(main_w*0.01):y=main_h-overlay_h-(main_h*0.01):format=yuv444[outv];\
[2:a]volume=enable='between(t,0,32)':volume=-3dB[2a];\
[0:v][0:a][outv][2a]concat=n=2:v=1:a=1[vid][aud]"\
-map "[vid]" -map "[aud]" -shortest \
-c:v libx264 -preset slow -crf 18 -pix_fmt yuv444p \
output.mp4
我尝试了不同的选项,但找不到解决方案。我应该进行哪些调整才能实现此目标?
答案1
我能找到的最佳解决方案是使用一个 FFmpeg 的输出管道作为另一个 FFmpeg 的输入管道。
为了避免重新编码,FFmpeg 的第一个输出是原始视频和原始音频(AVI 格式)。
ffmpeg -i main-video.mp4 -i bg-audio-main-video.mp3 -i watermark.png \
-filter_complex "[0:v]scale=1280:720,setsar=1:1,fps=25[Scaled];\
[Scaled][2]overlay=x=main_w-overlay_w-(main_w*0.01):y=main_h-overlay_h-(main_h*0.01):format=yuv444[v2];\
[v2]fade=t=out:st=$FADE_OUT_START:d=$FADE_OUT_DURATION[outv]" \
-map "[outv]" -map 1:a -shortest \
-c:v rawvideo -pix_fmt bgr24 -c:a pcm_s16le -f avi pipe: | \
ffmpeg -i intro.mp4 -vsync passthrough -i pipe: -filter_complex \
"[0:v][0:a][1:v][1:a] concat=n=2:v=1:a=1 [outv] [outa]" \
-map "[outv]" -map "[outa]" output.mp4
我已经在 Windows 10 中测试了没有过滤器的解决方案fade
:
ffmpeg -i main-video.mp4 -i bg-audio-main-video.mp3 -i watermark.png -filter_complex "[0:v]scale=1280:720,setsar=1:1,fps=25[Scaled];[Scaled][2]overlay=x=main_w-overlay_w-(main_w*0.01):y=main_h-overlay_h-(main_h*0.01):format=yuv444[outv]" -shortest -map "[outv]" -map 1:a -c:v rawvideo -pix_fmt bgr24 -c:a pcm_s16le -f avi pipe: | ffmpeg -y -i intro.mp4 -vsync passthrough -i pipe: -filter_complex "[0:v][0:a][1:v][1:a] concat=n=2:v=1:a=1 [outv] [outa]" -map "[outv]" -map "[outa]" output.mp4
-vsync passthrough
需要添加参数:
-vsync 参数
视频同步方法。passthrough
(0)
每个帧都带有其时间戳,从解复用器传递到复用器。