从 IMFSample 中提取 RGB32 字节数据

Extract RGB32 Byte Data from IMFSample

我有 IMFSample 数据,即 RGB32,我想将此格式转换为 BMP,或者我想提取实际的 RGB32 字节并保存到文件和然后使用一些外部工具转换为 BMP 或任何其他格式。

所以问题是如何从 IMFSample

中获取 RGB32 数据
  1. IMFSample::ConvertToContiguousBuffer 让你 IMFMediaBuffer 与数据交互
  2. IMFMediaBuffer::Lock 让您可以访问原始数据

确保完成后解锁。然后照常释放COM接口指针。

可以通过 ConvertToContiguousBuffer 调用获取 IMFMediaBuffer 接口(如另一个答案中所述)。 此外,可以在 IMFMediaBuffer 中查询 IMF2DBuffer:https://msdn.microsoft.com/en-us/library/windows/desktop/ms699894(v=vs.85).aspx。 它的Lock2D方法在访问原始数据时更方便快捷:https://msdn.microsoft.com/en-us/library/windows/desktop/aa473821(v=vs.85).aspx。例如,Lock2D 返回的指向数据的指针和音调可用于 SetDiBitsToDevice 调用。

此外,如果缓冲区来自硬件加速解码器,您还可以查询 IMFMediaBuffer 以获取 IMFDXGIBuffer 以访问底层 DXGI 表面作为 ID3D11Texture2D:https://msdn.microsoft.com/en-us/library/windows/desktop/hh447901(v=vs.85).aspx。 您可以通过 Map/Unmap DirectX 11 方法访问 DXGI 缓冲区中的原始数据:https://msdn.microsoft.com/en-us/library/windows/desktop/ff476457(v=vs.85).aspx

您还可以查询 IMFMediaBuffer 的 IMFGetService 并从中获取 IDirect3DSurface9 接口。可以通过它的 Lock/Unlock 方法访问基础数据。 以下是访问 IMFSample 的 IMFMediaBuffer 中的原始数据的首选顺序:https://msdn.microsoft.com/en-us/library/windows/desktop/bb530112(v=vs.85).aspx 如果 IMFGetService / IDirect3DSurface9 失败,可以查询 IMFDXGIBuffer。