Directshow的优点与缺点

   Directshow是微软研发出来的一个多媒体框架,它能实现常见多媒体应用的功能,比如文件/流的接收读取 、AV文件的解交织(Demux)、音视频的解码、音视频的同步、音视频的展现等。曾几何时,Directshow是Windows平台的一项热门技术,是做Windows多媒体开发的不二之选,在工业上应用得很广泛。现在市面上很流行的播放器,比如MPC,暴风影音,快播等,都是基于Directshow技术开发的。但是,随着时代的发展,一个框架如果不继续发展,总会有被淘汰的危险,或者被新的更好的框架代替。现在微软已经推荐开发员用他新的框架:Windows Media Foundation, 而使用Directshow来做开发的人也越来越少(看各大招聘网站上招Directshow程序员的职位数就知道了)。

   无可否认,Directshow是一个很优秀的框架,具有很多优点。它通过以Filter的形式将复杂的多媒体处理的工作封装起来,程序员通过访问COM接口就能够实现很丰富的多媒体应用功能,大大降低了多媒体开发的难度。比如做一个播放文件的应用,用Directshow只需要将各种解析文件的Source Filter或分离器,还有解码器、渲染器连接起来,连接成一个链路图(叫“Filter Graph”),然后运行起来就可以工作了。如果不需要自己开发底层Filter,程序员用Directshow开发要做的工作很少,开发难度不高。Directshow框架设计有两个核心的优点:1. Plug-in based,即基于插件式,将每个实现具体单一功能(decoding、filter、...)的单元称为一个组件(component),组件有相对固定的接口; 2. Pipeline-based,允许多个Filter通过接口间的Pin串联起来,以完成特定的功能。Directshow SDK带了很多内置的Filter,已经支持对大多数文件/流格式的分离、编码、解码、显示的功能,另外程序员可以自己开发Filter以扩充功能,所以使用Directshow有很好的扩充性。除此之外,Directshow还有一个很好的优点:具有很健全的文档和例子,很多细节说得很清楚,方便开发者入门。

    但是,Directshow也有自己的限制和缺点。由于其较好的封装性,隐藏了内部很多处理细节,对外暴露很少接口,当程序员要实现某些系统Filter无法满足的“特殊定制”功能时,需要自己开发Filter,发觉要了解很多Filter的知识,这时Directshow的缺点就暴露出来了。首先,开发一个功能完善的Filter不是一件容易的事,需要考虑很多细节,要理解Filter组件间的通信机制,比如:如何协商Pin之间的媒体类型,确定Output Pin的Sample的缓冲区大小、动态重连、状态转换、函数的加锁问题,以及如何处理音视频的时间戳同步。使用Directshow框架开发往往花很多时间在Filter接口的实现以及内部事件的处理上,要比纯粹不用Filter的方式做多很多“封装”的工作,结果造成开发周期延长。第二,缺乏灵活性,由于插件机制的存在,一切要遵守Directshow的接口规范,为保持插件间工作的独立性,不能直接访问另外一个插件的内部接口或数据,当要获取某个插件内部的信息时,本身是直接调一两个API就可以搞定的事却要绕一个大圈。第三,当创建的Filter链路分支很多时,用Directshow做起来很复杂。太多的Filter连接起来首先Filter之间拷贝数据有开销,还有要实现的功能点太多使得程序员要根据不同的情况构建不同的Filter  Graph,增加实现复杂度。第四,不能跨平台,这可能是大多数程序抛弃或不用Directshow框架的原因。因为现在操作系统平台很多,PC的操作系统就有Windows,Linux、Mac等,而移动平台的系统Android、IPhone也渐渐在用户中普及。软件公司做一个多媒体应用往往需要考虑移植到多个平台,但是由于Directshow绑定死了Windows平台,就限制了用户使用的系统范围,如果在别的系统上又要用其他方式重新实现,为何不用较为通用的支持跨平台的方案(比如Gstreamer)呢?

    所以,Directshow有优点也有很多缺点,并不适合任何场景的多媒体应用开发,大家要根据自己的使用场景和平台,选择合适的框架。

你可能感兴趣的:(directshow)