📄 subject_25669.htm
字号:
<p>
序号:25669 发表者:ni_jj 发表日期:2002-12-24 17:42:24
<br>主题:connect的问题
<br>内容:CoCreateInstance(CLSID_MPEG1Splitter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&g_pMpegSplitter);<BR>CoCreateInstance(CLSID_CMpegAudioCodec, NULL, CLSCTX_INPROC_SERVER, <BR>IID_IBaseFilter, (void**)&g_pMpegAudioDecoder);<BR>CoCreateInstance(CLSID_CMpegVideoCodec, NULL, CLSCTX_INPROC_SERVER, <BR>IID_IBaseFilter, (void**)&g_pMpegVideoDecoder);<BR><BR>当g_pMpegSplitter的outpin和g_pMpegAudioDecoder的inpin连接时,return s_ok,<BR>而g_pMpegSplitter的outpin和g_pMpegVideoDecoder的inpin连接时,return VFW_E_CANNOT_CONNECT.
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:禽兽 回复日期:2002-12-24 18:48:44
<br>内容:你是怎么确定IPin口?<BR>一个IPin不能连两次。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ni_jj 回复日期:2002-12-24 21:08:15
<br>内容:用EnumPins()枚举出g_pMpegSplitter的Outpin,<BR>用EnumPins()枚举出g_pMpegVideoDecoder的Inpin,<BR>用IGraphBuilder的Connect()连接这两个Ipin口。<BR>根据GraphEdit,g_pMpegSplitter有Audio和Video两个出口呀。<BR><BR>就算一次连一个,连接g_pMpegVideoDecoder也不行,但连接g_pMpegAudioDecoder就可以。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:禽兽 回复日期:2002-12-24 22:09:05
<br>内容:你枚举出Pin口后直接Render。<BR>如果还不行,你把枚举Pin口的代码贴出来。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ni_jj 回复日期:2002-12-25 10:03:45
<br>内容:以下是我的程序,在//connect fail行出错望.高人指点一二.<BR><BR>---------------------------------------------------------------------------<BR>#include <windows.h><BR>#include <Dshow.h><BR><BR>IGraphBuilder* g_pGraphBuilder = NULL;<BR>IBaseFilter* g_pSource = NULL;<BR>IBaseFilter* g_pMpegSplitter = NULL;<BR>IBaseFilter* g_pMpegAudioDecoder = NULL;<BR>IBaseFilter* g_pMpegVideoDecoder = NULL;<BR>IBaseFilter* g_pSoundRender = NULL;<BR>IBaseFilter* g_pVideoRender = NULL;<BR>IMediaControl* g_pMediaControl = NULL;<BR>IMediaEvent* g_pEvent = NULL;<BR><BR>void ConnectPins();<BR>IPin* GetPin(IBaseFilter* pFilter,PIN_DIRECTION PinDir);<BR><BR><BR>int main(int argc, char* argv[])<BR>{<BR>HRESULT hr;<BR>LONG evCode;<BR> CoInitialize(NULL);<BR> CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, <BR> IID_IGraphBuilder, (void **)&g_pGraphBuilder);<BR> CoCreateInstance(CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, <BR> IID_IBaseFilter, (void**)&g_pSource);<BR> CoCreateInstance(CLSID_MPEG1Splitter, NULL, CLSCTX_INPROC_SERVER, <BR> IID_IBaseFilter, (void**)&g_pMpegSplitter);<BR> CoCreateInstance(CLSID_CMpegAudioCodec, NULL, CLSCTX_INPROC_SERVER, <BR> IID_IBaseFilter, (void**)&g_pMpegAudioDecoder);<BR> CoCreateInstance(CLSID_CMpegVideoCodec, NULL, CLSCTX_INPROC_SERVER, <BR> IID_IBaseFilter, (void**)&g_pMpegVideoDecoder);<BR> CoCreateInstance(CLSID_DSoundRender, NULL, CLSCTX_INPROC_SERVER, <BR> IID_IBaseFilter, (void**)&g_pSoundRender);<BR> CoCreateInstance(CLSID_VideoRenderer, NULL, CLSCTX_INPROC_SERVER, <BR> IID_IBaseFilter, (void**)&g_pVideoRender);<BR> hr = g_pGraphBuilder->AddFilter(g_pSource,NULL);<BR>IFileSourceFilter *Source;<BR> hr = g_pSource->QueryInterface(IID_IFileSourceFilter, (void**)&Source);<BR> hr = Source->Load(L".\\water.mpg",NULL);<BR> Source->Release();<BR> hr = g_pGraphBuilder->AddFilter(g_pMpegSplitter,NULL);<BR> hr = g_pGraphBuilder->AddFilter(g_pMpegAudioDecoder,NULL);<BR> hr = g_pGraphBuilder->AddFilter(g_pMpegVideoDecoder,L"CLSID_CMpegVideoCodec");<BR> hr = g_pGraphBuilder->AddFilter(g_pSoundRender,NULL);<BR> hr = g_pGraphBuilder->AddFilter(g_pVideoRender,NULL);<BR> hr = g_pGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&g_pMediaControl);<BR> hr = g_pGraphBuilder->QueryInterface(IID_IMediaEvent, (void **)&g_pEvent);<BR> ConnectPins();<BR> hr = g_pMediaControl->Run();<BR> g_pEvent->WaitForCompletion(INFINITE, &evCode);<BR><BR> //release all <BR> g_pMediaControl->Release();<BR> g_pEvent->Release();<BR> g_pMpegVideoDecoder->Release();<BR> g_pMpegAudioDecoder->Release();<BR> g_pMpegSplitter->Release();<BR> g_pSource->Release();<BR> g_pSoundRender->Release();<BR> g_pVideoRender->Release();<BR> g_pGraphBuilder->Release();<BR><BR> CoUninitialize();<BR> return 0;<BR>}<BR><BR>void ConnectPins()<BR>{<BR>IPin* OutPin;<BR>IPin* InPin;<BR>HRESULT hr;<BR>//find g_pSource outpin<BR> OutPin = GetPin(g_pSource,PINDIR_OUTPUT);<BR>//find g_pMpegSplitter inpin<BR> InPin = GetPin(g_pMpegSplitter,PINDIR_INPUT);<BR>// connect --<BR> hr = g_pGraphBuilder->Connect(OutPin, InPin);<BR> InPin->Release();<BR> OutPin->Release();<BR>//find g_pMpegSplitter outpin<BR> OutPin = GetPin(g_pMpegSplitter,PINDIR_OUTPUT);<BR>//find g_pMpegVideoDecoder inpin<BR> InPin = GetPin(g_pMpegVideoDecoder,PINDIR_INPUT);<BR>// connect --<BR> hr = g_pGraphBuilder->Connect(OutPin, InPin);<BR> InPin->Release();<BR> OutPin->Release();<BR>//find g_pMpegSplitter outpin<BR> OutPin = GetPin(g_pMpegSplitter,PINDIR_OUTPUT);<BR>//find g_pMpegVideoDecoder inpin<BR> InPin = GetPin(g_pMpegAudioDecoder,PINDIR_INPUT);<BR>// connect --<BR> hr = g_pGraphBuilder->Connect(OutPin, InPin);//connect fail why?<BR> InPin->Release();<BR> OutPin->Release();<BR><BR><BR>//find g_pMpegAudioDecoder outpin<BR> OutPin = GetPin(g_pMpegAudioDecoder,PINDIR_OUTPUT);<BR>//find g_pSounderRender inpin<BR> InPin = GetPin(g_pSoundRender,PINDIR_INPUT);<BR>// connect --<BR> hr = g_pGraphBuilder->Connect(OutPin, InPin);<BR> InPin->Release();<BR> OutPin->Release();<BR>//find g_pMpegVideoDecoder outpin<BR> OutPin = GetPin(g_pMpegVideoDecoder,PINDIR_OUTPUT);<BR>//find g_pVideoRender inpin<BR> InPin = GetPin(g_pVideoRender,PINDIR_INPUT);<BR>// connect --<BR> hr = g_pGraphBuilder->Connect(OutPin, InPin);<BR> InPin->Release();<BR> OutPin->Release();<BR>}<BR><BR>IPin* GetPin(IBaseFilter* pFilter,PIN_DIRECTION PinDir)<BR>{<BR> BOOL bFound = FALSE;<BR> IEnumPins *pEnum;<BR> IPin *pPin;<BR><BR> pFilter->EnumPins(&pEnum);<BR> while(pEnum->Next(1, &pPin, 0) == S_OK)<BR> {<BR> PIN_DIRECTION PinDirThis;<BR> pPin->QueryDirection(&PinDirThis);<BR> if (bFound = (PinDir == PinDirThis))<BR> break;<BR> pPin->Release();<BR> }<BR> pEnum->Release();<BR> return (bFound ? pPin : 0); <BR>}<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:super 回复日期:2002-12-25 12:09:20
<br>内容:失败的原因是因为<BR>//find g_pMpegSplitter outpin<BR> OutPin = GetPin(g_pMpegSplitter,PINDIR_OUTPUT);<BR>的结果还是返回第一个OutputPin<BR><BR>所以你应该在GetPin函数中再增加一个参数,int nIndex.<BR>当PinDir == PinDirThis时判断index
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ni_jj 回复日期:2002-12-25 12:46:26
<br>内容:改了,成功了,谢谢.<BR>但是如何得知g_pMpegSplitter的第一个OUTPIN是AUDIO,第二个OUTPIN是VIDEO呢?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -