在程序中更改Filter
我改了memfile这个例子,想用它来播放文件,但我怎样才能将它缺省调用的
MPEG Video Decoder这个Filter换成我自己的Filter呢?
如何编程实现?
问题点数:100、回复次数:7Top
1 楼cofei()回复于 2001-07-09 16:40:01 得分 0
gzTop
2 楼sanjiang()回复于 2001-07-09 21:25:10 得分 0
如何?
Top
3 楼sky_horse()回复于 2001-07-11 09:03:12 得分 20
用手工的方式,先用createinstance创建出你要用的filter,有的clsid可能要去查,然后用graphbuilder的方法addfilter加入到graph,再找到前一个filter的output pin,与下一个filter的input pin相连,大致步骤就是这样Top
4 楼sanjiang()回复于 2001-07-11 11:39:58 得分 0
是不是还要枚举各个pin?
有没有例子可以给我参考?Top
5 楼capboy(帽子)回复于 2001-07-11 11:54:54 得分 0
步骤和sky_horse()说的差不多,我也想知道怎么得到具体 的filter呢。我又怎么知道是个什么filter
是使用IEnumPins么?Top
6 楼roger_zhao(roger)回复于 2001-07-12 00:39:08 得分 80
先应该枚举设备,然后绑定在IBaseFilter对象上。具体的代码如下(只有枚举设备部分):
ICreateDevEnum *pCreateDevEnum;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void**)&pCreateDevEnum);
if (hr != NOERROR)
{
TRACE("Error Creating Device Enumerator\n");
}
IEnumMoniker *pEm;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
&pEm, 0);
if (hr != NOERROR)
{
TRACE("Sorry, you have no video capture hardware\n");
}
pEm->Reset();
ULONG cFetched;
IMoniker *pM;
UINT uIndex = 0;
while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)
{
IPropertyBag *pBag;
hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
if(SUCCEEDED(hr))
{
VARIANT var;
var.vt = VT_BSTR;
hr = pBag->Read(L"FriendlyName", &var, NULL);
char szName[256];
WideCharToMultiByte( CP_ACP, 0, var.bstrVal, -1, szName, 256, 0, 0 );
DevMonikers.Add( szName );
SysFreeString(var.bstrVal);
pM->AddRef();
pBag->Release();
}
pM->Release();
uIndex++;
}
pEm->Release();Top
7 楼kissfire(kissfire)回复于 2002-03-18 18:21:37 得分 0
OKTop




