从我的输出引脚连接到avi mux

时间:2014-03-05 10:18:42

标签: c++ directshow

我希望我的过滤器被接受为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;
}

以下是我想要连接的过滤器:

enter image description here

以下是我尝试连接过滤器时获得的图表构建报告:

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方法。但它仍然无法运作

1 个答案:

答案 0 :(得分:1)

你的输出引脚说它提供了AVI类型的流,但这是 AVI Mux想要的东西,这就是它本身应该产生的东西。它想要输入的是视频流或音频流,或者可能是某些其他类型的数据但不是AVI流。你的过滤器真正产生什么样的数据?如果是某些视频,则输出主要类型=视频,子类型=视频格式的guid。