📄 subject_55749.htm
字号:
<p>
序号:55749 发表者:ponyma 发表日期:2003-10-12 16:56:34
<br>主题:Splitter预读数据的讨论
<br>内容:在建立FilterGraph的时候,Splitter会预读一些数据来分析文件格式。在正常情况下播放Mpeg2会读一个32768大小的一个数据,然后完成FilterGraph的连接。但是如果我在CMemStream的Size函数中没有提供正确的Total size和Available Size的时候Splitter 预读32768的之后,仍然会继续读取数据以完成FilterGraph,(如果数据不对,甚至会不断读取数据但无法完成连接,:-))。不知道谁有开发过splitter的经验,能否介绍一下Splitter完成连接需要满足什么条件?尤其是gzast163 兄,谢谢。<BR>因为我作的是一个网络播放程序,我在前面的帖子中提过我无法准确的拿到Total size和Availabe size。
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:gzast163 回复日期:2003-10-13 09:23:35
<br>内容:TotalSize是由你告诉程序的,而AvailabeSize也是由以下函数告诉程序的:<BR>LONGLONG Size(LONGLONG *pSizeAvailable)。<BR><BR>对于播放网络文件,TotalSize是文件的总长度。<BR><BR>对于播放Live Media,由于不知道Live Media Source什么时候才停止,所以TotalSize要给一个很大的数字,如:(LONGLONG)0x7fff00ff00。<BR><BR>为了能让Splitter快速地而且准确地识别媒体数据,最好从I帧开始送数据给Splitter。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ponyma 回复日期:2003-10-13 12:58:17
<br>内容:size当然是我告诉程序的,:-)<BR>但问题在于我在开始时也不知道,因为client端接受的是server端trancode候的数据,在transcode的过程总可以动态的调整Bitrate,所以我只有在接受到Server发过来文件结束的消息,才能根据统计client接受到的数据来调整Total size。<BR>但是我发现如果一开始不能准确的提供size的话,splitter预读的数据让我迷惑,所以才有上面的问题。<BR>而与之相关的问题是,我如何知道在调用Read的时候是splitter在预读数据,而不是播放读的数据。也就是说我如何在播放时准确的复位到0?buffer中的数据被读走候就会被扔掉,也就是说如果我知道是splitter在预读数据我就需要保留buffer中的数据。<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>
回复者:gzast163 回复日期:2003-10-13 14:27:59
<br>内容:你不用管它是预读还是播放,只需要不断地把数据丢给它就是了,要从I帧开始给数据。<BR><BR>TotalSize就给(LONGLONG)0x7fff00ff00吧。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ponyma 回复日期:2003-10-14 09:21:05
<br>内容:谢谢,<BR>但是Totalsize给的很大的话,我应该怎样让splitter知道我的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>
回复者:gzast163 回复日期:2003-10-14 10:10:24
<br>内容:你应该在下面这个函数把数据丢给Splitter,有数据你就给它,没有数据就在该函数里等数据。<BR> HRESULT Read(PBYTE pbBuffer,<BR> DWORD dwBytesToRead,<BR> BOOL bAlign,<BR> LPDWORD pdwBytesRead)<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>
回复者:ponyma 回复日期:2003-10-14 17:23:06
<br>内容:非常感谢你持续关注。<BR>我已经在client端把数据render出来了,只不过是在处理最后的包上还有些问题,所以。。。呵呵<BR>问题在于我已经知道不会再有数据了,我还让他在read函数了傻等?^_^,我需要让splitter停止调用Read,或者说让splitter发送EndofStream。也就是说我需要知道splitter是在什么条件下发送EndofStream并听数数据传送线程的。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ponyma 回复日期:2003-10-14 17:24:33
<br>内容:发送EndofStream并听数数据传送线程的。 --》发送EndofStream并停止退出数据传送线程的。
<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-10-15 18:28:49
<br>内容:网络播放的话你不应该使用splitter。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ponyma 回复日期:2003-10-15 19:45:12
<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-10-16 14:25:43
<br>内容:没有什么建设性的意见:D。只是觉得如果用Demux来处理的话会更好。splitter正在逐步被替换,而且它是pull模式的;对于网络或卫星等livesource应用,使用demux会更好。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ponyma 回复日期:2003-10-18 10:13:46
<br>内容:我在多媒体方面的工作才刚刚开始,还是个小学生,能介绍一下splitter和Demux的差别吗,或贴一些这方面资料的链接,谢谢
<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-10-21 21:14:58
<br>内容:你可以在directx sdk文档中查到关于mpeg-2 splitter和demux的区别,主要是它们的实现模式不同,前者是pull模式,后者则是push模式。
<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 + -