📄 subject_50412.htm
字号:
<p>
序号:50412 发表者:陈方 发表日期:2003-08-20 20:02:42
<br>主题:Filter问题
<br>内容:我写的一个网络接受的Filter,后面连解码Filter和VMR9,运行时CPU占有率近100%,但如果我在FillBuffer(IMediaSample*)中加入Sleep(10)这样的代码,CPU占有率会急剧下降。请问原因,如何解决?请高手指点。
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:微笑的撒旦 回复日期:2003-08-21 07:48:19
<br>内容:Sleep函数会使FillBuffer所在的线程暂停,以释放其所占的CPU时间给其他进程/线程使用。如果这样不会打断你的流程的话,也可以使用。
<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-08-21 18:11:09
<br>内容:不过我不希望有Sleep(),我觉得在DoBufferProcessingLoop()里可以让FillBuffer只是在有数据时才启动,不过没想到好的处理办法,请指点。
<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-08-22 08:55:19
<br>内容:你无法监测这个buffer吗?能不能贴些源代码出来,好过在这猜啊。
<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-08-30 17:30:16
<br>内容:不好意思,最近忙一直没上来,这是我的一段原码。<BR>这个Filter用来接收Mpeg4流,发给下一级Mpeg4解码Filter<BR>链表1用来将网络数据写入媒体包<BR>链表2是当网络数据出现乱序时,先将其写入链表2,排序后再写入链表1<BR>(只是简单介绍,链表1、2还有其他用途)<BR>我怎样才能将下面这段代码中的sleep()去掉<BR>请大侠指点<BR><BR>HRESULT CMp4OutputPin::FillBuffer(IMediaSample *pms)<BR>{<BR> if(NULL == pms)<BR> {<BR> return E_POINTER;<BR> } <BR><BR> //如果没有运行<BR> if(!m_bStartPlay)<BR> {<BR> return NOERROR;<BR> }<BR><BR><BR> //将链表1中的数据写入媒体包<BR> if(0 == g_DataLink.WriteVideoLinkToSample(pms))<BR> { <BR> REFERENCE_TIME TimeStart, TimeEnd;<BR><BR> if(NOERROR == pms->GetTime(&TimeStart, &TimeEnd))<BR> {<BR> pms->SetTime(&TimeStart, &TimeEnd);<BR> } <BR><BR> /* if(NOERROR == pms->GetMediaTime(&TimeStart, &TimeEnd))<BR> {<BR> pms->SetMediaTime(&TimeStart, &TimeEnd);<BR> }*/<BR> <BR> pms->SetActualDataLength(0);<BR><BR> //将链表2中符合条件的数据写入链表1<BR> g_DataLink.WriteVideoStockLinkToVideoLink();<BR><BR> Sleep(10);/*如果没有这行代码,没有接收到网络数据时,CPU占有率极高*/<BR> <BR> return NOERROR;<BR> }<BR><BR> return NOERROR;<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-08-30 21:32:34
<br>内容:我想你是从CSourceStream继承过来的,fillbuffer是会被DoBufferProcessingLoop循环不停调用的函数,在没有数据处理的时候,这个循环回非常的快,所以CPU会升高。<BR>所以,如果网络数据是在这个循环内接收的话,使用一个同步接收的函数(recv好像就可以),使它在没有数据到达的时候等待;如果在外边接收的话,使用同步机制中断这个循环,使其等待。<BR><BR>P.S.<BR>if(NOERROR == pms->GetTime(&TimeStart, &TimeEnd))<BR> {<BR> pms->SetTime(&TimeStart, &TimeEnd);<BR> }<BR>我不是很明白。你Get到的Timestamp与你Set的timestamp有什么不同吗?<BR>pms->SetActualDataLength(0);<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-02 13:34:45
<br>内容:你的建议很好,谢谢你<BR><BR>不好意思,我程序中的那个SetTime误导你了,的确没什么不同<BR>不过pms->SetActualDataLength(0)好像应该要,<BR>g_DataLink.WriteVideoLinkToSample(pms)的返回值是要写入到pms的数据长度,<BR>所有没有数据时我将pms的实际数据长度设为0,我试过去掉这一行,<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>
回复者:微笑的撒旦 回复日期:2003-09-02 14:18:54
<br>内容:pms->SetActualDataLength在没有数据的时候应该设置为0<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-02 21:45:56
<br>内容:对呀,if(0 == g_DataLink.WriteVideoLinkToSample(pms))就是表示没有数据,<BR>如果有数据的话,我在WriteVideoLinkToSample(pms)中会设置实际数据大小,<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 + -