陆老师请进,关于IMediaSeeking的问题

Bill1212 2004-07-06 02:04:34
我的push filter希望能具有seek功能,我就在我的输出pin上同时继承了CSourceSeeking,如下:

class CPushPinTS : public CSourceStream, public CSourceSeeking
{
public:
STDMETHODIMP NonDelegatingQueryInterface(REFIID iid, void **ppv);
........}

不过我在NonDelegatingQueryInterface中设了断点,可是graph并不查询IID_IMediaSeeking接口,这样我的app程序里的那个IMediaSeeking并不能起到作用。请问我该如何解决。下面是NonDelegatingQueryInterface函数。


STDMETHODIMP CPushPinTS::NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
if (riid == IID_IMediaSeeking)
{
return CSourceSeeking::NonDelegatingQueryInterface(riid, ppv);
}
return CSourceStream::NonDelegatingQueryInterface(riid,ppv);
}
...全文
290 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
show 2004-07-07
  • 打赏
  • 举报
回复
ms splitter 好象支持MPEG2 TS流,happydeer是不是啊?
Bill1212 2004-07-07
  • 打赏
  • 举报
回复
問題得到解決!
謝謝各位,方法是從別的對象的NonDelegatingQueryInterface調用CPushPinTS::NonDelegatingQueryInterface
Cocoky 2004-07-07
  • 打赏
  • 举报
回复
关注!!
Bill1212 2004-07-07
  • 打赏
  • 举报
回复
陆老师,那该如何是好呢?我现在就是想用我的TS Push把TS流推给ms demux呀。
happydeer 2004-07-07
  • 打赏
  • 举报
回复
ms mpeg2 splitter只支持拉模式的PS流。

use the MPEG-2 Splitter for MPEG-2 program streams delivered in pull mode that contain at least one of the following stream types: MPEG-2 video; MPEG-2 audio; AC3 audio encoded as defined for DVD video; or PCM audio encoded as defined for DVD video.

ms MPEG-2 Demultiplexer支持推模式的PS流和TS流。在Windows XP上,ms MPEG-2 Demultiplexer也支持拉模式的PS流。
Bill1212 2004-07-06
  • 打赏
  • 举报
回复
我把时钟设到Audio Render上,还是不能解决问题。我只是文件播放,应该不是LiveSource了吧?
Bill1212 2004-07-06
  • 打赏
  • 举报
回复
可是ms splitter不支持MPEG2 TS 流呀,所以我只能用MS Demux.
happydeer 2004-07-06
  • 打赏
  • 举报
回复
不明白你为什么要这么构建filter graph?

My TS push -> MS Demux 的功能就相当于微软的Mpeg2 splitter,为什么不用这个filter?
happydeer 2004-07-06
  • 打赏
  • 举报
回复
呵呵,这就是MS Demux的问题了。MS Demux扮演一个Live Source的角色(你可以看到这个filter实现了一个参考时钟),Live Source是不支持Seek的。作为MS Demux的前一级filter,就更别想来支持seek了。
Bill1212 2004-07-06
  • 打赏
  • 举报
回复
我的app里调用
HRESULT hr = m_pMediaSeek->SetPositions(&pos, AM_SEEKING_AbsolutePositioning,
NULL, AM_SEEKING_NoPositioning);
的返回码是:
HRESULT: 0x80004001 (2147500033)
Name: E_NOTIMPL
Description: The function called is not supported at this time
Severity code: Failed
Facility Code: FACILITY_NULL (0)
Error Code: 0x4001 (16385)
Bill1212 2004-07-06
  • 打赏
  • 举报
回复
我的连路是:
MS FileSource -> My TS push -> MS Demux -> Elecard Video Decoder -> VMR9.0
-> Elecard Audio Decoder -> Audio Render

虽然My TS Push支持MediaSeek,但是好像并没有人关心,因为没有人调用他的outputpin上的NonDelegatingQueryInterface来查询IMediaSeeking,(都是在查询别的interface。)
没有查询IMediaSeeking也因此,CSourceSeeking::ChangeStart不能被调用,我在里面的断点未被执行。
happydeer 2004-07-06
  • 打赏
  • 举报
回复
可能你的output pin后面的filter链路出了问题。你把这条链路怎么连的,贴出来。
happydeer 2004-07-06
  • 打赏
  • 举报
回复
你要保证你的OUTPUT PIN已经连接到了一个renderer filter(中间可以插入其他filter)。并且,从你的output pin到renderer filter的链路中,当filter graph manager执行seek操作时,会将相关seek操作从renderer filter往上一级一级发送到你的output pin。

当filter graph建立起来、尚未运行之前,有可能你的output pin收不到IMediaSeeking的接口请求。当filter graph运行起来,然后你做一下seek,看能不能进入CSourceSeeking::ChangeStart?

2,543

社区成员

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

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