gpt4 book ai didi

c++ - DirectShow 解码器减少媒体时间

转载 作者:太空宇宙 更新时间:2023-11-04 14:25:10 24 4
gpt4 key购买 nike

在 DirectShow 中,媒体样本有两个与时间相关的属性:时间戳和媒体时间。我的应用程序需要寻找视频中的特定帧,因此需要媒体时间。然而,看起来大多数解码器过滤器都不会传递此信息。

我有一个如下所示的 DirectShow 图:

[File Source (Async.)] -> [AVI Splitter] -> [<Video decoder>] -> [My filter]

我试过以下视频解码器:

  • 带 Mpeg4s 解码器 DMO 的 DMO 包装过滤器(这是我机器上 MPEG-4 的默认设置)
  • Xvid MPEG-4 视频解码器
  • MainConcept(演示)MPEG-4 视频解码器
  • ffdshow 视频解码器(ffdshow 试用版)

在这四个中,只有 ffdshow 解码器生成带有媒体时间的样本。其他三个只设置了时间戳,但将媒体时间留空。这看起来很奇怪,因为他们从 AVI 分离器获得的每个样本都正确设置了媒体时间。

有人知道为什么会这样吗?是否有一种变通方法可以让媒体时间可靠地工作,即使应用程序不断地跳过视频?

编辑(回应 kidjan):

假设我想阅读第 100 帧视频。对于 25fps 文件,此帧在视频中为 4 秒。使用过滤图的 IMediaSeeking 界面,我寻找到那个位置。在内部,此搜索请求被转发到拆分器过滤器(示例中的 AVI 拆分器)。但是,有两个潜在的问题:

  • 根据视频格式,我不能确定拆分器是否能够精确定位到第 100 帧。它可能会到达第 95 帧,而我必须阅读 5 帧才能获得正确的帧。
  • 分离器可能是帧精确的,但由于 DirectShow 的异步特性,解码器过滤器产生的下一帧可能是搜索之前的遗留物。如果解码器过滤器使用线程,它可能会在搜索操作之后传送该帧。

在这些情况下,解码器过滤器设置样本的媒体时间会很有帮助。这样,我就可以确定收到的是哪一帧。

我的问题归结为:
如何在 DirectShow 图形中抓取特定视频帧(按编号)?

最佳答案

并非所有解码器都遵循 DirectShow 的所有规则,因此损失媒体时间是您必须忍受的事情之一。如果您只处理 AVI 文件,则在使用 IMediaSeeking 时仅依赖于拆分器的准确性,并适本地使用 IMediaControl 的 Stop() 和 Pause() 以确保消除任何缓存的帧并且您拥有所需的帧。对于 AVI 文件,您可以从其标题中获取真实的帧速率,并在使用媒体时间失败时计算正确的寻道时间。

但对于非 AVI 文件,可能没有恒定的帧率,因此使用媒体时间进行搜索没有意义。

关于c++ - DirectShow 解码器减少媒体时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4555654/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com