从IMFSample中提取RGB32字节数据

时间:2017-03-25 09:35:16

标签: winapi video ms-media-foundation

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

所以问题是如何从IMFSample获取 RGB32 数据

2 个答案:

答案 0 :(得分:2)

可以通过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。例如,可以在SetDiBitsToDevice调用中使用指向Lock2D返回的数据和音高的指针。

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

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

答案 1 :(得分:0)

  1. IMFSample::ConvertToContiguousBuffer为您提供IMFMediaBuffer数据接口
  2. IMFMediaBuffer::Lock可让您访问原始数据
  3. 确保在完成后解锁。然后通常发布COM接口指针。