




已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MS Media 编码器 SDK 简明教程第 0 章 介绍_ 2第 1 章 创建简单的编码程序_ 31.1 引用Encoder对象_ 31.2 基本思路_ 51.3 代码与说明_ 51.4 编码配置_ 71.5 WMEncoder 对象介绍_ 101.6 IWMEncSource 对象介绍_ 11第 2 章 创建多组编码程序和使用自定义配置_ 122.1 基本思路_ 122.2 代码与说明_ 13第 3 章 实现视频、音频捕捉与视频编码预览_ 153.1 列举设备_ 163.2 捕捉编码过程中的事件_ 183.3 捕捉视频、音频并进行编码_ 203.4 视频编码预览基本思路_ 203.5 视频编码预览所使用的对象_ 203.6 代码与说明_ 22第 0 章介绍本文的主要内容是讲解MS Media 编码器 SDK的基本用法,简单的说:通过这个SDK可以创建各种流媒体编码程序,甚至可以创建流媒体广播程序。被编码的输入来源可以是文件,也可以是屏幕捕捉,也可以是视频音频设备。鉴于目前国内此方面的开发资料比较少,所以编写本文,希望能够带给流媒体的开发人员一些帮助。在Windows2000推出时,其中附带了一个服务器产品“流媒体服务器”,在之后的几年中随着微软流媒体产品的完善,Windows格式的流媒体对市场的占有方面已经开始赶超Real公司的流媒体产品。微软的流媒体产品中有服务器产品,如“流媒体服务器”,也有个人产品,如“媒体播放机”、“Windows Movie Maker”和本文要介绍的“Windows Media Encoder”。微软对“Windows Media Encoder”的定义是:一种能制作Windows流媒体文件和流(包括音频和视频)的应用工具。这个工具的作用大致包括以下几个方面:l 转换编码格式。l 创建并播放网络媒体流。l 从设备中捕捉视频、音频。l 捕捉屏幕。l 创建和修改编码配置文件。l 数字媒体版权管理。微软网站相关资源:l Windows Media主页/windows/windowsmedia/cn/default.aspx,这里有微软Windows Media家族所有产品的介绍。l Windows Media 编码器主页/windows/windowsmedia/cn/9series/encoder/default.aspl Windows Media 9 系列 SDK 主页/windows/windowsmedia/cn/9series/sdk.asp。其中Windows Media 编码器 SDK/library/default.asp?url=/library/en-us/dnwmt/html/WMEncoder_9_SDK_Intro.asp,本文要讲述的内容就是这个SDK中一部分功能的应用。首先我们需要下载并两个安装包,一个是:Windows Media Encoder,另一个是:Windows Media 编码器 SDK。通过Windows Media 编码器 SDK开发的应用程序在分发时候必须与Windows Media 编码器一起发布。安装结束后,会在开始菜单中生成一个名为Windows Media的程序组,里面包含了Windows Media Encoder应用工具和SDK文档。Windows Media 编码器 SDK所支持的开发语言有VBScript,JavaScript,VB,C,C+,C#。本文所选择的开发语言是C#。SDK是以COM的形式提供各种功能的,C#在调用COM组件时候所需要的基础知识本文不再做讲解,幸运的是读者不需要对COM的模式和调用过程有过多的了解,依然可以读懂本文。使用C/C+的读者也可以直接调用COM接口来使用SDK。本文内容的安排如下:l 第一章:创建简单的编码和格式转换程序将结果保存至文件;了解编码类型;编码配置。l 第二章:创建多组编码程序,通过这个程序可以合并多个文件;使用自定义的编码配置。l 第三章:创建视频、音频捕捉应用;实现编码时效果预览;捕捉编码过程中的事件。准备工作:l Windows Media 编码器到 C:Program FilesWindows Media ComponentsEncoder 。l 安装Windows Media 编码器 SDK到C:WMSDK,在安装SDK 之后会在开始菜单“程序Windows MediaWindows Media SDK”中增加一个名为“Windows Media Encoder SDK”的帮助文件,里面包含了所有的SDK帮助信息。l 建立目录C:WMSDKDemo,用于保存视频音频文件。拷贝两个MP3文件到此目录,并改名为src1.mp3和src2.mp3,拷贝两个MPEG文件到该目录,并改名为src1.mpg和src2.mpg。l 建立目录C:WMSDKCode,用于保存演示代码文件。第 1 章创建简单的编码程序1.1 引用Encoder对象在创建一个工程之后,首先需要在工程里面添加对“Microsoft Media Encoder”的引用,方法如图2.1与图2.2。.2 基本思路首先需要创建一个 WMEncoder 对象。创建一个 IWMEncSourceGroup 对象,IWMEncSourceGroup里面保存的是需要进行编码的原始视频和音频来源。通过 IWMEncSourceGroup 创建视频源对象 IWMEncVideoSource 和音频源对象 IWMEncSource。为源对象设置输入源,在本章里使用文件作为输入源,除了文件以外还可以将视频捕捉设备等作为输入源。通过 IWMEncFile 对象设定输出目的,在本章内使用文件作为输出目的,除了文件以外还可以向流媒体服务器输出或者直接广播到网络上。遍历 IWMEncProfileCollection 对象选择一个配置文件,配置文件将决定输出的格式。开始编码并结束。1.3 代码与说明下面的代码会将C:WMSDKDemosrc1.mpg 文件编码成为C:WMSDKDemoEncodeFile_dest.wmv。/File:EncodeFile.cs/转换文件格式,将mpg文件转换为一个WMV文件/演示Media Encoder SDK的基本用法/using System;using WMEncoderLib; class EncodeFile static void Main() try / 创建WMEncoder对象 WMEncoder Encoder = new WMEncoder(); / 创建IWMEncSourceGroupCollection对象,IWMEncSourceGroupCollection用来存放IWMEncSourceGroup对象 IWMEncSourceGroupCollection SrcGrpColl = Encoder.SourceGroupCollection; / 创建IWMEncSourceGroup对象 IWMEncSourceGroup SrcGrp = SrcGrpColl.Add(SG_1); / 设定源,将视频来源和音频来源都设定为C:WMSDKDemosrc1.mpg(视频来源和音频来源可以来自不同文件) IWMEncAudioSource SrcAud = (IWMEncAudioSource)SrcGrp.AddSource(WMENC_SOURCE_TYPE.WMENC_AUDIO); SrcAud.SetInput(C:WMSDKDemosrc1.mpg, , ); IWMEncVideoSource SrcVid = (IWMEncVideoSource)SrcGrp.AddSource(WMENC_SOURCE_TYPE.WMENC_VIDEO); SrcVid.SetInput(C:WMSDKDemosrc1.mpg, , ); / 设定输出目标 IWMEncFile File = Encoder.File; File.LocalFileName = C:WMSDKDemoEncodeFile_dest.wmv; / 下面的代码用于列举所有配置文件,并把当前编码的配置设定为 Windows Media Video 8 for Local Area Network (384 Kbps) IWMEncProfileCollection ProColl = Encoder.ProfileCollection; IWMEncProfile Pro; for (int i = 0; i ProColl.Count; i+) Pro = ProColl.Item(i); if (Pro.Name = Windows Media Video 8 for Local Area Network (384 Kbps) SrcGrp.set_Profile(Pro); break; / 开始编码 Encoder.PrepareToEncode(true); Encoder.Start(); / 本示例没有判断何时编码完成,所以需要用户按键终止 Console.WriteLine(Press Enter when the file has been encoded.); Console.ReadLine(); Encoder.Stop(); catch (Exception e) Console.WriteLine(e.Message); 1.4 编码配置在 C:Program FilesWindows Media ComponentsEncoderSettings 目录下有很多预先设定的配置文件,可以用“程序Windows MediaUtilities”中的“Windows Media Profile Editor”打开。运行下面的代码可以列举系统中的可用的配置名称。/File:ListAllProfiles.cs/列举Media Encoder系统自带的所有的编码配置/using System;using WMEncoderLib; class ListAllProfiles static void Main() try / 创建WMEncoder对象 WMEncoder Encoder = new WMEncoder(); / 下面的代码用于列举所有配置文件,并把当前编码的配置设定为 Windows Media Video 8 for Local Area Network (384 Kbps) IWMEncProfileCollection ProColl = Encoder.ProfileCollection; IWMEncProfile Pro; for (int i = 0; i ProColl.Count; i+) Pro = ProColl.Item(i); Console.WriteLine(Pro.Name); Console.WriteLine(t0,Pro.Description); Console.WriteLine(); catch (Exception e) Console.WriteLine(e.Message); 通过运行 Windows Media Profile Editor 可以创建一个新的配置文件,并保存为C:WMSDKDemoProfileSample.prx (提醒一下,配置名称和文件名称可以是不同的,在引用配置时是以配置名称为准,而不是以文件名为准)。创建的配置文件如图2.3和图2.4。图2.4 音频与视频配置内容编码方式可以分为:l Constant Bit Rate (CBR):固定比特率编码。l Variable Bit Rate (VBR):非固定比特率编码。l Multiple Bit Rate (MBR):多比特率编码,这种编码情况下允许在编码结果中同时存在多个流。1.5 WMEncoder 对象介绍WMEncoder 对象是编码器中的一个基本对象,也是程序第一个创建的对象。下面介绍几个WMEncoder 中的几个常用属性和方法。属性:l IWMEncSourceGroupCollection = WMEncoder.SourceGroupCollection; 用于得到IWMEncSourceGroupCollection 对象。IWMEncSourceGroupCollection 对象用于保存需要被编码的组。l IWMEncProfileCollection = WMEncoder.ProfileCollection; 用于得到IWMEncProfileCollection 对象。IWMEncProfileCollection 对象保存有配置文件的集合。l IWMEncDisplayInfo = WMEncoder.DisplayInfo; 得到IWMEncDisplayInfo 对象。通过设置IWMEncDisplayInfo 对象中的属性可以设置编码输出的各项被显示的文字属性,例如标题、作者、版权信息等。l IWMEncFile = WMEncoder.File; 用于得到IWMEncFile 对象。在输出到文件时IWMEncFile 对象用于指定输出文件的文件名。n WMENC_ENCODER_STATE = WMEncoder.RunState; 得到当前编码任务的运行状态,WMENC_ENCODER_STATE 是一个枚举类型。允许的取值如下:n WMENC_ENCODER_STARTING = 1n WMENC_ENCODER_RUNNING = 2n WMENC_ENCODER_PAUSED = 3n WMENC_ENCODER_STOPPING = 4n WMENC_ENCODER_STOPPED = 5n WMENC_ENCODER_END_PREPROCESS = 6n WMENC_ENCODER_END_PAUSING = 7l bool = WMEncoder.AutoStop; WMEncoder.AutoStop = bool; 在源来自媒体文件时,允许指定编码过程在源文件结束时是否自动结束。方法:l void WMEncoder.Start(); 开始编码。l void WMEncoder.Stop(); 停止编码。l void WMEncoder.Pause(); 暂停编码。l void WMEncoder.Reset(); 重置对象。1.6 IWMEncSource 对象介绍IWMEncSource 对象用于表示在编码过程中使用的源,IWMEncVideoSource 对象和IWMEncAudioSource 对象都继承了IWMEncSource 对象,分别用于表示视频源和音频源。下面介绍几个IWMEncSource 中常用的属性和方法。属性:l int = IWMEncSource.MarkIn; IWMEncSource.MarkIn = int; 用于得到和设置从源中开始编码的时间位置,以毫秒为单位。例如一个音频文件作为源,音频文件总时长是120秒,那么可以设置成为从1000毫秒处开始编码。l int = IWMEncSource.MarkOut; IWMEncSource.MarkOut = int; 和MarkIn类似,用于得到和设置在源中结束编码的时间位置,以毫秒为单位。如果结束时间超过源的总时长,会产生异常。l bool = IWMEncSource.Repeat; IWMEncSource.Repeat = bool; 取得和设置源是否在到达结束时候重新回到开始处进行循环编码。l WMENC_SOURCE_TYPE = IWMEncSource.Type; 取得源的类型。WMENC_SOURCE_TYPE 是一个枚举值。允许的取值如下:n WMENC_AUDIO = 1n WMENC_VIDEO = 2n WMENC_SCRIPT = 4n WMENC_FILETRANSFER = 8方法:l void IWMEncSource.SetInput( string bstrInput, string bstrScheme, string bstrStreamName); 设置源的具体属性,在这一章里面使用了文件作为输入源,所以第一个参数 bstrInput 需要设置成为文件名。如果使用设备或者其他资源作为输入源,字符串的格式应该为: scheme:/resource name ,例如将一个摄像头作为输入源那么字符串会是:Device:/Camera_Name ,其中Camera_Name 表示摄像头的设备名字(在第三章中会详细介绍用法)。参数bstrScheme 用于表示模式名称,例如调用SetInput(Camera_Name, Device, );和调用SetInput(Device:/Camera_Name, , ); 是一样的。参数bstrStreamName 目前没有被使用。l string IWMEncSource.GetInput( out string bstrStreamName, out string bstrScheme); 用于得到做为源的模式名称,参数bstrScheme 将返回模式名称。IWMEncSource 对象需要用IWMEncSourceGroup 对象的IWMEncSource IWMEncSourceGroup.AddSource( WMENC_SOURCE_TYPE enumType); 方法来创建。参数enumType 为WMENC_AUDIO 则创建音频输入源,为WMENC_VIDEO 则创建视频输入源。第 2 章创建多组编码程序和使用自定义配置2.1 基本思路多组编码可以在编码时候指定多个输入源,例如:利用多组编码可以将多个音频、视频合并成为一个,也可以在网络上连续广播几段音频、视频。程序编写的思路和第一章中创建编码程序的思路大致相同,不同的是利用 IWMEncSourceGroupCollection 增加多个编码分组 IWMEncSourceGroup2 对象,IWMEncSourceGroup2 对象由 IWMEncSourceGroup 对象派生,所有具有IWMEncSourceGroup 的所有功能。而本示例中使用了 IWMEncSourceGroup2 的 SetAutoRollover 方法来实现不同输入源之间的转换。l void IWMEncSourceGroup2.SetAutoRollover( int lRolloverTime, string bstrSourceGroupName);设置是否在本输入源结束时候自动切换到指定的输入源,参数 lRolloverTime如果为 -1 表示自动转换,为 0 表示不自动转换。bstrSourceGroupName 指出自动转换的组名称。l string IWMEncSourceGroup2.GetAutoRollover( out object pvar); 得到自动转换设置参数,输出参数 pvar 如果返回 -1则表示自动转换,返回值表示下一个输入源的分组名,pvar 如果返回 0 则表示未设置自动转换。在实现对编码结束的判断上采用了轮询编码完成时长的方式来查询已经完成编码时长,如果编码时间到达指定要求则停止编码。查询编码完成时间将会使用到 IWMEncStatistics 对象,可以通过 WMEncoder.Statistics 来得到对象。IWMEncStatistics 对象中可以利用的属性有以下几个:l decimal = IWMEncStatistics.EncodingTime; 得到已经完成编码的时长,这个值乘以10000就是已经完成编码的毫秒值。l object = IWMEncStatistics.FileArchiveStats; 如果编码输出是文件则返回 IWMEncFileArchiveStats 对象,这个对象用于查询输出编码文件的时长和文件大小。l object = IWMEncStatistics.NetConnectionStats; 如果编码输出是网络广播则返回 NetConnectionStats 对象,这个对象用于查询连接到此编码程序的客户信息和客户数量。l object = IWMEncStatistics.WMFOutputStats; 返回 IWMEncOutputStats 对象,通过这个对象可以获得编码内容的各种属性,例如:比特率,采样率等。在本章的例子中还会使用到第 1.4节中自定义的配置。请确保你已经按照1.4节中的要求创建了 C:WMSDKDemoProfileSample.prx 配置文件。2.2 代码与说明/File:MultiGroupEncode.cs/多组编码,将多个mpg文件合并成一个WMV文件/演示Media Encoder SDK进行多组编码,使用自定义配置,判断编码完成时间/using System;using WMEncoderLib;namespace MultiGroupEncode class MultiGroupEncode static void Main(string args) try / 创建WMEncoder对象 WMEncoder Encoder = new WMEncoder(); / 创建IWMEncSourceGroupCollection对象,IWMEncSourceGroupCollection用来存放IWMEncSourceGroup对象 IWMEncSourceGroupCollection SrcGrpColl = Encoder.SourceGroupCollection; / 创建IWMEncSourceGroup对象,同时增加两个分组 IWMEncSourceGroup2 SrcGrp1 = (IWMEncSourceGroup2)SrcGrpColl.Add(SG_1); IWMEncSourceGroup2 SrcGrp2 = (IWMEncSourceGroup2)SrcGrpColl.Add(SG_2); / 设定第一个分组源,将视频来源和音频来源都设定为C:WMSDKDemosrc1.mpg IWMEncAudioSource SrcAud1 = (IWMEncAudioSource)SrcGrp1.AddSource(WMENC_SOURCE_TYPE.WMENC_AUDIO); SrcAud1.SetInput(C:WMSDKDemosrc1.mpg, , ); IWMEncVideoSource SrcVid1 = (IWMEncVideoSource)SrcGrp1.AddSource(WMENC_SOURCE_TYPE.WMENC_VIDEO); SrcVid1.SetInput(C:WMSDKDemosrc1.mpg, , ); /设定编码时长,从0秒开始到第10秒 SrcAud1.MarkIn = 0; SrcAud1.MarkOut = 10000; SrcVid1.MarkIn = 0; SrcVid1.MarkOut = 10000; / 设定第一个分组源,将视频来源和音频来源都设定为C:WMSDKDemosrc2.mpg IWMEncAudioSource SrcAud2 = (IWMEncAudioSource)SrcGrp2.AddSource(WMENC_SOURCE_TYPE.WMENC_AUDIO); SrcAud2.SetInput(C:WMSDKDemosrc2.mpg, , ); IWMEncVideoSource SrcVid2 = (IWMEncVideoSource)SrcGrp2.AddSource(WMENC_SOURCE_TYPE.WMENC_VIDEO); SrcVid2.SetInput(C:WMSDKDemosrc2.mpg, , ); /设定编码时长,从0秒开始到第10秒 SrcAud2.MarkIn = 0; SrcAud2.MarkOut = 10000; SrcVid2.MarkIn = 0; SrcVid2.MarkOut = 10000; / 设定输出目标 IWMEncFile File = Encoder.File; File.LocalFileName = C:WMSDKDemoMultiGroupEncode_dest.wmv; / 下面的代码用于列举所有配置文件,并把当前编码的配置设定为ProfileSample IWMEncProfileCollection ProColl = Encoder.ProfileCollection; / 被配置编码设定在指定目录 ProColl.ProfileDirectory = C:WMSDKDEMO; ProColl.Refresh(); IWMEncProfile Pro; for (int i = 0; i = 20000) break; System.Threading.Thread.Sleep(2000); Encoder.Stop(); Console.WriteLine(Press Enter to exit.); Console.ReadLine(); catch (Exception e) Console.WriteLine(e.Message); 第 3 章实现视频、音频捕捉与视频编码预览3.1 列举设备在实现视频和音频捕捉之前首先需要确定系统中安装的捕捉设备。在Encoder SDK中有两个对象可以用来帮助我们列举系统中安装的转换插件。l IWMEncSourcePluginInfoManager 用于列举信息收集和转换插件,对应到捕捉上就是摄像头、麦克风之类的设备。这类设备从开始捕捉之后是不可以进行操作的。l IWMEncDeviceControlPluginInfoManager 用于列举可以控制的采集设备插件,例如录像机,这类设备在开始捕捉之后是可以控制设备进行类似前进、后退、快进之类的动作。这两个对象的属性和方法是完全一样的。属性:l Count:得到转换设备的数量方法:l IWMEncPluginInfo IWMEncDeviceControlPluginInfoManager.Item( int iIndex); 得到插件信息对象l void IWMEncDeviceControlPluginInfoManager.Refresh(); 刷新插件记录集中数据l IWMEncPluginInfo IWMEncTransformPluginInfoManager.Item( int iIndex);l void IWMEncTransformPluginInfoManager.Refresh(); IWMEncPluginInfo 对象用于表示每个插件的信息。通过IWMEncPluginInfo 的属性可以获知插件的各种信息。下面的代码将列举系统中所有的插件和设备。using System;using WMEncoderLib;namespace MMES class ListAllDevices STAThread static void Main(string args) try / 创建 WMEncoder 对象 W
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教师招聘之《小学教师招聘》自我提分评估及参考答案详解【培优b卷】
- 2025年教师招聘之《小学教师招聘》综合提升练习题含答案详解【研优卷】
- 教师招聘之《小学教师招聘》高分题库含答案详解(巩固)
- 2025年教师招聘之《幼儿教师招聘》模拟考试题库B卷完整参考答案详解
- 教师招聘之《小学教师招聘》能力测试备考题【网校专用】附答案详解
- 2025数学基础自考试题及答案
- 教师招聘之《小学教师招聘》自测题库及答案详解1套
- 2025审计基础自考试题及答案
- 押题宝典教师招聘之《幼儿教师招聘》题库带答案详解(研优卷)
- 2025企业会计自考试题及答案
- 变形金刚-英语介绍课件
- 义务教育语文课程标准(2022)测试题带答案(20套)
- GB/T 27818-2011化学品皮肤吸收体外试验方法
- GB/T 22512.2-2008石油天然气工业旋转钻井设备第2部分:旋转台肩式螺纹连接的加工与测量
- GB/T 19137-2003农药低温稳定性测定方法
- 水利施工组织设计范文(完整常用版)
- DBJ53-T-40-2011 云南省城镇园林工程施工质量验收规程
- 《正确认识广告》课件3
- DB15T 2412-2021 蒙餐 蒙式牛肉丁
- GB∕T 15089-2001 机动车辆及挂车分类
- 班级自主化管理工作总结
评论
0/150
提交评论