📄 subject_53328.htm
字号:
<p>
序号:53328 发表者:陈方 发表日期:2003-09-18 20:37:00
<br>主题:为什么Filter不能进入到Run状态
<br>内容:在GraphEdit下,如果我的Filter和其它Filter不连接的话,运行时能正常从pause进入到<BR>run状态,但是连接其它Filter后,运行后,进入到pause状态后,没有在进入到run状态。<BR>请那位大虾帮忙分析一下原因
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:微笑的撒旦 回复日期:2003-09-18 21:40:44
<br>内容:资料太少,建议上载工程及说明如何建立测试环境;至少得给些代码。<BR>看看有没有什么地方有死循环,或是函数return false。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:陈方 回复日期:2003-09-18 21:57:23
<br>内容:线程函数就不写了,是在GraphEdit下测试的。<BR>Mp4Splitter的两个output pin连接Mp4DecodeFilter和G723DFilter,<BR>一般情况下,在GraphEdit下运行,Filter会先执行pause()然后执行<BR>run()。如果连接后面两个Filter以及Video Render和Sound Render的话,<BR>只成功执行pause但没有执行run()。但是如果Filter graph中只加<BR>Mp4Splitter和两个解码Filter而不加入Render Filter的话,Filter运行正常。<BR>请指点原因<BR><BR>BOOL CMp4Splitter::ExitReceiveThread()<BR>{<BR> if(NULL != m_hThread)<BR> {<BR> m_bExitThread = FALSE;<BR> CloseHandle(m_hThread);<BR> m_hThread = NULL; <BR> }<BR><BR> return TRUE;<BR>}<BR><BR>STDMETHODIMP CMp4Splitter::Pause()<BR>{<BR> DbgOutString(TEXT("CMp4Splitter::Pause!\r\n"));<BR><BR> HRESULT hr = CBaseFilter::Pause();<BR> if(FAILED(hr))<BR> {<BR> return hr;<BR> }<BR><BR> if(NULL != m_hThread)<BR> {<BR> ExitReceiveThread(); <BR> }<BR><BR> return S_OK;<BR>}<BR><BR>STDMETHODIMP CMp4Splitter::Stop()<BR>{<BR> DbgOutString(TEXT("CMp4Splitter::Stop!\r\n"));<BR><BR> HRESULT hr = CBaseFilter::Stop();<BR> if(FAILED(hr))<BR> {<BR> return hr;<BR> }<BR> <BR> if(NULL != m_hThread)<BR> {<BR> ExitReceiveThread(); <BR> }<BR> m_llPosition = OFFSETOFFILE;<BR><BR> return hr;<BR>}<BR><BR>STDMETHODIMP CMp4Splitter::Run(REFERENCE_TIME tStart)<BR>{<BR> DbgOutString(TEXT("CMp4Splitter::Run!\r\n"));<BR><BR> HRESULT hr = CBaseFilter::Run(tStart);<BR> if(FAILED(hr))<BR> {<BR> return hr;<BR> }<BR><BR> if(m_bExitThread)<BR> {<BR> return S_OK;<BR> }<BR><BR> m_bExitThread = FALSE;<BR> if(NULL == m_hThread)<BR> {<BR> m_hThread = CreateThread( <BR> NULL, <BR> 0, <BR> ReceiveThread, <BR> (LPVOID)this, <BR> 0, <BR> &m_lThreadId); <BR> }<BR><BR> return hr;<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>
回复者:陈方 回复日期:2003-09-19 09:30:59
<br>内容:不好意思,上面的代码可能会误导人,有些不必要的信息。<BR>事实上,我在run,pause,stop中什么也不做,如下所示。<BR>在Filter Graph中加入Splitter Filter,Decode Filter, Render后,<BR>运行只能进入到Pause(),而不能进入到Run()<BR>去掉Render,运行就能很正常的从Pause()过渡到Run()<BR><BR>STDMETHODIMP CMp4Splitter::Pause()<BR>{<BR> DbgOutString(TEXT("CMp4Splitter::Pause!\r\n"));<BR><BR> return CBaseFilter::Pause();<BR>}<BR><BR>STDMETHODIMP CMp4Splitter::Stop()<BR>{<BR> DbgOutString(TEXT("CMp4Splitter::Stop!\r\n"));<BR><BR> return CBaseFilter::Stop();<BR>}<BR><BR>STDMETHODIMP CMp4Splitter::Run(REFERENCE_TIME tStart)<BR>{<BR> DbgOutString(TEXT("CMp4Splitter::Run!\r\n"));<BR><BR> return CBaseFilter::Run(tStart);<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>
回复者:微笑的撒旦 回复日期:2003-09-19 19:50:29
<br>内容:你用的是什么video render,VMR9?试试接NullRender看。<BR>可以只接一个decoder filter看看。<BR>或者你在spiltter前接上source filter试试。<BR><BR>最好的方法是 step into CBaseFilter::Pause();虽然可能是汇编代码,也比瞎猜的好。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:陈方 回复日期:2003-09-19 20:17:29
<br>内容:Video Renderer,VMR9,NullRender都一样<BR>不接Renderer,用一个Decoder或两个Decoder都正常<BR>我调到Pause()里了,进入汇编后程序就死掉了<BR><BR>我做的这个Splitter Filter原来前面是和FileAync Filter相连,<BR>后来关闭时出错一直没解决。现在我将文件源做到Splitter内,前面不用FileAync Filter。<BR>计划在Run()时开一个线程读文件,Pause()关闭线程,保留文件指针,Stop()关闭线程,<BR>重置文件指针,却出现上面的错误。但如果把开线程放在pause()中,可以正确播放文件视音频,<BR>可这显然不符合逻辑,郁闷啊。<BR><BR>撒旦兄,你知道在那可以下载到类似Splitter源码的地方吗,前面有人说Mpeg-1 Splitter有源码,<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>回复者:微笑的撒旦 回复日期:2003-09-20 11:04:58
<br>内容:splitter的源代码在directmedia SDK 6.0中有,你可以上微软的网站下载,或是使用附件中的。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:陈方 回复日期:2003-09-20 13:39:20
<br>内容:已下载,非常感谢你
<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 + -