代码之家  ›  专栏  ›  技术社区  ›  Mr Fooz

DirectShow的eof检测

  •  2
  • Mr Fooz  · 技术社区  · 15 年前

    是否有方法检测DirectShow filtergraph已到达其文件的结尾?在文件末尾,我的意思是带有SampleGrabber过滤器的filtergraph将永远不会收到另一个SampleCB调用。

    以下是一些不起作用的东西:

    • 相信 IMediaDet::get_StreamLength (人们常说视频中的帧比实际存在的帧多)
    • IMediaSeeking::GetDuration (与IMediaDet一致,+/-一帧)
    • IMediaControl::GetState (即使已从文件处理所有帧,filtergraph仍保持运行)

    背景:

    我正在做视频处理,我有一个类,创建了一个带有采样捕捉器的filtergraph。无论何时 SampleGrabber::SampleCB 调用时,我用互斥锁阻止它,以便在拉模式下运行filtergraph。当我准备好另一个帧时,我在主线程中解锁互斥并等待 SampleGrabber::SampleCB IMediaDet::获取\u流长度 告诉我视频的帧数比实际存在的帧数多。一旦我提取了最后一个帧并请求一个比实际存在的多的帧,主线程就会永远阻塞,因为 SampleGrabber::SampleCB 再也不会接到电话了。我想知道什么时候 SampleGrabber::SampleCB

    编辑:

    WaitForSingleObject

    2 回复  |  直到 15 年前
        1
  •  3
  •   David Rodríguez - dribeas    15 年前

    也许用 IMediaEventEx 界面其中一个事件代码是 EC_COMPLETE 记录为“已呈现特定流中的所有数据”

        2
  •  1
  •   Greg Beech    15 年前

    WaitForSingleObject ,您不能指定等待的超时时间吗?然后,如果等待返回是因为它超时了,而不是因为它收到了信号,那么您将知道这是最后一帧。