DirectShow视频捕获筛选器IAMBufferNeairation::GetAllocatorProperties返回E_FAIL [英] Directshow video capture filter IAMBufferNegotiation::GetAllocatorProperties returns E_FAIL
问题描述
IAMBufferNegotiation::GetAllocatorProperties
并连接了捕获过滤器的输出引脚。它可以与音频捕获筛选器配合使用,但不能与视频捕获筛选器配合使用。
带音频捕获过滤器:
HRESULT:S_OK
CBuffers:4
CbBuffer:88200
CbAlign:1
Cb前缀:0
带视频捕获过滤器:
HRESULT:E_FAIL(0x80004005),Microsoft文档中未指定。他们表示,可能的值包括:S_OK、E_POINTER、VFW_E_NOT_CONNECTED(https://docs.microsoft.com/en-us/windows/win32/api/strmif/nf-strmif-iambuffernegotiation-getallocatorproperties)
那么为什么会这样呢?为什么我可以得到视频捕获过滤器的IAMBufferNegotiation
界面,甚至调用SuggestAllocatorProperties
成功(返回S_OK),但失败GetAllocatorProperties
?
推荐答案
IAMBufferNegotiation::SuggestAllocatorProperties
方法不是协商视频缓冲区大小的正确方式。
对于音频,此接口用于应用音频缓冲的首选项,而对于视频帧大小,则由引脚连接媒体类型(如DecideBufferSize
Calle.g. here)确定。
WITH VIDEOIAMBufferNegotiation
可用于指示视频捕获过滤器为数据交换分配或多或少的缓冲区,而不是缓冲区(帧)大小。则接口通常在连接管脚之前使用,因此还没有媒体类型,因此缓冲区大小可能无法预先使用,因此GetAllocatorProperties
失败。
.我想获取音频/视频缓冲区的缓冲区大小
音频:
IAMBufferNegotiation
的实施者提供此接口以让应用程序选择缓冲区延迟,特别是筛选器将在哪些区块中提供音频。
视频:
使用此接口并不实际。在某些情况下,过滤器实现者可能会让应用程序覆盖分配器中的视频缓冲区数量。生成视频的滤镜不希望通过此接口提供缓冲区大小。GetAllocatorProperties
旨在为应用程序提供重新检查建议是否得到遵守的方法,因此使用此接口检查缓冲区大小不是查询缓冲区大小的可靠方法。
如何检查缓冲区大小?
- 上游筛选器通常不需要检查,因为它们负责配置实际的分配器,所以它们知道大小;
- 下游Fitler在接收来自上游连接的分配器时检查此项,并与连接媒体类型进行比较; 应用程序不应该访问该接口,因为它与内部筛选器到筛选器通信相关,如果您需要此数据,则始终 有更好的查询方法。
这篇关于DirectShow视频捕获筛选器IAMBufferNeairation::GetAllocatorProperties返回E_FAIL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!