高分求解directshow 网络播放器问题, 在线等待,不够可以加分

abzhang2 2009-09-29 09:39:36
用directshow开发了一个网络播放器。可以进行多路节目的码流显示。
结构图
net recv filter->mepg2demuliplexer -> 1_video_decoder->videowindow(第1路显示图像)
-> 1_audio_decoder->dssound filter(第1路声音)
-> 2_video_decoder->videowindow(第2路显示图像)
-> 2_audio_decoder->dssound filter(第2路声音)

....

现在可以正常接收,显示,
采用设备向网络上发送,但是现在可能某一路的数据丢失,其他路是正常。这样我在播放器上看见的是图像静止,
请问怎么做可以知道某一路图像声音数据丢失(或者说没有图像和声音)。
数据流发送是标准的transport stream 188字节的 包, 它是从一个设备上发出来, 我肯定不能进行更改他上面的数据。
最好能够在解码端或者render端 进行检测是否有数据.
...全文
94 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
abzhang2 2009-09-30
  • 打赏
  • 举报
回复
先弄下。弄好了再加100分结贴以示感谢。谢谢大侠哈。
现在还不会写filter,打算在这几天弄好。国庆也不耍了。
abzhang2 2009-09-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ziplj 的回复:]
你可以在接收到数据的时候设置一个定时器 或者一个自增标志位啊
[/Quote]
你这种不行,太特殊了, 怕就怕有数据收到, 部分节目流里有数据,部分没有. 或者说有的只有音频, 有的只有视频,这个肯定要在分离器之后才能检测。我分析的,不知道正确否。
abzhang2 2009-09-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hnoe 的回复:]
可以用Grabber Filter抓包实现(SDK sample里面)
在回调函数中获取感兴趣的内容

稍微修改一下Grabber Filter,通过该Filter的input pin就能获得mepg2demuliplexer的output pin名称,一般来说,这个output pin都会有一个序号.因此也就知道这是哪个通道了
[/Quote]

我能够通过OutputPin 得到 PID, 因为里面有多个视频流 和多个音频流,我现在能够控制显示哪些,哪些不显示。

关键是我怎么知道没有数据了,
ziplj 2009-09-29
  • 打赏
  • 举报
回复
你可以在接收到数据的时候设置一个定时器 或者一个自增标志位啊
hnoe 2009-09-29
  • 打赏
  • 举报
回复
可以用Grabber Filter抓包实现(SDK sample里面)
在回调函数中获取感兴趣的内容

稍微修改一下Grabber Filter,通过该Filter的input pin就能获得mepg2demuliplexer的output pin名称,一般来说,这个output pin都会有一个序号.因此也就知道这是哪个通道了
hnoe 2009-09-29
  • 打赏
  • 举报
回复
如果能够直接从demuliplexer的output pin记录最好(有源码的话),如果没有就自己弄个filter插在中间(decoder之前或之后都行),比如grabber filter
net recv filter->mepg2demuliplexer->log_filter_1 -> 1_video_decoder->videowindow
->log_filter_2-> 1_audio_decoder->dssound filter
->log_filter_3-> 2_video_decoder->videowindow
->log_filter_4-> 2_audio_decoder->dssound filter
hnoe 2009-09-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ylmszhanghua 的回复:]
引用 1 楼 hnoe 的回复:
可以用Grabber Filter抓包实现(SDK sample里面)
在回调函数中获取感兴趣的内容

稍微修改一下Grabber Filter,通过该Filter的input pin就能获得mepg2demuliplexer的output pin名称,一般来说,这个output pin都会有一个序号.因此也就知道这是哪个通道了


我能够通过OutputPin 得到 PID, 因为里面有多个视频流 和多个音频流,我现在能够控制显示哪些,哪些不显示。

关键是我怎么知道没有数据了,
[/Quote]

通过一个回调函数,当某个stream得到数据时就调用该函数,比如
void func(LPWSTR pid) // pid标志某个output
{
GetTickCount(); // 获取时间
// 把pid和时间记录下来
}
这样,通过时间记录就能知道是否有数据,以及什么时候有数据了
如何使用回调函数,可以参考Grabber Filter.

也可以在filter的每个实例中创建一个文件,写什么都行.

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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