wince 开发CTransInPlaceFilter学习笔记《一》

前因:

原来用过一点点dshow的东西,只是很在网上找了个CDXGraph类,傻傻的拿过来,能播放视频也就没管了。

 

后来因为项目需求,需要在播放视频的时候添加滚动字幕,只好想办法查找相关的资料。

 

再网上翻了好久,没找到想要的比较简便的方法,无奈只好去啃陆其明老师的CFilterTileOverlay,希望能把这个Filter移植到wince下,来实现wince设备上视频播放添加滚动半透明滚动字幕的功能。

 

也就是在这个学习的过程中,稍微了解了dshow的工作机制,什么叫filter,filter的作用等,虽然还是感觉一头雾水,但总算学了点皮毛的皮毛。。

 

正文:

闲话不多说,进入主题了。

 

首先,需要将CFilterTitleOverlay跑起来

 

费了好大的力气(我比较笨。。),好不容易将CFilterTItleOverlay编译通过,并使用graphedt.exe测试通过,能实现半透明滚动字幕的功能了(期间遇到画面倒置啊,不知道要怎么调试filter啊等等乱七八糟的问题,网上都能查到,就不多说了)。

 

这样算是迈出了万里长征第一步,然后就需要将这个filter移植到wince下

然后。。然后我就傻眼了,什么都不会。。

 

第一步,先写个自己的CTransInPlaceFilter吧,哪怕不实现任何功能,最起码有个架子在吧。

新建了一个类,从CTransInPlaceFilter继承,实现CheckInputType和Transform这两个接口

 

class CAlphaFilter :
 public CTransInPlaceFilter
{
public:
 CAlphaFilter(TCHAR *tszName, LPUNKNOWN punk, HRESULT *phr);
 ~CAlphaFilter(void);

 

 HRESULT CheckInputType(const CMediaType* mtIn);
 HRESULT Transform(IMediaSample *pSample);
};

 

然后,就遇到了第一个问题

error C2504: “CTransInPlaceFilter”: 未定义基类

 

看起来是没包含头文件的缘故,查下,发现CTransInPlaceFilter在transip.h里定义的

#include <transip.h>

试一下

 

果然不报

error C2504: “CTransInPlaceFilter”: 未定义基类

 

它换成了

error C2504: “CTransformInputPin”: 未定义基类

 

这个是在transip.h里面报的错误

 

class CTransInPlaceInputPin : public CTransformInputPin

CTransformInputPin是在另外个头文件<transfrm.h>里定义的,

而transip.h并没有#include <transfrm.h>

 

总不会要我改wince sdk里的头文件吧。。

不知道要如何处理,翻资料先。。

 

翻来覆去的找资料,都没找到什么有提示性的信息,突然想起来,之前用的CDXGraph类并没有遇到这样的问题,可以参考下这个类。

 

看了下CDXGraph,果然在头文件中有两个

#include <strmif.h>
#include "dshow.h"

 

添加了这两个头文件,果然问题解决了!

 

然后又出现了新的问题。。

error LNK2001: 无法解析的外部符号 CLSID_ALPHAFILTER

这CLSID_ALPHAFILTER是我用VS2008生成的,怎么会说是无法解析的外部符号呢。。纠结了。。

 

看下CFilterTitleOverlay,发现少了个

#include <initguid.h>

 

添加下头文件,OK了,编译一下,能通过,第一步总算是告一段落了。

 

你可能感兴趣的:(wince 开发CTransInPlaceFilter学习笔记《一》)