加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【原】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(描述)

FilgraphManager

Builds and controls the filter graph.

构造和控制filter graph(Directshow的核心对象)

IAMCollection

Represents a collection of pins, filters, or media types.

描绘一个集合,有可能是Pin的、过滤器的或媒体类型的

IBasicAudio

Supports the audio component of the filter graph.

支持filter graph的声音组件

IBasicVideo2

Supports the video component of the filter graph.

支持filter graph的视频组件

IFilterInfo

Manages information about a filter.

管理一个过滤器的相关信息

IMediaEvent

Contains methods for retrieving event notifications.

包含了获取事件通知的一些方法

IMediaPosition

Contains methods for seeking the filter graph and setting the playback rate.

包含了搜索filter graph(当拖动进度条或指定播放时间等操作)和设置回放速率的一些方法

IMediaTypeInfo

Manages information about a media type.

管理一个媒体类型的相关信息

IPinInfo

Manages information about a pin on a filter.

管理一个过滤器管脚的相关信息

IRegFilterInfo

Represents filter information from the registry.

从注册表中获取已经注册了的过滤器信息

IVideoWindow

Manages the window of a video renderer.

管理视频呈现的窗口

 

其中最为核心的对象就是FilgraphManager了,通过这个对象我们可以开发出属于自己的多媒体播放器,但说实话,有些遗憾,如果注册表中没有对应的解码器,这个播放器仍然会有很大的局限性。

 

好在市面上有很多功能强大的“万能”解码器可以使用,例如ffdshow等,安装这些解码器时,它会自动将内部包含的解码器统统注册到注册表中正确的位置以供Directshow调用。如此一来,DIY一个属于自己的多媒体播放器,也算是事半功倍了。

 

附上FilgraphManager类的成员和方法:

Property(属性)

Description(描述)

FilterCollection

Retrieves a collection of the filters in the filter graph.

获取当前filter graph对象中的所有过滤器集合

RegFilterCollection

Retrieves a collection of all the filters listed in the registry.

获取注册表中所有已注册的屡屡器集合

 

Method(方法)

Description(描述)

AddSourceFilter

Adds a source filter to the filter graph, for a specified file.

为一个特定的文件添加一个源过滤器到filter graph

GetState

Retrieves the current state of the filter graph.

获取filter graph当前的状态

Pause

Pauses all the filters in the filter graph.

暂停filter graph中所有的过滤器(暂停过滤器管脚发送数据包)

RenderFile

Builds a filter graph that renders the specified file.

自动构造一系列过滤器以播放规定的文件

Run

Runs all the filters in the filter graph.

filter graph中的所有过滤器开始运转(让过滤器中的管脚开始发送数据包)

Stop

Stops all the filters in the filter graph.

停止filter graph中的所有过滤器的运作

StopWhenReady

Pauses the filter graph, allowing filters to queue data, and then stops the filter graph.

暂停filter graph,允许其中的过滤器组织数据队列,然后停止filter graph

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有