DirectShow和媒体文件
来源:互联网 发布:淘宝上有卖岛国片店 编辑:程序博客网 时间:2024/05/02 04:49
转载自:http://blog.csdn.net/norains/archive/2010/05/24/5619451.aspx
自从在blog上公布了CMedia的完全源代码后,就陆续接到不少邮件和提问,无非是询问CMedia能播放什么样的格式;或是破口大骂,将CMedia损得一无是处,因为该类什么视频文件都无法播放;当然也有好的,对CMedia赞不绝口,称其为万能的播放类。 为什么同样的源代码,却能得到如此截然不同的评论呢?有感于此,我觉得应该写一写这其中的奥秘了。 如果你是DirectShow的高手,那么你可以不必再往下看了,因为之后的内容没有足以让你深究的价值,仅仅是给初学者的扫盲而已--并且还是尽可能地简洁。 我们首先要知道,我blog上的CMedia其实只是对DirectShow在文件播放方面的一个封装而已,本质上还是彻头彻尾的DirectShow。 先简单地看一下DirectShow的最基础框架: 首先看一下框图最中间的"系统"。这个最好理解,也没什么可说的,就是我们的WinCE系统。 其次是调用者,即播放器,也就是我blog的CMedia。它通过一定的协议,向系统咨询媒体文件的播放。 最后是filter,其实际是解码器。能不能播放,播放的效果如何,都取决于该部分。 而这三部分之中,只有相邻的是可见的。比如播放器只知道系统,filter也只知道系统,而播放器和filter两者是无法互相知晓的。 那为什么同样的CMedia在不同的系统下播放的情况完全不同呢? 我们以一个非常简单的例子说明。 学校要举行校际比赛,需要找一个跑步跑得快的学生。体育老师走到班级A门口问:"有谁跑步跑得快的?"没人回答。然后体育老师走到班级B门口问:"有谁跑步跑得快的?"这时候小明站出来了。 对于这个例子,体育老师就相当于调用者,问话内容就是协议,不同的班级就相当于不同的系统,小明那就想当然的是filter。 体育老师(调用着)还是原来的体育老师,问话的内容(协议)也是相同的,但在不同的班级(系统),得到的结果是不同的(一个能满足要求,另一个则否)。 具体到文章最前面的情况,就很容易解释了。虽然是同样的CMedia代码,但在不同的系统里,因为所具备的filter不同,所以播放情形就迥然不同。 那系统的差异性是如何造成的呢?其实在系统编译的情况下已经决定了。在定制系统时,系统工程师有没有选择相应的filter,决定了你后期播放器的兼容程度。当然咯,这些filter在WinCE下是很少的,更多依赖的是BSP厂家的功力。 最后说一下,这个和网络上流行的TCP/MP是不同的。TCP/MP并不是采用标准的directshow,而是自己有解码库,是采用自己的库来解码的,完全不依赖于系统。这样有好处也有坏处,好处是播放的格式固定,在这个系统能解码,那么在另外一个系统自然也能工作正常;坏处是,很多BSP厂家都会根据自己硬件来做filter,以加快解码速度,而这些filter无法为其所用,造成同样的硬件平台,用TCP/MP播放会比用directshow播放更为不流畅。
其实完整的框图不仅止于此,但那些对于我们从总体了解并无过多帮助,因此简略为此。
- DirectShow和媒体文件
- DirectShow和媒体文件
- DirectShow和媒体文件
- DirectShow 媒体文件回放总结
- DirectShow 媒体文件回放总结
- DirectShow 媒体文件回放总结
- DirectShow媒体文件回放总结
- DirectShow媒体文件回放总结
- directshow实现音频采集设备的输入音量控制和媒体文件播放音量控制
- 使用DirectShow播一个普通的媒体文件
- (DirectX系列03)DirectShow简单媒体文件播放
- 媒体文件和编码的区别
- Django 静态文件和媒体文件配置
- 在中Visual Studio .NET 2003利用DirectShow播放媒体文件(一)
- 在中Visual Studio .NET 2003利用DirectShow播放媒体文件(二)
- 在中Visual Studio .NET 2003利用DirectShow播放媒体文件(三)
- 在中Visual Studio .NET 2003利用DirectShow播放媒体文件(四)
- 在中Visual Studio .NET 2003利用DirectShow播放媒体文件(五)
- C专家编程—分析signal函数的原型声明{void (*signal(int sig,void (*func)(int)))(int)}(2)
- Data Pump和Exp、Imp的区别
- VIM空格和TAB转换
- Terminate Activity的错用
- Windows与Linux下TLS实现
- DirectShow和媒体文件
- spring与struts2配置所需要的包
- Shift-JIS字符集判断,注意绿色的部分是ms932包含的,用getlength()方法获得的length都是1,判断成半角会出现bug
- 程序安装时几种有错误提示的解决办法
- 剖析一个java对象初始化顺序问题
- 开始C++自学之旅!
- Srping的IOC和DI
- Linux环境进程间通信(五): 共享内存(上)
- “裸婚时代”-得妻如此,夫复何求?