65.9K
CodeProject 正在变化。 阅读更多。
Home

将 MP3、MPEG、AVI 转换为 Windows Media 格式

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.34/5 (24投票s)

2004年12月12日

CPOL

8分钟阅读

viewsIcon

398809

downloadIcon

11883

视频转换从未如此简单。使用新的 Windows Media Encoder 将不同的视频和音频格式转换为流式 Microsoft 音频视频标准格式,如 WMV 和 WMA。

引言

Windows Media Encoder SDK 是用于构建媒体应用程序的最新且最简单的 API。使用 Windows Media Encoder SDK 可以开发许多不同的应用程序,例如视频电子邮件、安全监控存档、编码器、屏幕捕获实用程序、Microsoft PowerPoint 和 Microsoft Office 插件、数字录像机以及自定义编码应用程序。它构建在 Windows Media Format SDK 之上,该 SDK 提供了更低级别的功能。与只能从 C、C++ 使用的 Windows Media Format SDK 不同,Windows Media Encoder SDK 不仅支持 .NET 语言,还支持 Visual Basic Scripting Edition、Microsoft JScript 和 Microsoft Windows Script Host 等脚本语言。

Windows Media Video (WMV) 和 Windows Media Audio (WMA) 是由 Microsoft 开发和控制的流式视频和音频技术集的通用名称。它是 Windows Media 框架的一部分。DivX 视频格式最初是基于被破解的 WMV 编解码器。在本文中,我将展示如何轻松地将不同的视频/音频格式转换为 WMV 和 WMA 格式。示例演示了 AVI、Wav、MP3、MPG、WMA 和 WMV 到 WMA 和 WMV 的转换。

为什么选择 Windows Media 格式?

WMV 和 WMA 分别设计用于处理所有类型的视频和音频内容。文件可以高度压缩,并可以作为连续数据流(在线广播)进行传输。WMV 和 WMA 文件可以是任何大小,并且可以压缩以匹配许多不同的带宽(连接速度)。其他 Microsoft 媒体格式,如 ASF 文件,与 WMV 格式类似。最重要的是,这些都是 Microsoft 标准格式。

运行示例的先决条件

  • Microsoft .NET Framework
  • Windows Media Encoder 9 系列
  • Interop.WMEncoderLib.dllInterop.WMPREVIEWLib.dll 存在于 EXE 文件中

特点

代码包含五个项目

  1. 一个用于转换视频文件的命令行实用程序。您为其提供源文件和目标文件。我主要是出于两个目的制作了这个
    • 另一个应用程序处理批量转换,因此难以理解。
    • 很多时候,您需要一个应用程序通过命令行进行转换。您可以使用此应用程序进行转换,或者将其更改为一个小型库。
  2. 一个批量转换实用程序,可自动完成一组文件的编码过程,而无需在每个文件之后配置编码会话,从而无需等到编码完成即可为下一个文件设置属性。
  3. 将两个文件合并成一个媒体文件。限制:它仅合并大小和类型相同的文件。已在项目中存在的文件上进行了测试:Source1.aviSource2.avi
  4. 将媒体文件分割成多个媒体文件。限制:已在项目中存在的文件上进行了测试:Source1.avi
  5. 合并 12 张图像形成一个视频。图像之间间隔一秒。因此,结果是 12 秒的视频。

主要术语

什么是配置文件?

配置文件指定使用哪个编解码器进行压缩,并确定输出流的数量及其比特率。每个配置文件都针对特定的受众和目标。例如,一个配置文件可能使用基于质量的可变比特率 (VBR) 进行文件下载,而另一个配置文件可能使用恒定比特率 (CBR) 进行流式传输。每个配置文件都用于特定数量和类型的源流。一次只能将一个配置文件与一个源组关联,并且同一编码会话中的所有源组必须使用相同的配置文件。

默认情况下,配置文件位于“C:\Program Files\Windows Media Components\Encoder\Profiles”。您可以为不同的受众创建自己的配置文件并随应用程序一起分发。这是有关如何创建自定义配置文件的示例:MSDN

什么是 DRM 配置文件?

DRM(数字版权管理)用于保护您的编码内容。内容被编码然后用密钥加密,然后用户需要许可证才能播放内容。此许可证包含解锁内容的密钥以及控制其使用的权利。例如,许可证确定内容可以播放的次数或许可证是否过期。请参阅 MSDN 中的如何创建/修改 DRM 配置文件。

什么是视频预处理模式?

有视频预处理模式,例如标准、隔行扫描、逆隔行扫描和隔行处理。

什么是双重编码?

如果所选配置文件允许,则可以使用双重编码来提高编码内容的质量。

运行代码

