MediaInfo CLI(命令行界面)语法教学,一劳永逸

16
亲爱的Stack Overflow的朋友们, 在许多类别中,我注意到了一种问问题的模式,但为了这个话题的缘故,我将谈论MediaInfo CLI。同样类型的问题不断出现,因为没有解决源问题,即教人如何捕鱼,而不是喂他们鱼。
有些人问:“我不知道如何仅从MediaInfo获取BitRate。” 他们受到尊重,回答他们的高级用户也受到尊重。其他人问同样的问题,例如FrameRate,Duration和Resolution…我尊重他们,也尊重回答他们的人。
然而,我对这个过程真正感到抱歉。不幸的是,MediaInfo网站文档没有说明如何正确地使用MediaInfo.exe与CLI版本提取特定信息,并且--Info参数只列出了很多参数,而没有指示如何使用它们。
因此,为了使用MediaInfo.exe CLI提取视频特定信息,我将不得不在这里亲切地问,因为我无法自定义参数,因为我不理解文档中的语法。我本来可以采取简单的方式,只问你需要从视频中提取哪些信息,但那么不懂语法的每个人都会再次提出冗余问题。
相反,我决定浪费更多时间写这篇文章,希望您能帮助我和所有将来搜索这个特定问题的人,即如何使用MediaInfo CLI --Info-Parameters语法,以便答案不会为每个自定义查询重复。
我真的想了解如何使用它,而不是只复制粘贴我将收到的现成一行答案。
首先,我会提到我所知道的任何新询问者都可以从中学到非常少的东西,然后我会亲切地要求您教我如何编写正确的MediaInfo --Info-Parameters语法以提取特定的视频信息。
1.下载Windows版本的MediaInfo CLI,解压缩zip文件并将其放在桌面上。 2.运行+CMD 3.导航到桌面上的MediaInfo文件夹。
  • 将一些视频文件放入MediaInfo文件夹中。
  • 在终端上运行以下命令:

    MediaInfo.exe --help >Help.txt

    MediaInfo.exe --Info-Parameters >Info_Parameters.txt

  • 现在您有一些帮助文件可供查找所需信息。本简单文档的其余部分取决于我在StackOverflow上的同行的慷慨相助。

    为了对我的问题更加清晰明了,总之:我如何编写适用于MediaInfo.exe CLI的正确语法以提取特定信息,例如帧速率、持续时间和分辨率?我需要了解语法而不是现成的解决方案,以便稍后进行自定义。

    感谢您花费时间!

    3个回答

    17
    当您运行mediainfo --Info-Parameters时,您会注意到有七个部分:General,Video,Audio,Text,Other,Image和Menu。每个部分都包含许多不同的参数,这些参数包含有关文件的各种信息,并使用格式--Output=SectionName;%Parameter%调用。您可以从相同的部分名称中选择多个参数,用任何您喜欢的文本(包括\n表示新行(但有趣的是不包括\t表示制表符))将它们分隔开来,例如--Output=SectionName;%Parameter1%\n%Parameter2%
    您还可以添加自己的文本,以便以您编写的方式显示,从而使输出标记更容易阅读。例如,要获取文件名、持续时间和文件大小,您可以使用命令mediainfo --Output="General;File Name: %FileName%\r\nDuration: %Duration/String3%\r\nSize: %FileSize/String%" video.mkv 如果您想从多个部分获取数据(例如将视频尺寸添加到上述信息中),则必须使用模板,因为没有办法在同一个--Output命令中获取多个部分的数据,而多个--Output实例会相互抵消,直到您只剩下列表中的最后一个。在模板中,每行指定一个部分,并将参数添加到其各自的部分中,如下所示:
    General;File Name: %FileName%\r\nOverall Bit Rate: %OverallBitRate/String%\r\nDuration: %Duration/String3%\r\nFormat: .%FileExtension%\r\nSize: %FileSize/String%\r\n
    Video;Dimensions: %Width%x%Height%\r\n
    

    这些参数将按照模板中编写的顺序显示,而且您无法在各个部分之间来回移动(在此示例中,我无法在视频部分之后添加更多的常规参数)。 要调用模板,请使用语法mediainfo --Output=file://template.txt video.mkvmediainfo --Output=file://C:\full\path\to\the\template.txt video.mkv

    10

    这也可以在命令行上实现:

    mediainfo --Output=$'General;File Name: %FileName%\\r\\nOverall Bit Rate: %OverallBitRate/String%\\r\\nDuration: %Duration/String3%\\r\\nFormat: .%FileExtension%\\r\\nSize: %FileSize/String%\nVideo;\\r\\nDimensions: %Width%x%Height%\\r\\n' input.file
    

    请注意各个部分之间的"\n"。
    在Ubuntu 18.04上测试了MediaInfo Command line和MediaInfoLib-v17.12。

    有人知道如何在fish-shell中使用它吗?在fish-shell中,美元符号($)是非法的。 - CodyChan

    6

    最近我接触到了一个命令行工具叫做 jq。这个工具使用过滤器来操作 json 数据,就像查询数据库一样。
    在我看来,这个工具可以是 mediainfo 输出 JSON 的完美伴侣。
    当然,mediainfo 参数很难使用,但我们大多数人都知道如何处理 json。花费时间学习 jq 的过滤语言比解密神秘的 mediainfo 参数选项更值得 :)

    工作流程大致如下。

    • 知道要从媒体文件中提取什么信息。
    • 使用 jq 和它的过滤器来提取它。

    命令

    以漂亮格式的 json 查看媒体文件的所有信息

    #> mediainfo --output=JSON myVideo.mp4 | jq .

    自定义 jq 过滤器以获得所需结果。

    #> mediainfo myVideo.mp4 --output=JSON | jq '.media.track[1] | {FrameRate: .FrameRate, Duration: .Duration, Width: .Width, Height: .Height}'

    提取的信息...

    {
      "FrameRate": "30.000",
      "Duration": "158.334",
      "Width": "320",
      "Height": "176"
    }
    

    一旦熟悉jq的过滤器,就会有无限可能性。

    2
    你也可以使用'mediainfo'的完整输出进行'grep'(mediainfo -f),以获取你想要的内容,但这并没有真正回答OP的问题。 - u628898

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接