如何在 VB.NET 中获取媒体文件属性
获取 FileInfo 之外的媒体文件属性。
引言
您可能需要一些 File 或 FileInfo 框架类未提供的媒体文件属性。据我所知,.NET Framework 没有执行此操作的类。幸运的是,SourceForge 提供了一种解决方案。它就是 Mediainfo.dll。该文件附带一个独立的程序,可以以多种方式显示详细程度不一的信息。或者,您可以使用一个名为 MeditaTab 的第三方程序。该程序会在 Windows 资源管理器的属性对话框中添加一个新选项卡。
但是,对于 BASIC 程序员来说,mediainfo DLL 存在一个主要的缺点。它是用 C++ 编写的。幸运的是,另一位开发人员 Tony George 提供了解决方案。他为MediaInfo.dll编写了一个 .NET 包装器,名为 MediaInfoNET.dll。
背景
通过使用 Visual Studio 的对象浏览器、调试器和反复试验,我发现MediaInfoNet.dll通过六个流公开MediaInfo.dll中的数据:Audio、Video、Image、Text、Menu和Chapter。这些流中的每一个都公开了与其他流几乎相同的数据,并由其自己的一组特定属性进行补充。当两个流性质相同时(例如存在两个音频通道时),这两个流会单独呈现。
Using the Code
代码本身相对简单且有注释。但是,有些地方可能对您有所顾虑。
语言和本地化
我是一个说法语的人。因此,我最初使用法语、法语版的 Visual Studio、法语变量名等来编写程序。程序几乎完成时,我想在 CodeProject 上发表一篇关于它的文章。但是,我不想将所有变量名都更改为英文。因此,我添加了英文注释,包括一些变量名的翻译。我还将程序本地化为英文。我认为这些注释对读者将非常有帮助。因此,尽管有些专家持不同意见,但我认为这是一个给代码添加注释的好理由。
您会注意到我添加了一个法语的Form1
和一个法语的资源文件。这并非必需,因为应用程序的默认设置也为法语。但是,您可以轻松地将应用程序设置为您自己的语言。对于所有讲法语或英语以外语言的读者来说,这一点尤其适用。您只需要修改默认的Form1
和默认的资源文件即可。
在进行本地化过程本身之前;这里是此应用程序中使用的实际资源文件。
应用程序文化 | 应用程序语言 | 资源文件 | 目的 |
默认 (Par défaut) | 法语 (Français) | Form1.resx, Ressources.resx | 当没有特定的语言(例如 fr-CA、fr-BE、en-CA、en-US)或中性语言(例如 fr、en)资源文件时使用。 |
法语 (Français) | French | Form1.FR.resx, Ressources.FR.resx | 当没有特定的法语(例如 fr-CA、fr-BE、fr-FR)资源文件时使用。这是中性的法语。 |
英语 (Anglais) | English | Form1.EN.resx, Ressources.EN.resx | 当没有特定的英语(例如 en-CA、en-US、en-GB)资源文件时使用。这是中性的英语。 |
现在,是时候本地化应用程序了。这需要两个步骤:
- 本地化窗体
- 本地化其他元素,如用户说明和输出文本
本地化过程
您的项目中的每个新窗体都是一个默认(Par défaut)窗体,如图 1所示。
如前所述,如果您想使用您自己的语言作为默认语言,请将法语文本替换为每个控件的text属性值,使用您自己语言的等效术语。如有需要,可以使用表 2作为参考。在这种情况下,您无需修改窗体的Language
属性。将其保留为默认(Par défaut),如图 2所示。VB.NET 将自动处理资源文件。
本地化窗体的第一步是将Localizable
属性从False
更改为True
。这样我们就可以开始翻译控件的text属性值了。
让我们制作Form1
的英文版本。
- 将窗体的语言从默认(Par défaut)更改为英语(Anglais)。(事实上,对于您选择的任何语言,过程都将是相同的。)图 3 - Language 属性设置为 English
- 将控件的text属性翻译为英语(或您想要的任何其他语言)。我使用了我认为通常用作我最初法语文本的英语等效词语,但如果您愿意,也可以使用其他词语。
因此,以下是我在窗体上使用的法语术语及其英语翻译:
French English Propriétés de fichiers multimédias 媒体文件属性 Conserver les données existantes 保留现有数据 Même fichier 保留现有文件 Fichier 文件 搜索 扫描驱动器 Propriétés 属性 预览 打印预览 Mise en page 页面设置 Imprimer 打印 退出 退出 表 2 - 法语术语及其英语等效词。 - 现在是时候处理应用程序的资源文件了。首先,让我们看一个默认资源文件的摘录。图 4 - 法语语言资源
现在这是上述英文版本的摘录。
图 5 - 英语语言资源您会注意到资源名称(Noms)是由MediaInfoNet.dll提供的属性的名称。这些名称用于调用所需的文本。
打开默认资源文件(Resources.resx),将值(Valeurs)更改为英文术语(或您想要的任何其他语言)。如果您想用您自己的语言创建默认文件,请将文件保存为其自己的名称(Resources.resx)。如果它是本地化语言,请将其保存为新名称。此名称必须为Resources.xx.YY.resx或Resources.xx.resx。xx表示中性文化,例如法语的fr,英语的en等等。YY表示特定国家/地区,例如加拿大的CA,法国的FR,英国的GB,美国的US,等等。YY和xx都必须符合 VB 标准。
- 如果您想查看结果,您将需要更改您的应用程序语言,除非您刚刚将默认法语更改为您自己的语言。越早越好。我个人在启动事件过程中执行此操作。
Private Sub MyApplication_Startup(sender As Object, _ e As ApplicationServices.StartupEventArgs) Handles Me.Startup My.Application.ChangeCulture("en") My.Application.ChangeUICulture("en") End Sub ...
- 运行您的应用程序,看看!您的窗体现在是英文的了。图 6 - 窗体的英文版本
重要提示
这个应用程序很小。因此,将文本字符串存储在主资源文件中没有真正的问题。但更大的应用程序可能需要使用辅助程序集进行本地化。
外部文件
您需要 .NET Framework 未提供的另外五个文件。
- MediaInfo.dll:此文件用于从媒体文件中获取数据。它必须与MediaInfoNet.dll位于同一文件夹中。您不能对其建立引用。
- MediaInfoNet.dll:此文件将MediaInfo.dll中的数据暴露给您的程序。您必须对其建立引用。
- RichTextBoxImprimable.dll,字面意思是
PrintableRichTextBox
:一个RichTextBox
,它允许轻松地打印格式化的文本和图形。代码和详细信息来自Microsoft。您必须对其建立引用。 - RichTextBoxImprimable.xml 和 RichTextBoxImprimable.pdb:这两个文件与RichTextBoxImprimable.dll配套。
关注点
这是我提交给 CodeProject 的第一篇文章。我想写一些容易理解的内容。我希望它恰到好处,不会太简单。
Avast Anti Virus 不喜欢我的第二种方法,并系统地检测到了病毒。因此,您可能会遇到同样的问题。我已切换到其他 AV 软件。这个软件什么也没做。我发誓,我没有放任何病毒进去。
历史
- 2013 年 9 月 26 日:原始文章