我将memfile播放MPEG1的代码改写了一下,
我只改了媒体类型,如下:
        mt.subtype = MEDIASUBTYPE_MPEG2_PROGRAM ;
 系统装了elecard的mpeg2解码器,可以在graphedit中正常播放。
 调试没什么问题,没错误,也有数据,就是萨都没影,只闪了一下播放窗口。是否除了媒体类型还有其它的要改。

解决方案 »

  1.   

    所有要改的东西都在这。为了这点东西,我几乎看便了csdn上的所有文章,但没有人
    详细指出,应该怎样改。这其实对很多人来说是很简单的东西,但这些人都只是提一下
    ,我想他们除了会向人们炫耀自己的能耐的同时,剩下的都是自私。
      我很多时候说不想作软件了,因为从这里面能看到中国人的丑陋和无知。
      让我们尽量知识共享吧,因为我们都是弱者。
       牢骚了,抱歉。
     mt.majortype = MEDIATYPE_Stream;
     mt.subtype = MEDIASUBTYPE_MPEG2_PROGRAM;HRESULT SelectAndRender(CMemReader *m_pFilter, IFilterGraph **m_pFGraph)
    {
        /*  Create filter graph */
        HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
                                      NULL,
                                      CLSCTX_INPROC,
                                      IID_IFilterGraph,
                                      (LPVOID *)m_pFGraph);    if (FAILED(hr)) {
            return hr;
        }
        // Add our filter */
        hr = (*m_pFGraph)->AddFilter(m_pFilter, NULL);

       //-----------
    IGraphBuilder *m_pGBuilder;
    hr=(*m_pFGraph)->QueryInterface(IID_IGraphBuilder,(LPVOID *)&m_pGBuilder);
    if(FAILED(hr))
    return FALSE;

        IEnumPins  *pEnum;
        IPin       *pPin;
        // -----------
        m_pFilter->EnumPins(&pEnum);
        if(pEnum->Next(1, &pPin, 0) == S_OK)
        {
    hr = m_pGBuilder->Render(pPin);
    pPin->Release();
    if(FAILED(hr))
    return FALSE;
    }
    else 
    {
    pEnum->Release();
    return FALSE;
    }
        pEnum->Release();
    //----------
        return hr;
    }
      

  2.   

    不对,你的程序如果这样写
    1。没有谈到实质性内容
    2。即使可以播放也会一下就停止的。网上有现成的资料,入vchelp和csdn里都有,还是认真去找吧。在vchelp中有个牛人,谈得非常详细,而且有源代码。
      

  3.   

    我装了elecard 的解码器,试过了这样改播放没什么问题。
    如果mt.subtype = MEDIASUBTYPE_NULL ;这样还可以同时播放MPEG1,MPEG2我的确参照了一个牛人的源代码,我忘记他的名字了,他的最大创意是
    用directplay传输,这是一个对于分组播放和网络时延最好的解决办法。我准备用他这个创意,全部用directx的东西实现,广播/点播/视频处理系统。
      

  4.   

    skyonsky(大地瓜):
    mt.subtype = MEDIASUBTYPE_NULL 确实可以用啊。另外,不要怨天尤人。
    我以前的做法,羞于出手,所以没有回答你
    m_mt.majortype = MEDIATYPE_Stream; CString strExt = _vfxFileGetExt(strFile);
    if(strExt.CompareNoCase(vT("mpg")) == 0)
    m_mt.subtype = MEDIASUBTYPE_MPEG1System;
    else if(strExt.CompareNoCase(vT("mpeg")) == 0)
    m_mt.subtype = MEDIASUBTYPE_MPEG1System;
    else if(strExt.CompareNoCase(vT("mpa")) == 0)
    m_mt.subtype = MEDIASUBTYPE_MPEG1Audio;
    else if(strExt.CompareNoCase(vT("mpv")) == 0)
    m_mt.subtype = MEDIASUBTYPE_MPEG1Video;
    else if(strExt.CompareNoCase(vT("dat")) == 0)
    m_mt.subtype = MEDIASUBTYPE_MPEG1VideoCD;
    else if(strExt.CompareNoCase(vT("avi")) == 0)
    m_mt.subtype = MEDIASUBTYPE_Avi;
    else if(strExt.CompareNoCase(vT("mov")) == 0)
    m_mt.subtype = MEDIASUBTYPE_QTMovie;
    else if(strExt.CompareNoCase(vT("wav")) == 0)
    m_mt.subtype = MEDIASUBTYPE_WAVE;
    else if(strExt.CompareNoCase(vT("mp3")) == 0)
    m_mt.subtype = MEDIASUBTYPE_MPEG1Audio;
    // else if(strExt.CompareNoCase(vT("aac")) == 0)
    // m_mt.subtype = MEDIASUBTYPE_MPEG1Audio;
    else if(strExt.CompareNoCase(vT("aif")) == 0)
    m_mt.subtype = MEDIASUBTYPE_AIFF;
    else if(strExt.CompareNoCase(vT("aiff")) == 0)
    m_mt.subtype = MEDIASUBTYPE_AIFF;
    else if(strExt.CompareNoCase(vT("aifc")) == 0)
    m_mt.subtype = MEDIASUBTYPE_AIFF;
    else if(strExt.CompareNoCase(vT("mid")) == 0)
    m_mt.subtype = MEDIATYPE_Midi;
    else if(strExt.CompareNoCase(vT("midi")) == 0)
    m_mt.subtype = MEDIATYPE_Midi;
    // else if(strExt.CompareNoCase(vT("anim")) == 0)
    // m_mt.subtype = MEDIASUBTYPE_MPEG1Audio;
    else if(strExt.CompareNoCase(vT("asf")) == 0)
    m_mt.subtype = MEDIATYPE_MPEG1SystemStream;
    else if(strExt.CompareNoCase(vT("asx")) == 0)
    m_mt.subtype = MEDIASUBTYPE_MPEG1System;
    else if(strExt.CompareNoCase(vT("au")) == 0)
    m_mt.subtype = MEDIASUBTYPE_AU;
    else if(strExt.CompareNoCase(vT("cda")) == 0)
    m_mt.subtype = MEDIASUBTYPE_MPEG1Audio;
    else
    {
    m_mt.subtype = MEDIASUBTYPE_NULL;
    return S_OK;
    } return S_OK;
      

  5.   

    skyonsky(大地瓜):
    这个问题比较难,你使用GraphBuilder->Render()的时候对于mpeg2文件只能render audio成功,render video是要失败的,要用到DVDGraphBuilder,从DVDGraphBuilder里面获取到GraphBuilder才能控制。另外如果你用的正规的mpeg2 decoder,是不能获取到IMediaSample的,DVD有版权保护,除非自己写一个mpeg2 decoder