caboy请问Memfile中CMemStream的Size方法中的返回的长度和填入指针的值和播放的流的长度关系

wuxfBrave 2001-09-04 09:54:22
...全文
173 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
capboy 2001-09-14
  • 打赏
  • 举报
回复
我猜象POWERDVD的技术应该是关于MPEG2的编码解码方面的。还有就是MPEG2的保护方面的知识了。因为所以的MPEG2的解码都是第三方提供的。(我在使用的要收费的:()。不知道为什么MEDIAPLAY不做MPEG2的。
jimconrad 2001-09-14
  • 打赏
  • 举报
回复
居然不给分啊
capboy 2001-09-07
  • 打赏
  • 举报
回复
是啊。微软的作风!可是在WINDOW下编程的话,怎么都要用它的技术,不是么:(
不过我还是乐观的,毕竟微软不能够把所有的应用方案都包括进去,所以还有很多的播放器。很多的共享软件,自由软件的存在。他们一样也是使用微软的技术。
不知道WINDVD,POWERDVD,超级解霸等是不是基与DSHOW的技术。还是他们直接用DDRAW和DSOUND呢?加上自己的解码器?
jimconrad 2001-09-07
  • 打赏
  • 举报
回复
我猜超级解霸是基于ddraw和dsound做的应用,其他内幕就不清楚了。超解应该有自主技术的,POWERDVD也是有自主技术的,所以才能够和media player唱对台戏。
capboy 2001-09-06
  • 打赏
  • 举报
回复
jimconrad(jimmy)兄好。
解释的精辟。
我一直对这个参数不是很清楚。
设置为INFINITE,有什么好处?
如果为具体的值,那么播放就是以该速率来进行了?
看来该参数是用来调整播放速率和数据的接受,播放的平衡的了。
能交流交流么??
afterain@263.net
jimconrad 2001-09-06
  • 打赏
  • 举报
回复
另外:我说的:“mpeg1的文件正常播放速率大约是174KBps,你试着设置m_dwKBPerSec的值看看吧。我没有很认真的测试过。”是说我测试过,但是没有作纪录,忘了具体数值了。事实上m_dwKBPerSec是Read函数一个重要参数,来控制读取速率的。
jimconrad 2001-09-06
  • 打赏
  • 举报
回复
1.push型的我没做过,所以对push的程序不了解,也不知道如何在其中设置类型。其实我只是很认真的分析了memfile。
2.联系方法:jimChan_2001@263.net
3.我不是很清楚其他论坛和新闻组,我的英文还没达到流利阅读的程度。

另外我感到做dxshow的应用没前途,因为这是微软开发的sdk,而微软本身也开始涉足视频点播市场,同时他们的播放器作的很好。他们的sdk我想仅仅只是提供给开发者初浅应用。深入应用的部分只要涉及到他本身利益决不会公开给你。而且当你的产品和他的产品有利益上冲突的时候,决不会对你袖手旁观。dxshow和DirectX其他部分不一样,原来就不是directx体系中的一员,现在也只是dx的高层应用。开发dx应用可以是方方面面的,即便只是游戏一项内容就很广。但开发dxshow就只有多媒体这一方面了,而且视频是其中的重头戏。我们使用dxshow开发的播放器其核心部分都是微软的,实际上是被微软牵着走。我们做什么?用户界面?source filter?...都是离心很远的无足轻重的部分。看看asf格式的文件,你的source filter拿它有办法吗?即使有办法那还不是人家的一个例子!即使不是人家的例子、即使很有办法,看看下面的文字,你也会灰心丧气:
Microsoft patents the ASF media file format and stops the author of VirtualDub, a GPLed video capture and processing program for Windows, from supporting ASF since he reverse-engineered the ASF file spec. The consequences are numerous: Third parties cannot develop their own tools to decode ASF or convert ASF to other formats, and if ASF becomes the dominate media format on the Internet (due to Microsoft's proprietary but high-quality MPEG4 codec and strong marketing), Microsoft gains de facto technical control over the creation and distribution of digital media. And if patenting file formats becomes a common practice, it can have a chilling effect on free software development since the reading/writing of data in popular formats (say, Microsoft Word files or MPEG4 video) would be prohibited, unless one uses designated drivers.
所以dxshow就像是微软拿出来炫耀的东西,就像一个富人家拿出一勺粥给可怜巴巴的站在他门前的瞪圆了眼睛急切等待着的你,说:“这是给你的,我们家里有的是,还有香喷喷的大米饭。”
所以我觉得dxshow是微软丢给程序员的狗食,要是唯物主义者,那就尝尝,其味道还可以,但结果肯定是没有什么作为的。不吃,自己动手开发这样一套东西太复杂,太难。不过dxshow设计思想还是可以好好学习的,就如那个async例子,从中可以学到很多编程方面的东西。

capboy 2001-09-06
  • 打赏
  • 举报
回复
我也没试过。
jimconrad(jimmy)兄,能不能交流一下DSHOW。我最近打算做个PUSH型的SOURCE FILTER,不过始终是不能够把类型设置为STREAM,MPEG1SYSTEM的格式。
能告诉你的联系方式么?
知道哪有好的论坛或是新闻组么?中,英文的都行。
jimconrad 2001-09-06
  • 打赏
  • 举报
回复
to wuxfbrave:
 m_llLength参数意义是多媒体文件长度,是在CMemStream初始化时赋初值为被播放媒体文件长度,该值在一般播放要求时被定义为常量:
const LONGLONG m_llLength;
因为我们播放的是静态的多媒体文件。
 我目前还没碰到超过2G=2^31的静态多媒体文件,一般影片是500~800MB。很少有达到或超过
  max{m_llLength = Int32x32To64(LONG_MAX, LONG_MAX)} ≈ 2^64
的情况。目前硬盘容量好像也不够装这么大的影片。出现返回EC_COMPLETE可能是你数据读取溢出该文件数据范围了,数据读错误。也可能你做的是直播系统,那memfile就不适用了。可能要看看Microsoft TV Technologies这一节的内容。

to capboy:
 在正常播放情况下,设为INFINITE只是为了方便。使用者不需要每次都去计算他所要播放的视频文件的流速率以确定参数m_dwKBPerSec的最小值、或者随便设一个大数(当然这个大数至少得满足正常播放时流速率),这样标识就不同一,程序就不好维护了。统一使用一个远大于一般媒体文件播放需求的播放流速率的常量(大数),大家使用起来都方便。
 当m_dwKBPerSec的值小于正常播放速率需求时,Read函数里的下面代码就会阻塞等待:
DWORD dwTimeToArrive =((DWORD)m_llPosition + dwReadLength) / m_dwKBPerSec;
if (dwTime - m_dwTimeStart < dwTimeToArrive)
{Sleep(dwTimeToArrive - dwTime + m_dwTimeStart);}
mpeg1的文件正常播放速率大约是174KBps,你试着设置m_dwKBPerSec的值看看吧。我没有很认真的测试过。
wuxfBrave 2001-09-05
  • 打赏
  • 举报
回复
在流的情况下,当m_llLength = Int32x32To64(LONG_MAX, LONG_MAX)时返回EC_COMPLETE,当如何解决
jimconrad 2001-09-05
  • 打赏
  • 举报
回复
LONGLONG Size(LONGLONG *pSizeAvailable)
{
LONGLONG llCurrentAvailable = Int32x32To64((timeGetTime() - m_dwTimeStart),m_dwKBPerSec);
/*The timeGetTime function retrieves the system time, in milliseconds. The system time is the time elapsed since Windows was started.*/
if(pSizeAvailable)*pSizeAvailable = min(m_llLength, llCurrentAvailable);
return m_llLength;
}

Size返回当前能获得的流数据的长度。
该长度不得超过流文件总长度(m_llLength),也不得超过理论上当前播放位置(llCurrentAvailable):该位置是根据初始化时指定的播放速率进行不间断播放,到当前时刻为止应播到的位置。
返回值取二者最小值,主要考虑以下两种情况:
1.当播放器以较慢的帧速率m_dwKBPerSec进行播放时,llCurrentAvailable <= m_llLength,数据提供者(主要指是其他视频数据源服务器进程)只要以m_dwKBPerSec速率提供数据就可以满足播放器的数据需求了,超过llCurrentAvailable部分为条件m_dwKBPerSec下的非法数据读请求。
2.当播放速率较大或为INFINITE时,计算出的llCurrentAvailable > m_llLength,而正确的逻辑是llCurrentAvailable <= m_llLength,因为我们不可能获得超出视频文件之外的数据。
故而返回最小值。

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