如何使用 Concat 文件列表和过滤器复合体

如何使用 Concat 文件列表和过滤器复合体

在我的页面上,我成功使用 ffmpeg 从包含图像路径列表的动态文本文件创建视频。

    ffmpeg concat version 1.0
    file 'path/to/file1.jpg'
    file 'path/to/file2.jpg'
    file 'path/to/file3.jpg'
    file 'path/to/file4.jpg'
    etc.

现在我正在尝试使用GL 转换使用 FFMPEG。我已经安装了FFMPEG-GL-转换我正在尝试将它与 ffmpeg 一起使用,如下所示 -

ffmpeg -safe 0 -f concat -i paths.txt -c:v libx264 \
-vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,gltransition" \
-vsync vfr -pix_fmt yuv420p -movflags +faststart -y output.mp4 2>&1

但这样做会出现以下错误——

Simple filtergraph 'scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,gltransition' was expected to have exactly 1 input and 1 output. However, it had >1 input(s) and 1 output(s). Please adjust, or use a complex filtergraph (-filter_complex) instead.
Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument
Error while processing the decoded data for stream #0:0
Conversion failed!

如果我使用以下命令——

ffmpeg -safe 0 -f concat -i paths.txt -c:v libx264 \
-vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" -filter_complex gltransition -vsync vfr -pix_fmt yuv420p -movflags +faststart -y output.mp4 2>&1

我收到此错误 -

    Input #0, concat, from '/paths.txt': Duration: N/A, start: 0.000000,
 bitrate: N/A Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown),
 432x768 [SAR 1:1 DAR 9:16], 25 tbr, 25 tbn, 25 tbc Cannot find a matching 
stream for unlabeled input pad 1 on filter Parsed_gltransition_0

我也尝试从命令中删除 -vf 并收到相同的错误 -

ffmpeg -safe 0 -f concat -i paths.txt -c:v libx264 \
-filter_complex gltransition -vsync vfr -pix_fmt yuv420p -movflags +faststart -y output.mp4 2>&1

我的文件是动态的,最多可以有 40 个文件,所以我不能使用其他连接方法。有什么方法可以让它工作吗?谢谢。

答案1

这是 Github 上的一个例子(来自https://github.com/transitive-bullshit

该示例是为 Bash (Linux) 编写的。GL Transition 通过 -filter_complex 调用,如下所示:

#!/bin/bash
# Example of concatenating 3 mp4s together with 1-second transitions between them.

./ffmpeg \
  -i media/0.mp4 \
  -i media/1.mp4 \
  -i media/2.mp4 \
  -filter_complex " \
    [0:v]split[v000][v010]; \
    [1:v]split[v100][v110]; \
    [2:v]split[v200][v210]; \
    [v000]trim=0:3[v001]; \
    [v010]trim=3:4[v011t]; \
    [v011t]setpts=PTS-STARTPTS[v011]; \
    [v100]trim=0:3[v101]; \
    [v110]trim=3:4[v111t]; \
    [v111t]setpts=PTS-STARTPTS[v111]; \
    [v200]trim=0:3[v201]; \
    [v210]trim=3:4[v211t]; \
    [v211t]setpts=PTS-STARTPTS[v211]; \
    [v011][v101]gltransition=duration=1:source=./crosswarp.glsl[vt0]; \
    [v111][v201]gltransition=duration=1[vt1]; \
    [v001][vt0][vt1][v211]concat=n=4[outv]" \
  -map "[outv]" \
  -c:v libx264 -profile:v baseline -preset slow -movflags faststart -pix_fmt yuv420p \
-y out.mp4

您还可以在 GitHub 上找到更多信息: https://github.com/transitive-bullshit/ffmpeg-concat

你可以自己读一下。当然,这个问题已经过时了,但也许有人可以从这个答案中获益,所以很抱歉挖出这个。

另外:我来这里是为了查看问题中发布的第一条错误消息(简单的过滤图“some_random_filters”预计有 1 个输入和 1 个输出。)。

然而我的解决方案很简单:过滤器用“,”分隔,我使用“;”。有时这只是小细节。

相关内容