开发DMO decoder给WMP使用播放视频文件经验一贴

仅以此文怀念过去煎熬的一周半。。。感谢各位同事的大力协助和指点。

上上周被分配个任务做一个asf文件的video解码插件,本来做的transformfilter,其他播放器都能自动加载到且可以播放,但wmp找不到解码器。没办法,传闻DMO可以。 然后就仿照directx的DMO例子dmosample做了一个dmo decoder插件,graphedit和其他的播放器也都能正常加载并播放文件,wmp依然不行,wmp9报错为:此对象只能创建为集合对象。


历经尽煎熬,终于自己搞定,经验证WMP10+的版本都可以完美播放,还有些许不足之处(WMP9播放不了)慢慢解决。
不像某些鸟人大家顶半天丫自己解决的,也不拿出来分享怎么解决的。在此深深鄙视之。。


虽然CSDN发的贴没人顶,但本着技术分享,惩前毖后,治病救人,共同进步的原则,简单说下自己的解决方法:

1. graphedit和wmp不能加载dmo的话,应该是InternalGetOutputType和InternalCheckOutputType函数写的有问题,尤其是InternalGetOutputType对输出类型的创建,一定要对应DMO注册的输出类型,写对参数。尤其是WMP这哥们你给错哪怕一个不起眼的参数,丫都加载不到你的DMO。注册DMO输出类型时可以多些两种类型比如MEDIASUBTYPE_RGB24  MEDIASUBTYPE_YV12 MEDIASUBTYPE_IYUV等、这样不同的播放器或者GraphEdit可以只能连接。


2. 播放文件时没有自动刷新以及时间戳不起作用如下解决:
InternalGetOutputType中 使用的MoInitMediaType(pmt,cbformat)创建输出媒体类型时,cbformat参数设置为1128,而不是sizeof(VIDEOINFORHEADER)。
MSDN对cbformat注释为Number of bytes to allocate for the format block. Can be zero. 总以为是sizeof(VIDEOINFORHEADER)才行,毕竟后面的pbFormat指向的就是这么个数据结构。但弄来弄去都不对。debug的时候总发现InternalCheckoutputtypoe中检验不过,pmt->cbformat总有个1128的值,甚为不解,那里来的?最后按照上述方式搞了一下居然可以了,还是不甚解。试验的灵感来源于这里:http://www.eggheadcafe.com/microsoft/Win32-DirectX-Video/31994560/using-wmv9-encoder-dmo-in-wrapper--in
-directshow.aspx。没看太懂,貌似和WMV9有什么关系。


总之是WMP比较另类,用WMP调试会发现和用grapedit调试走的不是一个路线。。。


以上见解仅供参考,毕竟有写疑点自己也没闹太明白,凑合看吧,有帮助的看看,没帮助的请飘过...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值