如何从D11纹理为Intel MFT编码器创建IMFSample

时间:2017-04-16 00:54:45

标签: c++ video-encoding ms-media-foundation mft

我想使用“英特尔®快速同步视频H.264编码器MFT”对视频进行编码。 如果我从系统缓冲区创建IMFSample,它运行良好。就像下面这样:

IMFMediaBuffer *pBuffer = NULL;
MFCreateMemoryBuffer(cbSize, &pBuffer);
BYTE *pData = NULL;
pBuffer->Lock(&pData, NULL, NULL);
memcpy(pData, bufferIhaveinYYYYUV format, buffer size);
pBuffer->Unlock();
IMFSample *pSample = NULL;
MFCreateSample(&pSample);
pSample->AddBuffer(pBuffer);

现在我正在研究是否可以将ID3D11Texture2D曲面作为输入(DXGI_FORMAT_NV12,1280x720),以提高性能。我尝试将使用MFCreateVideoSampleFromSurface或MFCreateDXGISurfaceBuffer创建的IMFSample实例传递给IMFTransform :: ProcessInput并进行多次实验(尝试不同的纹理创建标记),但最好的结果是所有输入样本都被接受,但没有生成输出样本。如果它很重要,我从未真正尝试将数据上传到纹理,假设这与填充垃圾像素数据的纹理没有区别。

我做错了吗?

1 个答案:

答案 0 :(得分:1)

您基本上是在重复earlier question,但仍然没有添加任何无效的代码。

您可以提供正常(内存中)样本并让编码器正常工作这一事实表明您正在做正确的事情。请注意,在Direct3D模式下,您不仅要提供Direct3D 9曲面或Direct3D 11纹理,还要遵守MFT的相应初始化。具体来说,纹理和MFT的内部必须属于相同的Direct3D设备,因此必须在流式传输开始之前执行所需的步骤。不仅需要调用MFCreateDXGISurfaceBuffer

通常,Supporting Direct3D 11 Video Decoding in Media Foundation文章中的MSDN概述了该方法。这同样适用于编码方案。您应该使用IMFDXGIDeviceManager指针,并且您应该使用MFT_MESSAGE_SET_D3D_MANAGER消息。 MFT按照MSDN的建议运行,并切换到Direct3D 11模式,接受带有输入帧数据的基于纹理的样本。