mediainfo 隐藏功能挖掘:你以为它只是看参数的工具?
mediainfo 是什么
mediainfo官网 是 MediaArea.net 开发的专业音视频文件分析工具,它能把多媒体文件里藏着的所有技术参数一股脑摊开给你看——编码方式、容器格式、分辨率、码率、帧率、色彩空间、音轨数量、字幕语言……支持的格式极其丰富,从常见的 MP3/WAV/AVI/MP4 到 Matroska、ProRes、AV1 这些专业格式都能正确识别。
大多数人把它当"打开看看文件参数"的一次性工具:下载一部电影,拖进去看一眼分辨率和编码,然后关掉。但 mediainfo 的能力远不止此,它的 GUI 和 CLI 里藏着好几组进阶功能,专门给那些需要批量分析、质量比对、自动化处理的人准备的。这篇我把我翻出来的几个隐藏点记录下来。
安装
mediainfo下载 的安卓版是个 13.64MB 的 APK(包名 net.mediaarea.mediainfo,最新版本 26.05,2026 年 9 月更新),下载完直接点安装就行,没有额外的前置条件或解压密码。
有一点需要注意:Android 11 及以上的分区存储限制可能会导致首次启动时读不到本地文件——打开 App 如果看不到文件列表,去系统设置里手动给 mediainfo 授予"文件访问"权限就好了。这个问题在 Android 版上挺常见,但因为提示不明显,很多人以为是软件坏了,其实就是权限没给到位。
Compare 对比窗口:最多 8 个文件并排差异比对
这是我挖到的第一个隐藏功能——mediainfo 的 GUI 里藏着一个完整的文件参数对比系统。大多数人从来没点开过 View 菜单,更不会知道里面有个 Compare 选项。
入口很简单:打开两个文件(各自一个标签页),然后 View → Compare,或者快捷键 Ctrl+Shift+C。mediainfo 会把两个文件的所有参数逐字段对齐,三种对比模式任选:
- Side by side(并排):左侧文件、右侧文件并排显示,同一个字段名上下对齐,直接肉眼扫差异——最直观但占用空间大。
- Unified(合并):相同字段值合并成一行,不同字段上下排列、标出各自属于哪个文件。适合两个文件参数大部分相同、只在少数字段上有差异的情况。
- Diff(差异):只显示差异字段。如果两个文件有 200 个字段相同、只有 10 个不同,Diff 模式只会列出那 10 个。这是效率最高的模式,也是我最常用的。
mediainfo 支持最多 8 个文件并排对比——在 Compare 模式下继续 File → Open 就能加更多进来,每个文件自动分配一列/一种颜色。

