![如何使用 Concat 文件列表和过滤器复合体](https://linux22.com/image/1565092/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20Concat%20%E6%96%87%E4%BB%B6%E5%88%97%E8%A1%A8%E5%92%8C%E8%BF%87%E6%BB%A4%E5%99%A8%E5%A4%8D%E5%90%88%E4%BD%93.png)
在我的页面上,我成功使用 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 个输出。)。
然而我的解决方案很简单:过滤器用“,”分隔,我使用“;”。有时这只是小细节。