首页 > 解决方案 > ffmpeg 从文件中读取并立即应用 filter_complex

问题描述

我正在fls.txt接受ffmpeg -i并申请concat和加速。

fls.txt

file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'

一口气的命令如下所示:

ffmpeg  -i fls.txt     \
-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a] concat=n=3:v=1:a=1 [v][a];\
[v]setpts=0.5*PTS[v1];[a]atempo=2,asetpts=N/SR/TB[a1]"     \
-c:v h264_nvenc -map "[v1]" -map "[a1]"  x2.mp4

a输出真的很奇怪,说找不到流之类的东西。而且它看起来好像是在试图理解它fls.txt本身而不是它的内容作为参数。我在这里做错了什么,我该如何纠正?此外,这是一个简化的示例,我不能手动编写 3 个输入文件路径。我需要从文件中读取它。如果这很重要,我在 Windows 10 上。

编辑:通过进行建议的编辑并扩展-filter_complex我在下面得到一个错误。

ffmpeg -f concat -safe 0 -i fls.txt     \
-filter_complex "[0:v]setpts=0.5*PTS[v1];[v1]setpts=0.5*PTS[v2];[0:a]atempo=2,asetpts=N/SR/TB[a1];[a1]atempo=2,asetpts=N/SR/TB[a2]"     \
-c:v h264_nvenc -map "[v1]" -map "[a1]" x2.mp4 \
-c:v h264_nvenc -map "[v2]" -map "[a2]" x4.mp4

错误:

Output with label 'v1' does not exist in any defined filter graph, or was already used elsewhere.

标签: ffmpeg

解决方案


filtergraph 描述中的流说明符 ':a' ... 不匹配任何流。

要启用 concat demuxer,您必须-f concat-i fls.txt.

ffmpeg -f concat -i fls.txt     \
-filter_complex "[0:v]setpts=0.5*PTS[v1];[0:a]atempo=2,asetpts=N/SR/TB[a1]"     \
-c:v h264_nvenc -map "[v1]" -map "[a1]" x2.mp4

因为您正在尝试使用concat demuxer,所以也不需要concat 过滤器,因此您可以简化命令。

您可能还必须使用-safe 0before-i您可以在文档中阅读。

后续问题:带有标签“v1”的输出在任何定义的过滤器图中都不存在,或者已经在其他地方使用过

您不能重复使用已使用的过滤器输出标签,因此本示例避免了这种情况:

ffmpeg -f concat -safe 0 -i fls.txt     \
-filter_complex "[0:v]setpts=0.5*PTS[2xv];[0:v]setpts=PTS/4[4xv];[0:a]atempo=2,asetpts=N/SR/TB[2xa];[0:a]atempo=4,asetpts=N/SR/TB[4xa]"     \
-c:v h264_nvenc -map "[2xv]" -map "[2xa]" x2.mp4 \
-c:v h264_nvenc -map "[4xv]" -map "[4xa]" x4.mp4

推荐阅读