解决IBasicVideo::GetCurrentImage返回0x8000ffff(E_UNEXPECTED Catastrophic failure)错误

2022-11-08 15:57:24 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

经过查阅一番资料后,得到如下的解决方案:

  • 方案1:使用替代的接口ISampleGrabber,代替IBasicVideo,具体调用的函数为:ISampleGrabber::GetCurrentBuffer.可以参考文章:dshow中使用Sample Grabber filter抓取图像。在我的开发环境win10 vs2013下没能找到ISampleGrabber接口;而在官方文档中提到ISampleGrabber接口已经被废弃。所以不建议使用此方案。顺便说一句,网上有方案解决找不到ISampleGrabber接口的问题,ISampleGrabber接口存在于QEdit.h中。
  • 方案二:使用 IVMRWindowlessControl9::GetCurrentImage;此方法需要用户自己释放它返回的内存。所以频繁的调用可能会有一定的问题。官方文档也有说明:This method can be called at any time, no matter what state the filter is in, whether running, stopped or paused. However, frequent calls to this method will degrade video playback performance. 所以在不频繁使用的情况下可以用此方案。
  • 方案三:还是使用IBasicVideo的接口。只不过修改底层的渲染器为VMR9,MS为了兼容问题,所以默认的情况下并不是使用VMR9渲染器。官方文档说明如下: Video Renderer only: This method fails if the renderer is using DirectDraw acceleration. Unfortunately, this depends on the end-user’s hardware configuration, so in practice this method is not reliable. Pause the Video Renderer before calling this method. Otherwise, the method returns VFW_E_NOT_PAUSED. Make sure that the pause operation has completed by calling IMediaControl::GetState; if the pause operation has not completed, the GetCurrentImage method returns E_UNEXPECTED. Depending on what data the source filter has available, the video renderer is not guaranteed to service this request. If no image is available, it returns E_FAIL. Video Mixing Renderer only: This method is reliable regardless of whether the VMR is using DirectDraw acceleration and regardless of the current graph state (running, stopped, or paused). Video Renderer and Video Mixing Renderer: To obtain the required buffer size to hold the image, call this method with a NULL pointer in the pDIBImage parameter. The method returns the required buffer size in the pBufferSize parameter. Allocate a buffer of that size and call the method again, with pDIBImage pointing to the buffer. On the second call, use pBufferSize to specify the buffer size. If the buffer is too small to hold the complete image, the method returns E_OUTOFMEMORY. If the method succeeds, the buffer is filled with the entire DIB image, including the BITMAPINFOHEADER structure, plus any palette entries and bit masks as defined in the Win32 BITMAPINFO structure. The format of the image depends on the type provided by the source filter, and cannot be specified in advance.

关于VM9的创建与使用可以参考:https://blog.csdn.net/a812073479/article/details/82994703

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

0 人点赞