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






4.34/5 (24投票s)
视频转换从未如此简单。使用新的 Windows Media Encoder 将不同的视频和音频格式转换为流式 Microsoft 音频视频标准格式,如 WMV 和 WMA。
- 批量转换 - 下载源文件和演示项目 - 99.7 KB
- 命令行单文件转换 - 下载源文件和演示项目 - 601 KB
- 合并两个视频文件 - 下载源文件和演示项目 - 987 KB
- 分割文件 - 下载源文件和演示项目 - 570 KB
- 将图像合并成视频文件 - 下载源文件和演示项目 - 210 KB
引言
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.dll 和 Interop.WMPREVIEWLib.dll 存在于 EXE 文件中
特点
代码包含五个项目
- 一个用于转换视频文件的命令行实用程序。您为其提供源文件和目标文件。我主要是出于两个目的制作了这个
- 另一个应用程序处理批量转换,因此难以理解。
- 很多时候,您需要一个应用程序通过命令行进行转换。您可以使用此应用程序进行转换,或者将其更改为一个小型库。
- 一个批量转换实用程序,可自动完成一组文件的编码过程,而无需在每个文件之后配置编码会话,从而无需等到编码完成即可为下一个文件设置属性。
- 将两个文件合并成一个媒体文件。限制:它仅合并大小和类型相同的文件。已在项目中存在的文件上进行了测试:Source1.avi 和 Source2.avi。
- 将媒体文件分割成多个媒体文件。限制:已在项目中存在的文件上进行了测试:Source1.avi。
- 合并 12 张图像形成一个视频。图像之间间隔一秒。因此,结果是 12 秒的视频。
主要术语
什么是配置文件?
配置文件指定使用哪个编解码器进行压缩,并确定输出流的数量及其比特率。每个配置文件都针对特定的受众和目标。例如,一个配置文件可能使用基于质量的可变比特率 (VBR) 进行文件下载,而另一个配置文件可能使用恒定比特率 (CBR) 进行流式传输。每个配置文件都用于特定数量和类型的源流。一次只能将一个配置文件与一个源组关联,并且同一编码会话中的所有源组必须使用相同的配置文件。
默认情况下,配置文件位于“C:\Program Files\Windows Media Components\Encoder\Profiles”。您可以为不同的受众创建自己的配置文件并随应用程序一起分发。这是有关如何创建自定义配置文件的示例:MSDN。
什么是 DRM 配置文件?
DRM(数字版权管理)用于保护您的编码内容。内容被编码然后用密钥加密,然后用户需要许可证才能播放内容。此许可证包含解锁内容的密钥以及控制其使用的权利。例如,许可证确定内容可以播放的次数或许可证是否过期。请参阅 MSDN 中的如何创建/修改 DRM 配置文件。
什么是视频预处理模式?
有视频预处理模式,例如标准、隔行扫描、逆隔行扫描和隔行处理。
什么是双重编码?
如果所选配置文件允许,则可以使用双重编码来提高编码内容的质量。
运行代码
控制台应用程序、分割文件和合并文件示例相当简单。因此,我将主要解释批量编码部分。
- 在源列表框中选择一个或多个要编码的文件,例如 C:\WINDOWS\clock.avi。给出输出文件夹的路径。我使用了“shell32”中的
SHBrowseForFolder
和SHGetPathFromIDList
函数来选择目录。 - 在输出字符串文本框中提供一个前缀字符串,以标识此转换的所有批量输出。
- 从“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.MarkIn
和 BasicEdit.MarkOut
,它们指示从开始和结束位置剪切文件的标记。计算用于分割成相等部分的标记输入和标记输出。
合并图像形成视频
它在源组中有 n 个图像源。由于静态图像没有持续时间,我使用计时器在一段时间间隔后从一个源滚动到另一个源。在此示例中,我设置了 1 秒的计时器间隔。在此示例中,我从 microsoft.public.windowsmedia.encoder 的一个帖子中获得了大量帮助。
参考文献
- 这是我上一篇关于 Windows Media Encoder 的文章的续集:将屏幕活动捕获为视频。
- 从 Visual Basic 中 Windows Media Encoder SDK 的一个示例中获得了很大的帮助。
题外话:代码可能不是万无一失的,但它确实有效。
修订历史
- 25-05-2005
- 添加了合并文件功能。
- 添加了分割文件功能。
- 添加了流程图。
- 添加了合并图像形成视频的功能。
- 12-12-2004
- 原始文章。