我有{strong> RGB32 的IMFSample数据,我想将此格式转换为BMP,或者我想提取实际的RGB32字节并保存到文件然后使用一些外部工具转换为BMP或任何其他格式。
所以问题是如何从IMFSample
获取 RGB32 数据
答案 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)
IMFSample::ConvertToContiguousBuffer
为您提供IMFMediaBuffer
数据接口IMFMediaBuffer::Lock
可让您访问原始数据确保在完成后解锁。然后通常发布COM接口指针。