ffmpeg:如何连接两个具有任意参数的视频?

ffmpeg:如何连接两个具有任意参数的视频?

我尝试创建一个命令,将简介添加到任意视频文件的开头。但该文件可以具有任意大小、宽高比,甚至像素格式。

因此,我需要在连接之前调整介绍的大小并在必要时添加填充,然后连接介绍和文件,然后使用正确的编解码器和像素格式进行转换(为此 使用-codec和)。-pix_fmt

我认为视频文件可以是任意尺寸和纵横比:宽、正方形,甚至垂直。所以我需要通过添加填充来将简介调整到目标尺寸。

以下是我使用的:

ffmpeg -i intro.mp4 -i video.mp4 -filter_complex \
    "[0][1]scale2ref=iw:ih:force_original_aspect_ratio=decrease[intro][main], \
    [intro]pad=ow:oh:(ow-iw)/2:(oh-ih)/2[0:v]; [0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" \
    -map '[v]' -map '[a]' -sws_flags spline -vcodec libx264 -movflags +faststart \
    -r 25 -g 50 -crf 18 -me_method umh -pix_fmt yuv420p -trellis 0 -bf 8 -acodec aac 
    -strict -2 -ar 44100 -ab 128k -f mp4 out.mp4 -y

但还是不明白...

现在出现错误:

过滤器 scale2ref:ref 有一个未连接的输出

FFmpeg 版本:

ffmpeg version git-2019-10-19-31aafda Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 9.2.1 (GCC) 20191010

谢谢你!

答案1

scale2ref 声明应以分号而不是逗号结尾。因为它是与后面带有 pad 的过滤器链不同的过滤器链。

filter_complex 声明一个 filtergraph,它由一个或多个 filterchains 组成。如果一个过滤器的输入是确切地与其前面的过滤器的输出相同,那么它们可以成为同一过滤器链的一部分,并且前面的过滤器可以以逗号结尾。在这种情况下,pad 只接受单个输入 - 调整大小的简介,但不接受参考主视频。scale2ref 中的主视频必须由另一个过滤器使用或发送出去进行独立编码。在这种情况下,它应该进入 concat 过滤器(未使用1:v

无论如何,语法错误掩盖了逻辑错误。pad 没有输出大小的参考 - 它的宽度和高度表达式是循环的。任务必须以不同的方式执行。首先,必须将简介的一个副本调整为与主视频完全相同的大小并完全涂黑,然后另一个副本必须使用调整大小的第一个副本作为参考并缩放到最佳大小。然后将第二个副本叠加在中心。然后可以将此结果与主视频合并。

使用

ffmpeg -i intro.mp4 -i video.mp4 -filter_complex "[0][1]scale2ref=iw:ih[intro][main];[intro]drawbox=t=fill[intro-bg];[0][intro-bg]scale2ref=iw:ih:force_original_aspect_ratio=decrease:flags=spline[intro][intro-bg];[intro-bg][intro]overlay=x='(W-w)/2':y='(H-h)/2'[intro-resized]; [intro-resized][0:a][main][1:a]concat=n=2:v=1:a=1:unsafe=1[v][a]" -map '[v]' -map '[a]' -c:v libx264 -movflags +faststart -r 25 -g 50 -crf 18 -me_method umh -pix_fmt yuv420p -trellis 0 -bf 8 -acodec aac -ar 44100 -ab 128k -f mp4 out.mp4 -y

相关内容