将一个有音频的视频与另一个没有音频的视频合并,并为第二个没有音频的视频添加音频并添加水印

将一个有音频的视频与另一个没有音频的视频合并,并为第二个没有音频的视频添加音频并添加水印

我有这个运行良好的 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)
每个帧都带有其时间戳,从解复用器传递到复用器。

相关内容