相信搞directshow开发的CSDN们也会经常遇到这样的问题:
当你将一个文件直接拖到graphedit建图播放的时候,会返回无法加载此文件的源筛选器, ERROR: 0x80040241的错误;但是当你手动的去加载一个file source(async) filter,然后再去自动render pin 的时候,就可以成功的把graph图build出来,而且可以正常播放了。
那我们不禁会问这里面的原因是什么呢?
在给出自己的一个解决方案之前,推荐大家去看下这个文章:http://msdn.microsoft.com/zh-cn/library/dd377513.aspx
也许看了这篇文章以后,大家可以自行找出多种解决这个错误的方法。
通过文章我们知道,graphedit 去为一个文件加载source filter的算法大抵上是通过匹配注册表里的一些信息来完成的:
graphedit首先去判断你这个文件源地址是不是基于某一种协议,如果是,则在注册表中查找这个协议相关的注册表信息,找到Source Filter
如果源文件地址不是某种协议,则在HKEY_CLASSES_ROOT\Media Type\Extensions下面查找和源文件扩展名一样的项,如果找到,则进一步取得Source Filter
如果前面两个条件都不满足,则用check Bytes 的方式,即通过检查文件中特定位置的内容和HKEY_CLASSES_ROOT\MediaType\{major type}\{subtype}里面的项进行匹配
具体的匹配规则可以参考上面的链接
如果前面三种方式都无效的话,则默认加载file source(async) filter作为源筛选器。
以上的论述就是大概的graphedit 为文件选择源筛选器的方式
以在graphedit里面打开一个flv视频文件为例,按照以上的策略来说,对于三种条件都不满足的情况下,应该选择file source(async) filter作为源筛选器,
但是在xp系统下的测试,给出 ERROR: 0x80040241的错误,至于为什么会出现这样的错误不得而知,如果有哪位知道原因的话,可以一起交流下
而在win7的系统下,flv文件却是默认加载file source(async) filter的
这里我用了一种比较简单的方式解决了这个问题:
在HKEY_CLASSES_ROOT\Media Type\Extensions下面添加一个扩展名为.flv子项,子项里面的内容如下:
{E436EBB5-524F-11CE-9F53-0020AF0BA770}这个GUID就是file source(async) filter的GUID
这样Graphedit就可以为扩展名为flv的文件正确的加载源筛选器了