如何使用 ffprobe 找出视频文件的确切容器/格式?

par*_*gar 6 ffmpeg mediainfo ffprobe

我想使用 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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您可能已经理解的, ffprobe 给出了value内的格式列表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
Run Code Online (Sandbox Code Playgroud)

*输出被截断以整理信息

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

MrP*_*ead 5

他们都为您提供完全相同的信息。您遇到的挑战与 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)
Run Code Online (Sandbox Code Playgroud)

在你的例子中会返回

# container="matroska,webm"
Run Code Online (Sandbox Code Playgroud)

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

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

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

ffmpeg 更具体;mediainfo 更通用。