多媒体文件信息管理工具介绍

在多媒体文件管理领域,获取文件的详细信息是一项基础而重要的任务。MediaInfo是一个开源软件,能够深入分析文件中的流,并报告所有相关的细节。如果打算构建自己的应用程序来管理多媒体文件,并希望获取这些细节,那么使用MediaInfo DLL库将是一个明智的选择。它提供了多种语言的代码示例,帮助快速上手。但是,它主要通过调用"Get"方法,并以字符串参数的形式提供属性名,这并不总是那么容易记忆和使用。

有些人尝试构建了一些封装器,但当原始库发生变化时,这些封装器往往会遇到兼容性问题,导致用户不得不等待作者修复封装器。为了解决这个问题,这里介绍了一种新型的基于反射的封装器,它允许最终用户只需一行代码就能轻松添加新属性。

该库已发布在GitHub上,以便进一步的贡献者或仅供个人使用:

https://github.com/sierramike/ZM.Media.Info

使用代码

使用这个封装器只需要两行代码(以及第三行或更多行来使用结果):

var MI = new ZM.Media.Info.MediaInfoWrapper(); var mfi = MI.Read("MyFile.mkv"); string allDetails = mfi.Display();

调用封装器上的Read()方法将返回一个"MediaFileInfo"类型的对象。调用MediaFileInfo对象上的Display()方法将返回一个字符串,列出所有读取的属性,除了空白属性。调用Display(true)可以列出所有属性,包括空白属性。返回的字符串使用换行符作为行分隔符,因此可以在结果上调用.Replace("\n", "\r\n"),以便在常规Windows文本框中正确显示文本。

MediaFileInfo对象包含以下属性:

  • GeneralInfo: 包含文件的一般详细信息
  • VideoStreams: 包含VideoStream对象的列表,每个对象对应文件中找到的一个视频流
  • AudioStreams: 包含AudioStream对象的列表,每个对象对应文件中找到的一个音频流
  • TextStreams: 包含TextStream对象的列表,每个对象对应文件中找到的一个文本流
  • MenuStreams: 包含MenuStream对象的列表,每个对象对应文件中找到的一个菜单流

简单地检查这些对象的属性,就可以从文件中获取数据。流类型对象是根据以下继承图构建的:

并非所有可用属性都已实现,但作者需要的当前最常用的一组属性已经实现。可以Fork这个项目,添加更多属性以从MediaInfo库中检索,甚至可以将添加发送回来,以便它们可以被添加到这个项目中。

为了简化属性的添加,封装器使用反射实现。这意味着,只需向对象添加一个属性,封装器就会将其映射到MediaInfo库中具有相同名称的相应属性。当MediaInfo属性名称与.NET属性命名不兼容时,可以使用"MediaInfoFieldName"属性进行装饰,如下所示:

[MediaInfoFieldName("Channel(s)")] public string Channels { get; set; }

这将把MediaInfo库中的"Channel(s)"属性包装到Channels POCO类属性中。

甚至可以添加自己的计算(或非计算)属性,并避免它们被映射,使用"Ignore"属性,如下所示:

[IgnoreProperty] public TimeSpan DurationSpan { get { return new TimeSpan(TimeSpan.TicksPerMillisecond * (long)Duration); } }

有些属性可能报告多个值(例如,在DTS Master Audio流中,BitRate属性可能报告Core、MA、ES流等的2个或3个值),因此可以声明一个属性为数组,并使用MediaInfoFieldName属性将其链接到正确的属性。封装器将自动检测数组属性,并在斜杠'/'字符上分割MediaInfo结果以构建数组。以下代码示例展示了如何拥有原始BitRate属性和声明为int数组的另一个属性:

public string BitRate { get; set; } [MediaInfoFieldName("BitRate")] public long[] BitRateArr { get; set; }

作为命名约定,数组属性的名称是根据原始属性加上"Arr"后缀来命名的,如上例所示。

MediaInfo库返回的所有属性都是字符串。如果声明一个属性为int、long或double,封装器将自动将结果值转换为选择的类型。但要小心,因为有些属性可能并不总是返回一个单一的数字,如BitRate示例中,可以找到由斜杠分隔的几个值。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485