我正在开发一个对视频文件进行分析的应用程序。
作为DirectShow的专家,我使用简单的代码进行分析
所有帧(SampleGrabber
,Callback
等)。
这对于所有媒体文件都适用,即使使用VideoInfoHeader2
结构(尽管不应该如此,如各地所言)。
问题在于抓取单个框架。
为此,我使用了IMediaDet
。如果只有VideoInfoHeader2
,没有VideoInfoHeader
,则不会这样做。
我尝试修改我的分析代码(OneShot,Seek),但没有这样做。
互联网上所有与此相关的信息都没有太大帮助,因为它们指向了无法再访问的SDK / DX示例,或者只是说修改将是“容易的”。
好吧,也许对于DX专家来说...
(但我需要使用汽车,而不是先建造它……;-)
随着事情变得对我越来越重要,我的“解决方法”是使用VideoInfoHeader2
重新编码所有视频,使用VideoInfoHeader
保存它们,然后进行分析/处理。
资源非常消耗,而智能却与之相反。
任何帮助表示赞赏。
最佳答案
您概述了仍然是最简单解决方案的必要步骤(前提是您不放弃并使用Windows API;相比之下,使用第三方库可能会更容易,但这不在此问题的范围之内)。
Sample Grabber和IMediaDet
是已弃用的DirectShow Editing Services的一部分,其开发已在很久之前停止了。如果您对库存API不满意,则必须使用更灵活的替代方法。例如,您可以从较旧的DirectX或Platform SDK中获取相似的Sample Grabber示例的来源,并将其扩展为支持VIDEOINFOHEADER2
。IMediaDet
只是COM类在内部构造自己的图以尝试解码视频。这是不灵活的,几乎每次您构建自己的图形都是一种更可靠的解决方案。
微软对此问题的答案是-因为他们放弃了DirectShow开发-较新的API Media Foundation。但是,有一个原因使该“答案”不太好:有限的OS兼容性,对编解码器和格式的有限支持,全新的API(与DirectShow几乎没有共同点),您需要重新设计应用程序。
总之,您要么必须使用流行的且经过解释的方法之一找到Sample Grabber替代品(无论它们看起来没有多大帮助),要么切换到另一个API或第三方库。或者,另一种可能的解决方案是使用能够解码为VIDEOINFOHEADER
格式的媒体类型的其他筛选器/编解码器。