我将memfile播放MPEG1的代码改写了一下,
我只改了媒体类型,如下:
mt.subtype = MEDIASUBTYPE_MPEG2_PROGRAM ;
系统装了elecard的mpeg2解码器,可以在graphedit中正常播放。
调试没什么问题,没错误,也有数据,就是萨都没影,只闪了一下播放窗口。是否除了媒体类型还有其它的要改。
我只改了媒体类型,如下:
mt.subtype = MEDIASUBTYPE_MPEG2_PROGRAM ;
系统装了elecard的mpeg2解码器,可以在graphedit中正常播放。
调试没什么问题,没错误,也有数据,就是萨都没影,只闪了一下播放窗口。是否除了媒体类型还有其它的要改。
详细指出,应该怎样改。这其实对很多人来说是很简单的东西,但这些人都只是提一下
,我想他们除了会向人们炫耀自己的能耐的同时,剩下的都是自私。
我很多时候说不想作软件了,因为从这里面能看到中国人的丑陋和无知。
让我们尽量知识共享吧,因为我们都是弱者。
牢骚了,抱歉。
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;
}
1。没有谈到实质性内容
2。即使可以播放也会一下就停止的。网上有现成的资料,入vchelp和csdn里都有,还是认真去找吧。在vchelp中有个牛人,谈得非常详细,而且有源代码。
如果mt.subtype = MEDIASUBTYPE_NULL ;这样还可以同时播放MPEG1,MPEG2我的确参照了一个牛人的源代码,我忘记他的名字了,他的最大创意是
用directplay传输,这是一个对于分组播放和网络时延最好的解决办法。我准备用他这个创意,全部用directx的东西实现,广播/点播/视频处理系统。
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;
这个问题比较难,你使用GraphBuilder->Render()的时候对于mpeg2文件只能render audio成功,render video是要失败的,要用到DVDGraphBuilder,从DVDGraphBuilder里面获取到GraphBuilder才能控制。另外如果你用的正规的mpeg2 decoder,是不能获取到IMediaSample的,DVD有版权保护,除非自己写一个mpeg2 decoder