to happydeer:关于DirectShow 开发指南中的问题.......

lllxy 2004-12-22 03:28:08
在DirectShow开发指南中,第18章的例子:关于网络传播一个mpeg文件然后进行播放的问题,现在我有一个问题:
就是本地播放一个mpeg文件的时候,我也使用推模式,就是调用你的改好的代码:asyncrdr.cpp asyncrdr.h asyncio.cpp asyncio.h memfilter.h 只不过我在 memfilter.h中的CMemReader:Read()函数中,直接读取文件中的数据,这样进行播放mpeg可以吗?好像大家都使用renderfile()函数去直接播放。这样有什么不同呢?其实,我想如果我这样做成功的话,那么播放网络数据也就成功。只不过是数据的来源不同。我现在没有测试成功,能够从文件中读取到数据,就是不能够正确播放。不知道在那个地方有问题,请指点一下该如何去调试 谢谢。

HRESULT Read(PBYTE pbBuffer,
DWORD dwBytesToRead,
BOOL bAlign,
LPDWORD pdwBytesRead)
{
CAutoLock lck(&m_csLock);
DWORD dwTime = timeGetTime();
if(!m_flagOpen)
{
DWORD dwFlags = MMIO_READ;
hmmioFile = mmioOpen(m_MPEG1FileName, (LPMMIOINFO)NULL, dwFlags);
m_flagOpen = true;
}
LONG result = mmioRead(hmmioFile, (char*)pbBuffer,32000);
*pdwBytesRead = result;
return S_OK;
}
...全文
172 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
happydeer 2004-12-23
  • 打赏
  • 举报
回复
可能在于直接读取vcd时,IO的速度比较慢,source filter来不及供应数据,所以播放时会一顿一顿。

我不明白,在directshow中,播放mpeg文件有很标准的方式,你为什么不用?
source filter -> mpeg1 stream splitter -> mpeg video decoder -> video renderer
-> mpeg audio decoder -> audio renderer

所有filter微软都提供了。
lllxy 2004-12-23
  • 打赏
  • 举报
回复
directshow与mmioXXX是两套不同的东西,但是打开一张vcd盘,直接读取数据后就可以播放,这个应该没有问题。mmioxxxx只是通过它来打开文件,没有别的意思,打开文件后,读取得数据都去进行播放。现在,我可以很流畅播放小的mpeg文件,但是不能够直接播放vcd碟,不知道为什么?
happydeer 2004-12-23
  • 打赏
  • 举报
回复
directshow与mmioXXX是两套不同的东西,不要混用。你最好对directshow的总体结构作一些了解。
lllxy 2004-12-23
  • 打赏
  • 举报
回复
对,我自己写了mpeg splitter,也就是改了CMemReader:Read()函数,从mpeg文件中获取数据。
还有一个问题: 就是我从mpeg文件中读取了数据到buff后,怎么进行解码阿,就是解成YUB格式的数据。怎么解?有参考资料吗?
happydeer 2004-12-23
  • 打赏
  • 举报
回复
你自己写了推模式的mpeg splitter了吗?如果你的source filter是推模式的话。推模式的filter干嘛还要从memfilter改写?

微软的mpeg1 splitter和mpeg2 splitter只能工作在拉模式,mpeg2 demux可以工作在推模式。
lllxy 2004-12-23
  • 打赏
  • 举报
回复
很谢谢happydeer的回答:
针对你对我的建议,其实我在提问的时候已经表明了我的想法,你的第二次回答是说我只要使用默认的source filter 就可以播放,直接调用renderfile()什么也不用管,能够实现播放mpeg文件,这没错。但是我想在播放的时候,能够由自己来指定播放的数据,这数据可以从mpeg文件中来,也可以从网络上传过来。当从网络上传数据播放的时候,使用默认的拉filter肯定不行,因为在Video renderer的时候我们调用Render()函数,因此必须改造source filter,能够主动提供数据播放。这就是我的初衷。因此,我设计为当播放mpeg文件的时候,也由自己来主动提供数据播放。从理论上来说,我这种想法很合理的。但从而也出现了我所提出的问题。
如果不对,请指正。
lllxy 2004-12-23
  • 打赏
  • 举报
回复
谢谢happydeer:
lllxy 2004-12-22
  • 打赏
  • 举报
回复
现在我调整了每次读取文件的大小,同时mpeg 文件在构造函数中打开,可以出画面,但是画面很不流畅,一跳一跳,好像只是显示了几帧。真不知道怎么回事,有办法改进效果吗?

if(!m_flagOpen)
{
result = mmioRead(hmmioFile, (char*)pbBuffer,820000);
m_flagOpen = true;
}
else
result = mmioRead(hmmioFile, (char*)pbBuffer,40000);
*pdwBytesRead = result;

2,553

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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