DirectShow视频捕获筛选器IAMBufferNeairation::GetAllocatorProperties返回E_FAIL [英] Directshow video capture filter IAMBufferNegotiation::GetAllocatorProperties returns E_FAIL

查看:0
本文介绍了DirectShow视频捕获筛选器IAMBufferNeairation::GetAllocatorProperties返回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方法不是协商视频缓冲区大小的正确方式。

对于音频,此接口用于应用音频缓冲的首选项,而对于视频帧大小,则由引脚连接媒体类型(如DecideBufferSizeCalle.g. here)确定。

WITH VIDEOIAMBufferNegotiation可用于指示视频捕获过滤器为数据交换分配或多或少的缓冲区,而不是缓冲区(帧)大小。则接口通常在连接管脚之前使用,因此还没有媒体类型,因此缓冲区大小可能无法预先使用,因此GetAllocatorProperties失败。

.我想获取音频/视频缓冲区的缓冲区大小

音频:

IAMBufferNegotiation的实施者提供此接口以让应用程序选择缓冲区延迟,特别是筛选器将在哪些区块中提供音频。

视频:

使用此接口并不实际。在某些情况下,过滤器实现者可能会让应用程序覆盖分配器中的视频缓冲区数量。生成视频的滤镜不希望通过此接口提供缓冲区大小。GetAllocatorProperties旨在为应用程序提供重新检查建议是否得到遵守的方法,因此使用此接口检查缓冲区大小不是查询缓冲区大小的可靠方法。

如何检查缓冲区大小?

  • 上游筛选器通常不需要检查,因为它们负责配置实际的分配器,所以它们知道大小;
  • 下游Fitler在接收来自上游连接的分配器时检查此项,并与连接媒体类型进行比较;
  • 应用程序不应该访问该接口,因为它与内部筛选器到筛选器通信相关,如果您需要此数据,则始终 有更好的查询方法。

这篇关于DirectShow视频捕获筛选器IAMBufferNeairation::GetAllocatorProperties返回E_FAIL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