微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过将 RGB 缓冲区复制到媒体缓冲区的 H.264 编码存在对齐问题

如何解决通过将 RGB 缓冲区复制到媒体缓冲区的 H.264 编码存在对齐问题

我正在使用硬件加速的 h.264 编码和解码处理实时视频流,并且我能够使用 Windows Media Foundation 使其工作。

我从 IMFMediaBuffer 创建了 IMFSample,我使用 MFCreatedxgiSurfaceBuffer 从 ID3D11Texture2D 获取并使用硬件 MFT 编码为 h.264,并在解码后正确呈现。

目标是使用 BitBlt 获取 RGB 缓冲区并创建一个 IMFSample 以作为输入提供给 h.264 编码器。

现在,问题是当我尝试通过使用 GetDIBits 在其中存储 RGB 缓冲区来创建 IMFMediaBuffer 并创建 IMFSample 以提供 h.264 编码器时,我在解码后得到以下图像。

enter image description here

我还尝试了一种创建 IMFMediaBuffer 的方法,即使用 D3D11_MAPPED_SUBRESOURCE 从 ID3D11Texture2D 复制数据缓冲区并复制到 IMFMediaBuffer 而不是 MFCreatedxgiSurfaceBuffer 并创建了 IMFSample。它给出了与图像相同的结果。

我无法理解为什么 h.264 编码器在使用 MFCreatedxgiSurfaceBuffer 直接从 Texture 获取媒体缓冲区时编码没有问题,并且在使用 BitBlt 和 D3D11_MAPPED_SUBRESOURCE 将 RGB 缓冲区复制到媒体缓冲区时出现问题。

解决此问题的任何帮助表示赞赏。提前致谢。

解决方法

这是一个非常典型的问题,您没有提供足够的细节来获得好的提示。问题本质上是这样的:您对视频编码器输入(或更早)的数据做错了,并且您正在编码错误的数据。编码器接受数据是因为它在形式上是正确的,就具有预期属性而言:分辨率、媒体类型、纹理格式,并且它不验证像素数据本身。您拥有符合 H.264 规范的编码器输出,并且您可以播放视频,因为编码器正确编码了错误的输入数据。发布的代码可能会有所帮助。

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