控制台应用程序、分割文件和合并文件示例相当简单。因此,我将主要解释批量编码部分。

  • 在源列表框中选择一个或多个要编码的文件,例如 C:\WINDOWS\clock.avi。给出输出文件夹的路径。我使用了“shell32”中的 SHBrowseForFolderSHGetPathFromIDList 函数来选择目录。
  • 在输出字符串文本框中提供一个前缀字符串,以标识此转换的所有批量输出。
  • 从“C:\Program Files\Windows Media Components\Encoder\Profiles”文件夹中选择一个预定义的配置文件。
  • 选择一个预处理器,在大多数情况下选择标准,除非文件格式支持不同的预处理器。
  • 选择一个 DRM 配置文件(如果可用),或者使用上述链接创建自定义配置文件。
  • 如果需要,启用裁剪。
  • 添加有关文件的信息,如作者、描述等。
  • 如果需要,启用双重编码。
  • 现在,单击数据网格上方的添加按钮以添加要编码的源。
  • 单击开始按钮开始编码。
  • 如果一切顺利,数据网格中的源将一个接一个地开始编码。
  • 在检查“工具”->“记录错误”后,您可以检查 ErrorLog.xml 文件中是否有任何错误。

流程图

下面是主要组件如何相互交互的高层流程图。它相当简单,并且展示了使用的主要组件及其交互。

Using the Code

批量编码应用程序

我使用了一个名为 strucEncodeInfo 的结构作为 sEncodeFile() 的输入参数来编码一个批次。它包含源文件、目标文件、要使用的配置文件以及用于任何文件信息(如标题、描述、作者和任何版权信息)的 DRM 配置文件。它还包含有关编码输出是否需要从任何一侧裁剪,或者是否需要任何类型的视频预处理的信息。如果配置文件支持并且布尔值为 true,则执行双重编码。

private struct strucEncodeInfo
{
    public string Source;
    public string Destination;
    public string Profile;
    public string DRMProfile;
    public string Title;
    public string Description;
    public string Author;
    public string Copyright;
    public bool Crop;
    public long CropLeft;
    public long CropTop;
    public long CropRight;
    public long CropBottom;
    public WMENC_VIDEO_OPTIMIZATION Preproc;
    public bool TwoPass;
}

创建全局编码器对象并附加 OnStateChange 事件处理程序。因此,当您开始编码时,将通过 enumState 通知您编码的状态。

WMEncoder glbEncoder = new WMEncoder();
glbEncoder.OnStateChange+=new 
  _IWMEncoderEvents_OnStateChangeEventHandler(this.Encoder_OnStateChange);

sEnumDRMProfiles() 查找任何存在的 DRM 配置文件并填充相应的组合框。sEnumPreprocess() 将预处理器的名称填充到相应的组合框中。编码从函数 sEncodeFile()glbEncoder.Start() 开始。现在是时候检查它是否已完成。下面的 while 循环等待 glbboolStartNext 变量设置为 true,并保持 GUI 响应。

while (glbboolStartNext == false) 
{
    Application.DoEvents();
}

您还可以使用菜单保存会话并在之后加载它们。您还可以保存默认会话,这样就不需要一次又一次地指定配置文件、输出路径和前缀。

命令行单文件转换

它包含来自批量编码的最少代码。

合并视频文件

它在源组中有两个源而不是一个,并且 srcGrp.SetAutoRollover (-1, "SG2"); 告诉编码器在第一个源完成后编码第二个源。同样,您可以添加任意数量的源,并且可以按顺序排列它们,也可以重叠它们。

分割文件

在这种情况下使用的类是 WMEncBasicEdit。输入文件在 BasicEdit.MediaFile 属性中设置,输出文件在 BasicEdit.OutputFile 属性中设置。设置 BasicEdit.MarkInBasicEdit.MarkOut,它们指示从开始和结束位置剪切文件的标记。计算用于分割成相等部分的标记输入和标记输出。

合并图像形成视频

它在源组中有 n 个图像源。由于静态图像没有持续时间,我使用计时器在一段时间间隔后从一个源滚动到另一个源。在此示例中,我设置了 1 秒的计时器间隔。在此示例中,我从 microsoft.public.windowsmedia.encoder 的一个帖子中获得了大量帮助。

参考文献

  • 这是我上一篇关于 Windows Media Encoder 的文章的续集:将屏幕活动捕获为视频
  • 从 Visual Basic 中 Windows Media Encoder SDK 的一个示例中获得了很大的帮助。

题外话:代码可能不是万无一失的,但它确实有效。

修订历史

  • 25-05-2005
    • 添加了合并文件功能。
    • 添加了分割文件功能。
    • 添加了流程图。
    • 添加了合并图像形成视频的功能。
  • 12-12-2004
    • 原始文章。
© . All rights reserved.