典型对比场景
编码前后对比:编码前的母版 vs 编码后的输出,用 Diff 模式一眼确认分辨率没变、Profile 正确升级(比如 Main → Main 10)、色彩空间转换到位(BT.709 → BT.2020)、帧率没变。码率和编码器字段应该变,其他不该变——Diff 模式下一眼就能看出哪个字段出了问题。
同内容不同编码工具输出:HandBrake 编的和 FFmpeg 编的同一个母版,Diff 模式会清晰展示 Writing application 不同、x264-params 参数可能有细微差异、码率控制模式一个 CRF 一个 ABR。对研究不同编码工具行为差异特别有价值。
CLI 的 --Inform 自定义模板:把输出捏成你想要的样子
如果你用桌面版的 mediainfo,它还有个命令行工具 mediainfo。默认输出是 Text 格式,和 GUI 的 Text 视图一样——每个字段一行。但真正好玩的是 --Inform 参数,它让你用字段语法自定义输出模板,只挑你关心的字段、按你想要的格式排列。
语法长这样:
mediainfo --Inform="区段;字段1 字段2 字段3" 文件
举个例子,只看分辨率和编码:
mediainfo --Inform="Video;%Width%x%Height% %Format% @ %FrameRate%fps" input.mp4
# 输出:1920x1080 AVC @ 24.000fps
多区段组合也没问题——用 \n 换行(PowerShell 里用反引号):
mediainfo --Inform="General;%Duration/String3%|%OverallBitRate/String%\nVideo;%Format% %Width%x%Height%\nAudio;%Format% %Language%" input.mp4
# 输出:
# 1 h 30 min|18.9 Mb/s
# HEVC 3840x2160
# DTS eng
字段名怎么查?--Full 模式能列出一个文件的所有内部标签,不只是常用字段——凡是 --Full 输出里出现的字段,都可以在 --Inform 里用 %Stream/FieldName% 引用。官方还有完整的字段列表文档,映射到 MPEG-7 / EBUCore / PBCore 这些行业标准。
JSON / XML 结构化输出:从查看器变成自动化工具
很多人不知道 mediainfo 还能输出 JSON 和 XML 格式——这比 CSV 好用得多。
CSV 是扁平结构,一个文件如果有 3 路音频,CSV 会把每一路拍平成 Audio_0_Format、Audio_1_Format、Audio_2_Format 这样的列。而 JSON 是嵌套结构,天然表达容器 → General / Video[] / Audio[] / Text[] 的层级关系,不怕流数量变化。
mediainfo --Output=JSON input.mp4
输出的 JSON 里,Video 和 Audio 是数组,每个元素有 @order 标识第几路。用 Python 解析特别方便:
import json, subprocess
result = subprocess.run(
["mediainfo", "--Output=JSON", "input.mp4"],
capture_output=True, text=True
)
data = json.loads(result.stdout)
media = data["media"]
# 取第一路视频的分辨率
video = media["Video"][0]
print(f"{video['Width']}x{video['Height']} @ {video['FrameRate']}fps")
# 列出所有音轨的语言
for audio in media["Audio"]:
print(f" Audio #{audio['@order']}: {audio['Format']} / {audio.get('Language', 'und')}")
更狠的是它还支持 EBUCore、MPEG-7、PBCore 这些广电标准 XML 输出——给归档机构做合规检测流程用的,不需要自己定义字段映射,mediainfo 直接输出符合行业标准的 XML。
Encoding settings 为空?不是 bug,是设计
这是最反常识的一个。很多人打开文件切到 HTML 视图,发现 Video 区段底部的 Encoding settings 区块完全没有,以为 mediainfo 出 bug 了。
其实 mediainfo 只读容器里实际存在的数据,不凭空生成。以下编码器根本不会把完整命令行写入容器:NVENC 硬件编码、QuickTime / Compressor、Apple Silicon 硬件编码、ProRes 编码器、AV1 某些硬件编码器、Adobe Premiere / Media Encoder。
会写的是 FFmpeg + x264/x265、SVT-AV1、HandBrake、MeGUI。
怎么确认?切 Tree 视图看 Video → Writing library 字段:如果显示 Lavc 或 x264 core,Encoding settings 应该有;如果显示 Apple Compressor 或 NVENC 或干脆没有,空就是正常的。或者用 --Full 模式再查一次——如果 --Full 里也没有,那容器里确实没有。
还有一种情况是重封装丢的:ffmpeg -c copy 重封装时,FFmpeg 可能不会把原来的 Encoding settings 复制到新容器。解决办法是加 -map_metadata 0 参数。

一个要注意的坑:Compare 模式内存占用
8 个 4K Matroska 文件同时跑 Compare 模式,可能占用几百 MB 内存。这不是泄漏,是正常现象——Compare 需要同时保留所有文件的完整解析数据才能逐字段对齐比对。如果机器内存紧张,别一次塞太多大文件进去。
结语
mediainfo 不只是一个"打开看看"的小工具——它的 Compare 窗口能帮你快速定位编码差异,CLI 的 --Inform 模板能捏出你要的输出格式,JSON/XML 输出让它能接入自动化流水线,甚至它的"什么都不显示"也是有用的信号——告诉你这个文件是谁编的、有没有写完整参数。把它用透,省下来的排查时间远超你想象。
本文為個人基於網路公開資料整理編寫,非官方內容,僅供學習交流參考;軟體版權歸原作者所有,請支持正版;使用過程中遇到問題請查閱官方管道,本文不承擔任何責任。