Windows 媒体基础 2D 缓冲区

Posted

技术标签:

【中文标题】Windows 媒体基础 2D 缓冲区【英文标题】:Windows media foundation 2D Buffer 【发布时间】:2020-03-17 18:25:25 【问题描述】:

我无法理解IMF2DBuffer 在什么情况下可以使用。在IMFMediaBuffer 上使用QueryInterface 会产生No such interface supported。 (我使用的是 Windows 10。)

我找到了这个措辞,但它很模糊:

此接口专为图像数据而设计。得到一个 指向此接口的指针,在媒体缓冲区上调用 QueryInterface。 并非所有媒体缓冲区对象都公开此接口。但如果媒体缓冲区确实公开了 IMF2DBuffer 接口,则应使用该接口 接口来访问数据,如果可能的话,而不是使用 IMF媒体缓冲区。您仍然可以使用 IMFMediaBuffer 接口,但它 可能效率较低。

我找不到任何关于它在什么情况下会公开或不公开这一点的信息。它依赖媒体吗?输出格式?编解码器?操作系统版本?真的不说了。

【问题讨论】:

【参考方案1】:

引用的语言建议您应该使用此界面的方式。您不应依赖媒体、输出格式、编解码器或操作系统版本。

这个想法是“有时”您可以使用此接口来更有效地访问数据。因此,如果您想微调处理,您可以拥有一个执行IMF2DBuffer 的代码路径和通用IMFMediaBuffer 的后备编解码器路径。

这是文档信息,有一定道理。

IMF2DBuffer 的可用性是特定于实现的。没有直接提及它何时可用,因为它是一个承诺:如果它被记录在案,那么就有一个承诺遵循它,没有理由接受这样的约束。

接口本身的文档解释说,当数据以非标准方式有效存储时,此接口会有所帮助。 IMFMediaBuffer 访问将不得不重新排列数据,这在性能方面可能不是那么有效。 IMF2DBuffer 方法反过来有助于完成某些任务/数据访问,而无需“昂贵”的数据重新安排。

【讨论】:

以上是关于Windows 媒体基础 2D 缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

ios avplayer 触发流媒体缓冲区不足

OpenGL 2D 双缓冲缩放

JavaSE8基础 StringBuffer delete trimToSize 清空字符串缓冲区与整理缓冲区的空间

如何在 1D 缓冲区中生成 2D 纹理并将其加载到 OpenGL 中?

JavaSE8基础 OutputStreamWriter flush 写入字符后要刷新缓冲区

JavaSE8基础 StringBuffer append 向缓冲区中变量的末尾追加字符串与缓冲区容量的自动扩充