【问题标题】:Grabbing frames when VideoInfoHeader2 structureVideoInfoHeader2结构时抓取帧
【发布时间】:2023-04-07 16:03:01
【问题描述】:

我正在开发一个对视频文件进行分析的应用程序。 由于不是 DirectShow 专家,我使用简单的代码进行分析 所有帧(SampleGrabberCallback 等)。

这适用于所有媒体文件,即使使用解码 VideoInfoHeader2 结构(尽管它不应该,如各处所述)。

问题在于抓取单个帧。 为此,我使用了IMediaDet。如果只有VideoInfoHeader2,没有VideoInfoHeader,则不会这样做。

我尝试修改我的分析代码(OneShot、Seek),但没有成功。 互联网上与此相关的所有资源都不是很有帮助,因为它们指向无法再访问的 SDK/DX 示例,或者他们只是说修改会“容易”。 好吧,也许对于 DX 专家... (但我需要使用汽车,而不是先建造它...... ;-)

随着事情对我越来越重要,我的“解决方法”是用VideoInfoHeader2 重新编码所有视频,用VideoInfoHeader 保存它们,然后进行分析/抓取。

非常消耗资源,与智能相反... 任何帮助表示赞赏。

【问题讨论】:

    标签: c++ windows directshow


    【解决方案1】:

    您概述了仍然是最简单的解决方案的必要步骤(前提是您不放弃并使用 Windows API;相比之下,使用第三方库可能更容易,但这超出了本问题的范围)。

    Sample Grabber 和IMediaDet 是已弃用的 DirectShow 编辑服务的一部分,其开发早已停止。如果您对 stock API 不满意,则必须使用更灵活的替代方法。例如,您可以从旧版 DirectX 或 Platform SDK 中获取类似 Sample Grabber 示例的源代码,并将其扩展为支持 VIDEOINFOHEADER2

    IMediaDet 只不过是 COM 类,它在内部构建自己的图形来尝试解码视频。它不灵活,几乎每次构建自己的图表都是更可靠的解决方案。

    微软对这个问题的回答是——因为他们放弃了 DirectShow 开发——更新了 API Media Foundation。然而,这个“答案”不太好是有原因的:有限的操作系统兼容性、对编解码器和格式的有限支持、与 DirectShow 几乎没有共同点的全新 API,并且您需要重新设计您的应用程序。

    总而言之,您要么必须使用流行和解释的方法之一(无论它们看起来没有多大帮助)找到 Sample Grabber 替代品,要么切换到另一个 API 或第三方库。或者,另一种可能的解决方案是使用不同的过滤器/编解码器,它能够解码为VIDEOINFOHEADER 格式的媒体类型。

    【讨论】:

    • 感谢您的回答。我认为从新的 VIDEOINFOHEADER2 抓取帧将是一项非常常见的任务。如果情况如您所描述,我无法理解为什么不能简单地使用某处提供的源代码,因为通过旧(且难以找到)示例工作非常令人沮丧,深入了解 DirectShow 以便能够修改它对于 VIDEOINFOHEADER2。
    猜你喜欢
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多