如何解决通过将 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 编码器时,我在解码后得到以下图像。
我还尝试了一种创建 IMFMediaBuffer 的方法,即使用 D3D11_MAPPED_SUBRESOURCE 从 ID3D11Texture2D 复制数据缓冲区并复制到 IMFMediaBuffer 而不是 MFCreatedxgiSurfaceBuffer 并创建了 IMFSample。它给出了与图像相同的结果。
我无法理解为什么 h.264 编码器在使用 MFCreatedxgiSurfaceBuffer 直接从 Texture 获取媒体缓冲区时编码没有问题,并且在使用 BitBlt 和 D3D11_MAPPED_SUBRESOURCE 将 RGB 缓冲区复制到媒体缓冲区时出现问题。
对解决此问题的任何帮助表示赞赏。提前致谢。
解决方法
这是一个非常典型的问题,您没有提供足够的细节来获得好的提示。问题本质上是这样的:您对视频编码器输入(或更早)的数据做错了,并且您正在编码错误的数据。编码器接受数据是因为它在形式上是正确的,就具有预期属性而言:分辨率、媒体类型、纹理格式,并且它不验证像素数据本身。您拥有符合 H.264 规范的编码器输出,并且您可以播放视频,因为编码器正确编码了错误的输入数据。发布的代码可能会有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。