如果在 ffmpeg 的 filter_complex 中找不到音频流,则忽略它

如果在 ffmpeg 的 filter_complex 中找不到音频流,则忽略它

我正在使用 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 系列中存在一些过滤错误,现已修复。

相关内容