在 VideoInfoHeader2 结构时抓取帧

Grabbing frames when VideoInfoHeader2 structure

本文关键字:抓取 结构 VideoInfoHeader2      更新时间:2023-10-16

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

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

问题在于抓取单个帧。为此,我使用了IMediaDet.如果只有VideoInfoHeader2,而没有VideoInfoHeader,这是不可能的。

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

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

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

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

示例抓取器和IMediaDet是已弃用的 DirectShow 编辑服务的一部分,其开发很久以前就停止了。如果您对库存 API 不满意,则必须使用更灵活的替换。例如,您可以从较旧的 DirectX 或平台 SDK 中获取类似的示例抓取器示例的源代码,并将其扩展以支持VIDEOINFOHEADER2

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

Microsoft对这个问题的回答是 - 因为他们放弃了DirectShow开发 - 更新的API媒体基础。然而,这个"答案"不是那么好是有原因的:有限的操作系统兼容性,对编解码器和格式的有限支持,与DirectShow几乎没有共同点的全新API,你需要重新设计你的应用程序。

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