首页 文章

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

提问于
浏览
0

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

  • 1

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

相关问题