前因:
原来用过一点点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了,编译一下,能通过,第一步总算是告一段落了。