在 VideoInfoHeader2 结构时抓取帧
Grabbing frames when VideoInfoHeader2 structure
我正在开发一个对视频文件进行分析的应用程序。由于不是DirectShow的专家,我使用简单的代码进行分析所有帧(SampleGrabber
、Callback
等)。
这适用于所有媒体文件,即使使用 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
格式化的媒体类型。
- 为什么这个加载函数只抓取文件中的第一件事?
- 无法使用 OpenCv 3.4.5 从具有C++ dll 的网络摄像机 (rtsp) 中抓取帧
- 如何从日志文件中抓取状态代码?(在 C++ 中)
- DXGI API:AcquireTextFrame()从不抓取更新的图像,始终为空
- 如何从 avi 文件中抓取所有帧 - 如何修改 MS 样本采集卡样本
- 如何抓取指向Qt中弹出对话框的指针,该对话框阻止了QTest中的UI线程
- 为什么抓取窗口标题的代码会导致应用崩溃?
- 用Xcb而不是Xlib抓取像素的颜色
- 如何在C ++(qt)代码中使用python脚本?(网页抓取方面)
- OpenCV 3.2 在抓取时提供选择超时,但 fscyber 可以工作
- 使用 Matrox 进行帧抓取
- C++生产者使用者中,同一使用者线程会抓取所有任务
- 在编译时间之前抓取常数值
- OpenCV + QML(从另一个线程抓取帧)
- OpenCV视频捕获抓取和检索
- 从文本中抓取句子,将所有句子分别存储在某个数据结构中
- 视频抓取不起作用 OpenCV
- 不抓取时的QGraphicsPixmapItem mouseMoveEvent
- 从二进制文件中抓取文本时,为什么 xdg_vtnr=8 是我的结果
- 在 VideoInfoHeader2 结构时抓取帧