-list_devices 和 -list_options 的 ffmpeg 意外退出代码 1

ffmpeg unexpected exit code 1 for -list_devices and -list_options

描述

如果我运行以下任何命令来自examples in the documentation,使用ffmpeg 4.2.2 on Windows 10,请求的信息 成功显示在控制台中, 但是 进程退出时退出代码为 1,而不是预期的 0(成功)。

ffmpeg -list_devices true -f dshow -i dummy

ffmpeg -list_options true -f dshow -i video="MyCamera"

据我所知,Windows 上的退出代码 1 暗示 "Incorrect function",因此我认为这种行为是意外的。

如果我将相机输入流式传输到磁盘,例如使用ffmpeg -f dshow -i video="MyCamera" "myfile.mp4",然后停止使用 q,退出代码为 0,如预期。

问题

退出代码 1 是否构成 ffmpeg 的正常行为,还是我做错了什么?

相关性

当运行从命令行手动执行命令时,退出代码没有太大区别,只要显示请求的信息即可。

但是,当运行以编程方式执行命令时,可能会引起麻烦。例如,使用 Python 的 subprocess.run(..., check=True),非零退出代码会导致 CalledProcessError.

当然有办法解决这个问题,例如使用 check=False,但关键是如果 ffmpeg 的行为符合预期,即返回 0.

,则不需要解决方法

退出代码 1 而使用 dshow 列出设备是预期的输出,因为在这种情况下代码通过使用 AVERROR_EXIT 立即退出并且不会产生媒体输出。

if (ctx->list_devices) {
    av_log(avctx, AV_LOG_INFO, "DirectShow video devices (some may be both video and audio devices)\n");
    dshow_cycle_devices(avctx, devenum, VideoDevice, VideoSourceDevice, NULL, NULL);
    av_log(avctx, AV_LOG_INFO, "DirectShow audio devices\n");
    dshow_cycle_devices(avctx, devenum, AudioDevice, AudioSourceDevice, NULL, NULL);
    ret = AVERROR_EXIT;
    goto error;
}

您应该会在日志中看到 dummy: Immediate exit requested

您当然可以轻松修改 libavdevice/dshow.c 并直接退出,但您必须编译自己的版本。