我正在使用 ffmpeg 的一些叠加层和缩放层创建视频输出filter_complex
。我使用的是 ffmpeg v3.3.2
我对带有音频的视频使用以下命令:
# avideo -> aoutput : 50% Faster
ffmpeg3 \
-i avideo.wmv \
-filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" \
-map "[v]" \
-map "[a]" \
aoutput.wmv
我对没有音频的视频使用以下命令:
# video -> output : 50% Faster
ffmpeg3 \
-i video.wmv \
-f lavfi -t 0.1 -i anullsrc \
-filter_complex "[0:v]setpts=0.5*PTS[v]" \
-map "[v]" \
output.wmv
这很好用。但是,我不知道视频文件中是否有任何音频流。我需要让此命令适用于这两种情况。
我正在尝试使用以下命令来实现这一点:
# unknown(avideo, video) -> uoutput : 50% Faster
ffmpeg3 \
-i video.wmv \
-f lavfi -t 0.1 -i anullsrc \
-filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" \
-map "[v]" \
-map "[a]" \
uoutput.wmv
但是,由于输入视频没有任何音频流,因此失败。确切的错误消息是
过滤器图描述中的流说明符“:a”[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a] 与任何流都不匹配。
这个问题和我的问题最相似:FFmpeg 映射可选(音频)流,只是他们没有使用filter_complex
来执行这个可选场景。所以,条件映射选项对我来说不起作用。
我如何告诉 ffmpeg 使用音频流,filter_complex
如果有音频,否则忽略音频。
- 我想用一个命令来完成这个任务。
- 我想单独使用 ffmpeg(没有 ffprobe:大小问题)。
但是,如果您有任何好的选择,请分享。
编辑:
我已使用“-af atempo=2.0”更新了命令,这似乎解决了我的问题。我这样做了。
ffmpeg3 \
-i video.wmv \
-af atempo=2.0 \
-filter_complex "[0:v]setpts=0.5*PTS" \
uoutput.wmv
但是,我仍然愿意接受更多选择。上面的修复似乎不对。虽然这适用于所有格式,但对于 30 秒的 WMV 来说却失败了,并且有一个错误https://trac.ffmpeg.org/ticket/6375
答案1
针对此问题,有两种可能的方法。
1)如果您不在过滤器图内组合已处理的流,那么只需使用简单的过滤器链。
ffmpeg \
-i avideo.wmv \
-vf "setpts=0.5*PTS" \
-af "atempo=2.0" \
aoutput.wmv
仅当存在音频输出流时,才会解析音频链。
2)添加虚拟音频输入并省略音频过滤的输入标签。ffmpeg 将选择第一个可用的音频流。
ffmpeg \
-i video.wmv \
-f lavfi -t 0.1 -i anullsrc \
-filter_complex "[0:v]setpts=0.5*PTS[v];atempo=2.0[a]" \
-map "[v]" \
-map "[a]" \
uoutput.wmv
我建议你升级到 ffmpeg 4.0 或更高版本。3.x 系列中存在一些过滤错误,现已修复。