【原】C#程序员如何开发播放视频器
(2013-04-09 13:53:58)| 分类: 我孜孜的学 |
C#程序员如何开发播放视频器
在还没有接触到多媒体播放的时候,作为C#程序员的我,一直认为这应该是个很容易的事情,写几个类再加上几行控制代码,播放器应该就可以工作了,但当我开始关注多媒体开发的时候,我发现之前的想法错了,甚至于对继续是否学习C#这件事本身,我也产生了巨大的疑问,关于这些,我们还是一点点说起吧。
抛开代码,让我想象一下一段视频应该是如何被播放出来的吧,我觉得至少应该有以下几个步骤:
1.
2.
3.
按道理说,我觉得播放一个多媒体文件应该不会比操作一个文本文件更复杂,即便是增加一些高级控制,例如分段预览、检查数字证书什么的,也应该像IIS处理Web请求时那样,增加几个过滤器就好了,可事实上,微软对于如何播放多媒体有他自己的设想,而且这个想象的复杂程度,将大大超过我的预期。
当我知道,需要使用Directshow才能开发多媒体时,我又有了一些干劲,因为学到新知识总是一件快乐的事,当然,这有前提,这个知识应该是有用且有效率的。掰手指头就可以算出1+1等于几,反过来如果用计算机来算,就显得有点大材小用了,而事实上,在没有对Directshow有完完全全、彻彻底底的认识前,我也只能认为Directshow只用来负责播放多媒体文件,有点大材小用了。
我并不是在夸奖Directshow,相反,我想说Directshow是一个太过于复杂的东西,不仅仅是因为它的设计初衷超过了单单是播放多媒体这个范畴而已,Directshow的管脚(Pin)设计和链接协议,才是真的令人头疼不已。
微软提供了一些Windows Media Player的编程接口用来播放微软支持的编码格式的多媒体文件,但是对于不支持的编码,则需要对应的解码器,使用这些解码器的方法是正确的注册它们,注册后,Windows Media Player就可以自动找到合适的解码器来解码要播放的文件。可以把Media Player看做是Directshow的应用案例,查找注册的解码器实际上是通过Directshow的智能匹配来完成的。
目前的需求只是播放现有的多媒体文件,所以涉及不到过多的Directshow的核心内容,只要知道Windows是使用它来操作多媒体的就可以了。
经过查看MSDN,我发现微软为Visual Basic提供了一个Quartz.dll的对象用来开发Directshow的应用,作为C#程序员我感到很受伤……不过好在都是.NET框架下的,只要能用,我也就没有什么门第之见了,先把Quartz.dll引入工程中先看看究竟吧。
Quartz.dll文件位于[Windows安装目录]\System32\下,通过引用,可以将Quartz.dll文件引入到工程中,当然,是通过Interop(协作性)的模式,因为Quartz.dll本身是个COM组件,所以.NET自动为Quartz.dll文件创建了一个访问代理,我们则通过代理来使用Quartz.dll中提供的对象和功能。
Quartz.dll中主要涉及到的对象如下表:
|
Object(对象) |
Description(描述) |
|
Builds and controls the filter graph. 构造和控制filter graph(Directshow的核心对象) |
|
|
Represents a collection of pins, filters, or media types. 描绘一个集合,有可能是Pin的、过滤器的或媒体类型的 |
|
|
Supports the audio component of the filter graph. 支持filter graph的声音组件 |
|
|
Supports the video component of the filter graph. 支持filter graph的视频组件 |
|
|
Manages information about a filter. 管理一个过滤器的相关信息 |
|
|
Contains methods for retrieving event notifications. 包含了获取事件通知的一些方法 |
|
|
Contains methods for seeking the filter graph and setting the playback rate. 包含了搜索filter graph(当拖动进度条或指定播放时间等操作)和设置回放速率的一些方法 |
|
|
Manages information about a media type. 管理一个媒体类型的相关信息 |
|
|
Manages information about a pin on a filter. 管理一个过滤器管脚的相关信息 |
|
|
Represents filter information from the registry. 从注册表中获取已经注册了的过滤器信息 |
|
|
Manages the window of a video renderer. 管理视频呈现的窗口 |
其中最为核心的对象就是FilgraphManager了,通过这个对象我们可以开发出属于自己的多媒体播放器,但说实话,有些遗憾,如果注册表中没有对应的解码器,这个播放器仍然会有很大的局限性。
好在市面上有很多功能强大的“万能”解码器可以使用,例如ffdshow等,安装这些解码器时,它会自动将内部包含的解码器统统注册到注册表中正确的位置以供Directshow调用。如此一来,DIY一个属于自己的多媒体播放器,也算是事半功倍了。
附上FilgraphManager类的成员和方法:
|
Property(属性) |
Description(描述) |
|
Retrieves a collection of the filters in the filter graph. 获取当前filter graph对象中的所有过滤器集合 |
|
|
Retrieves a collection of all the filters listed in the registry. 获取注册表中所有已注册的屡屡器集合 |
|
Method(方法) |
Description(描述) |
|
Adds a source filter to the filter graph, for a specified file. 为一个特定的文件添加一个源过滤器到filter graph |
|
|
Retrieves the current state of the filter graph. 获取filter graph当前的状态 |
|
|
Pauses all the filters in the filter graph. 暂停filter graph中所有的过滤器(暂停过滤器管脚发送数据包) |
|
|
Builds a filter graph that renders the specified file. 自动构造一系列过滤器以播放规定的文件 |
|
|
Runs all the filters in the filter graph. 让filter graph中的所有过滤器开始运转(让过滤器中的管脚开始发送数据包) |
|
|
Stops all the filters in the filter graph. 停止filter graph中的所有过滤器的运作 |
|
|
Pauses the filter graph, allowing filters to queue data, and then stops the filter graph. 暂停filter graph,允许其中的过滤器组织数据队列,然后停止filter graph |

加载中…