【问题标题】:How to find out exact container/format of a video file using ffprobe?如何使用 ffprobe 找出视频文件的确切容器/格式?
【发布时间】:2023-03-05 17:55:01
【问题描述】:

我想使用 ffprobe 找出视频文件的确切格式/容器,但我无法找到其中的“确切”部分。

当我运行这个示例命令时:
ffprobe -hide_banner -loglevel fatal -show_error -show_format -print_format json INPUT
我收到这个输出:

{
    "format": {
        "filename": "INPUT",
        "nb_streams": 2,
        "nb_programs": 0,
        "format_name": "matroska,webm",
        "format_long_name": "Matroska / WebM",
        "start_time": "0.000000",
        "duration": "2.969000",
        "size": "2376430",
        "bit_rate": "6403314",
        "probe_score": 100,
        "tags": {
            "COM.ANDROID.VERSION": "9",
            "MAJOR_BRAND": "mp42",
            "MINOR_VERSION": "0",
            "COMPATIBLE_BRANDS": "isommp42",
            "COM.ANDROID.CAPTURE.FPS": "30.000000",
            "ENCODER": "Lavf57.83.100"
        }
    }
}

您可能已经理解,ffprobe 在format_name 值内提供了格式列表。这适用于 mp4、mkv、webm 等多种视频格式。

然而,mediainfo 能够找出格式的确切类型,即它输出单个 Format,如下所示:
命令:mediainfo INPUT
输出:

General
Unique ID                                : 41836023869371892704046005573890259380 (0x1F79533A912A2117C3D4CEB704EAB9B4)
Complete name                            : intermediate.mkv
Format                                   : Matroska
Format version                           : Version 4 / Version 2
File size                                : 2.27 MiB
Duration                                 : 2 s 969 ms
Overall bit rate mode                    : Variable
Overall bit rate                         : 6 403 kb/s
Writing application                      : Lavf57.83.100
Writing library                          : Lavf57.83.100
ErrorDetectionType                       : Per level 1
COM.ANDROID.CAPTURE.FPS                  : 30.000000
COM.ANDROID.VERSION                      : 9

*为整理信息而截断的输出

谁能指导我如何使用 ffprobe 本身来实现这一点?

【问题讨论】:

  • 不可能。特定模式由解复用器识别,但不是标准导出字段。
  • 是的,我还没有找到任何输出这个的命令组合,但是 ffprobe 应该能够像 mediainfo 那样做这个,并且像 python-magic 这样的任何 mime_type 推断器都能够

标签: ffmpeg ffprobe mediainfo


【解决方案1】:

它们都为您提供完全相同的信息。您遇到的挑战与 ffmpeg 的怪癖有关。

在我看来,您遇到的问题可能是术语问题。您提到的 ffmpeg 输出流确实包含 ffmpeg 对文件容器格式的评估。

"format_name": "matroska,webm",

如果您只想要那条信息,可以使用如下命令(在 Linux BaSH/SHell 中显示):

container=$(ffprobe -v quiet -show_entries format=format_name -of default=noprint_wrappers=1:nokey=1 "$filename") # identify file container type (format)

在你的例子中会返回

# container="matroska,webm"

ffmpeg 可能非常令人困惑。例如,它将文件容器称为“格式”,但如果您正在编码到文件容器中,它称它们为“复用器”

进一步了解 ffmpeg 的逻辑并将其与 mediainfo 进行比较,在您的示例中,它们告诉您同样的事情。踢球者是ffmpeg的特点。 ffmpeg 将 Matroska 文件容器报告为“matroska,webm”,这与 ffmpeg 引用其 Matroska 解码器(解复用器)的方式相同。然而,如果您正在对 Matroska 容器进行编码,ffmpeg 将相应的编码器(muxer)简单地称为“matroska”——这与 mediainfo 报告相同容器类型的方式一致。

我希望这对您有所帮助,而不是让您更加困惑。最重要的是 ffmpeg 和 mediainfo 都为您提供完全相同的信息。它们的区别在于 ffmpeg 更细化。它将文件的读取报告为容器的解复用器/解码器类型。 ffmpeg 将您的示例报告为“matroska,webm”,因为 ffmpeg 对 Matroska 和 WebM 文件使用相同的解码器。 Mediainfo OTOH,更直接。它知道容器类型是 Matroska(WebM 只是 Matroska 容器的一种形式),因此 mediainfo 将其简单地报告为 Matroska 文件(正如我所说,它很简单)。

ffmpeg 更具体; mediainfo 更笼统。

【讨论】:

    猜你喜欢
    • 2020-04-08
    • 2015-11-23
    • 1970-01-01
    • 2013-06-25
    • 2018-07-14
    • 2015-03-03
    • 1970-01-01
    • 2016-05-04
    • 2016-05-01
    相关资源
    最近更新 更多