VC做DirectX8的开发,这个问题搞了一周了,始终解决不掉。
已经放1000多分了,老板要发飙了,请大家帮忙看看,我会再开贴给分的。决不食言。   另外,非常感谢cvav()给我的帮助,只是我自己太笨,一直搞不好............    我的目的是用我的SourceFilter取代系统的MPEG-1 Splitter来和下一级的MPEG Video Decodec连接。
就是说,系统的一个播放MPEG1的典型Graph是这样:

File -> MPEG-I Splitter -> Video Decoder -> VideoRender 我想自己做一个MySourceFilter,然后建立这样的Graph:

MySourceFilter -> Video Decoder -> VideoRender    我的思路是将SourceFilter的OutPin设置为和MPEG-1 Splitter的OutPin一样。我就重载了SourceStream的CheckMediaType,GetMediaType。
在CheckMediaType中,如果进来的是Video类型就返回S_OK。
在GetMediaType中,返回类型为MEDIATYPE_Video,MEDIASUBTYPE_MPEG1Packet.
但在GraphEdit中,要将它和MPEG Video Decodec,系统总是说找不到合适的中介过滤器,返回不能连接,错误码0x80040217。把代码贴出来,请各位看看问题在哪:HRESULT CBallStream::GetMediaType(int iPosition, CMediaType *pmt)
{
.......//这边就是确定iPorsition为0或1等例行的操作    switch (iPosition) 
{
case 0: 
{
            pmt->SetType(&MEDIATYPE_Video);
            pmt->SetSubtype(&MEDIASUBTYPE_MPEG1Packet );
     }
break;
case 1: 
{
            pmt->SetType(&MEDIATYPE_Video);
            pmt->SetSubtype(&MEDIASUBTYPE_MPEG1Payload  );
        }
     break;
    }    pmt->SetFormatType(&FORMAT_MPEGVideo);
    pmt->SetSampleSize(0);
    pmt->SetTemporalCompression(FALSE);    return NOERROR;
} // GetMediaType   请大家注意我是要做一个连接Decoder的SourceFilter,不是连接Splitter的,所以SDK中Memfile,Async,Ball这些例子都不太适合。像Ball这个例子它直接输出Video数据,处理的方法和我上面写的是大致相同的,可我现在的程序就是调不通。   我想可能还是格式或者Type之类的处理的问题,麻烦高手指点一下,最好说清楚一点或者给个示例代码,多谢了。    请大家指点一下阿,我被卡在这了。给点思路也好,我整整困扰了一周了,问题解决了一定顷囊送分,决不食言。

解决方案 »

  1.   

    奇怪,看不懂你要做什么。 一个带 SPLITTER 的 DECODER? PUSH 还是 PULL 模式?
      

  2.   

    同情,不知道sdk的有用否
    ---------------------------------------------
                             已经放1000多分了,老板要发飙了
      

  3.   

    说错了, 一个带 SPLITTER 的 SOURCE FILTER? 你的数据从哪里来? 网络, 还是本地文件? 我有一个带SPLITTER的SOURCE FILTER, MPEG1格式,网络数据,PUSH模式。但是是写成一个类, 而不是COM,所以不能在GRAPHEDIT里面调用。
      

  4.   

    MySourceFilter -> (告诉系统你定仪了一个取代MPEG-I 的东东) -> Video Decoder -> VideoRender 
      

  5.   

    编程十年苦,不如卖红薯。
                      vc十年功,不如卖大葱。---------------------------
       这年头,胡说不上税的;你可去呀,为什么还赖在CSDN?
      

  6.   

    BOOL CDecoder::CreateESrcFilter(DWORD dwType)
    {
    CMediaType mtVideo, mtAudio;
    mtVideo.majortype  = MEDIATYPE_Video;
    mtVideo.subtype  = MEDIASUBTYPE_MPEG1Payload;
    mtVideo.bFixedSizeSamples  = FALSE;
    mtVideo.bTemporalCompression = TRUE;
    mtVideo.lSampleSize  = 0;
    mtVideo.formattype  = FORMAT_MPEGVideo;
    mtVideo.pUnk  = NULL; BYTE cVideoFormat[108] = {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 
    0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x2d, 0x19, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x80, 0x1a, 0x06, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x60, 0x01, 
    0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0xd0, 0x07, 0x00, 0x00, 0x5b, 0x20, 0x01, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 
    0xcc, 0xcc, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
    0xb3, 0x16, 0x01, 0x20, 0x83, 0x04, 0x07, 0x60, 0xa4
    };     mtVideo.SetFormat(cVideoFormat, 108); mtAudio.majortype  = MEDIATYPE_Audio;
    mtAudio.subtype  = MEDIASUBTYPE_MPEG1AudioPayload;
    mtAudio.bFixedSizeSamples  = TRUE;
    mtAudio.bTemporalCompression = TRUE;
    mtAudio.lSampleSize  = 0;
    mtAudio.formattype  = FORMAT_WaveFormatEx;
    mtAudio.pUnk  = NULL;
    BYTE cAudioFormat[40] = {
    0x50, 0x00, 0x02, 0x00, 0x44, 0xac, 0x00, 0x00, 
    0x36, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x16, 
    0x02, 0x00, 0x80, 0xb5, 0x01, 0x00, 0x01, 0x00, 
    0x00, 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc 
    }; 
        mtAudio.SetFormat(cAudioFormat, 40);    HRESULT hr = S_OK;
        m_pEFilter = new CESrcFilter("ESrcFilter", NULL, &mtVideo, &mtAudio, &hr);
    if( m_pEFilter == NULL )
    return FALSE;
    if ( FAILED(hr) )
    {
    delete m_pEFilter;
    return FALSE;
    }    m_pEFilter->AddRef();
    return TRUE;
    }
      

  7.   

    BOOL CDecoder::AddESrcFilter()
    {
    HRESULT hr;
        ASSERT(m_pIGraphBuilder != NULL); hr = m_pIGraphBuilder->AddFilter(m_pEFilter, L"ESD FILTER");
        if ( FAILED(hr) )
            return FALSE;
    CBasePin* pPinOut = m_pEFilter->GetPin(0);
    hr = m_pIGraphBuilder->Render(pPinOut);
    pPinOut = m_pEFilter->GetPin(1);
    hr = m_pIGraphBuilder->Render(pPinOut);
    return TRUE;
    }__________
    我这样RENDER是成功的.
      

  8.   

    我认为你应该 分配 一个VIDEOINFO 给 下家。下家才能checkmediatype
      

  9.   

    pmt->AllocFormatBuffer(sizeof(VIDEOINFO))填充 bmiHeader,videorender 要检查 bmiHeader