我希望我的过滤器被接受为avi mux过滤器的输入。但它拒绝与VFW_E_CANNOT_CONNECT错误的连接。
这就是我的所作所为:
在我的outputpin类中,我实现了Connect(IPin* pin, AM_MEDIA_TYPE *pmt)
方法。
然后我调用我的GetMediaType
函数,它给了我CMediaType
对象:
请参阅下面的GetMEdiaTypeMethod
正如您所看到的,它具有MEDIATYPE_Stream
的主要类型以及MEDIASUBTYPE_Avi
的子类型,因为这是avi mux过滤器将接受的格式。
最后在Connect
中,我调用了我的对等引脚的ReceiveConnection
方法。
这是我的整个Connect方法:
HRESULT MCMyOutputPin::Connect(IPin* pPin, const AM_MEDIA_TYPE *pmt)
{
CMediaType* mediatype;
HRESULT hr = GetMediaType(0, mediatype);
if (FAILED(hr)) return hr;
hr = pPin->ReceiveConnection(this, mediatype);
return hr;
}
编辑:我还没有解决问题。它仍然拒绝连接。 这是我的新GetMediaType方法,它初始化AM_MEDIA_TYPE及其所有需要的值和结构:
HRESULT MCMyOutputPin::GetMediaType(int i, CMediaType *pmt)
{
if (i < 0)
{
myLogger->LogDebug("Invalid arg in getmediatype", L"D:\\TEMP\\yc.log");
return E_INVALIDARG;
}
if (i == 0)
{
myLogger->LogDebug("On GetMediaType", L"D:\\TEMP\\yc.log");
VIDEOINFO *pvi = (VIDEOINFO *)pmt->AllocFormatBuffer(sizeof(VIDEOINFO));
if (NULL == pvi)
return(E_OUTOFMEMORY);
ZeroMemory(pvi, sizeof(VIDEOINFO));
pvi->bmiHeader.biCompression = 0x3231564e;
pvi->bmiHeader.biBitCount = 12;
pvi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pvi->bmiHeader.biWidth = 256;
pvi->bmiHeader.biHeight = 240;
pvi->bmiHeader.biPlanes = 1;
pvi->bmiHeader.biSizeImage = GetBitmapSize(&pvi->bmiHeader);
pvi->bmiHeader.biClrImportant = 0;
pvi->AvgTimePerFrame = 333333;
pvi->dwBitRate = 0;
pvi->dwBitErrorRate = 0;
SetRectEmpty(&(pvi->rcSource));
SetRectEmpty(&(pvi->rcTarget));
pmt->SetFormatType(&FORMAT_VideoInfo);
pmt->SetFormat((BYTE*)pvi, sizeof(pvi));
pmt->SetTemporalCompression(FALSE);
pmt->SetType(&MEDIATYPE_Video);
const GUID SubTypeGUID = GetBitmapSubtype(&pvi->bmiHeader);
pmt->SetSubtype(&SubTypeGUID);
pmt->SetSampleSize(pvi->bmiHeader.biSizeImage);
return S_OK;
}
return VFW_S_NO_MORE_ITEMS;
}
以下是我想要连接的过滤器:
以下是我尝试连接过滤器时获得的图表构建报告:
0.000 sec Filter Selected : ffdshow Video Decoder
0.015 sec Created filter
CLSID {04FE9017-F873-410E-871E-AB91661A4EF7}
Object Name
Merit 0xff800001
Version 0x00000002
0.015 sec Filter Selected : DirectVobSub (auto-loading version)
0.046 sec Created filter
CLSID {9852A670-F845-491B-9BE6-EBD841B8A613}
Object Name
Merit 0x00800002
Version 0x00000002
0.046 sec Filter Selected : WMVideo8 Encoder DMO
0.046 sec
CLSID {94297043-BD82-4DFD-B0DE-8177739C6D20}
0.046 sec Filter Selected : WMVideo9 Encoder DMO
0.046 sec
CLSID {94297043-BD82-4DFD-B0DE-8177739C6D20}
0.046 sec Filter Selected : AVI Decompressor
0.046 sec Created filter
CLSID {CF49D4E0-1115-11CE-B03A-0020AF0BA770}
Object Name
Merit 0x00600000
Version 0x00000002
我根据sdk中的示例更新了我的GetMediaType方法。但它仍然无法运作
答案 0 :(得分:1)
你的输出引脚说它提供了AVI类型的流,但这是不 AVI Mux想要的东西,这就是它本身应该产生的东西。它想要输入的是视频流或音频流,或者可能是某些其他类型的数据但不是AVI流。你的过滤器真正产生什么样的数据?如果是某些视频,则输出主要类型=视频,子类型=视频格式的guid。