如何从媒体文件中判断它是视频还是音频?

How to tell from a media file if it's a video or an audio?

我有一些文件——音频和视频文件——存储在 aws s3 存储桶中,它可以有不同的容器和东西,我想将它们发送到 aws mediaConvert(MC)。我的问题是我需要知道文件是音频文件还是视频文件,因为我需要相应地配置 MC。服务器上的主要应用程序基于 php,但此信息可能不是那么有趣。

我有 ffmpeg,我已经使用 ffprobe 来获取文件持续时间,但是我无法从返回的数据中判断它是视频还是 audio-only 文件。 in an another question 有人说也许我可以使用 ffmpeg 获取此信息,但据我所知,这需要我将文件从 s3 下载到服务器。 还有一个 s3 函数,我可以使用它来获取特定 object 的 header,其中包含文件的 mime 类型,但是有时 returns 为 audio/mpeg用于视频文件,然后错误地配置 MC。

我还可以检查 MC 的第一个作业创建时的错误消息,它告诉我这个问题,我可以重新发送具有正确配置的文件,但是作业被标记为失败并出现错误,这感觉不对。

所以我的问题是; 如果媒体文件只是视频或音频,最好的方法是什么?ffmpeg 或 ffprobe 可能可以远程完成,但我只是不知道这些工具足够深入,所以我不完全确定它只能按照我描述的方式工作。

你可以使用

ffprobe -v quiet -print_format json -show_format -show_streams sample.mp4

以上命令输出输入文件(此处:sample.mp4)的参数以及音频和视频流的详细信息。您可以看到示例输出 here.

您感兴趣的是.streams[].codec_type确定输入文件是否只包含音频、视频或两种流。您可以为此使用 jq,例如:

ffprobe -v quiet -print_format json -show_format -show_streams sample.mp4 | jq .streams[].codec_type
"video"
"audio"

或以任何其他方式解析输出 JSON。