我想使用“英特尔®快速同步视频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并进行了多次实验(尝试使用不同的纹理创建标志),但是最好的结果是所有输入样本都被接受,但没有产生输出样本。万一重要,我从未尝试过将数据上传到纹理上,假设这与填充垃圾像素数据的纹理没有区别。
难道我做错了什么?
最佳答案
您基本上是在重复earlier question,但仍未添加任何无效的代码。
您可以提供正常的(内存中的)样本并使编码器工作,这一事实表明您正在做正确的一切。请注意,在Direct3D模式下,您不仅应提供Direct3D 9曲面或Direct3D 11纹理,而且还应遵守MFT的相应初始化。具体来说,纹理和MFT的内部必须属于同一Direct3D设备,因此必须在流开始之前执行必需的步骤。不仅需要调用MFCreateDXGISurfaceBuffer
。
通常,此方法在MSDN上的Supporting Direct3D 11 Video Decoding in Media Foundation文章中概述。同样适用于编码方案。您应使用IMFDXGIDeviceManager
指针,并应使用MFT_MESSAGE_SET_D3D_MANAGER
消息。 MFT按照MSDN的建议进行操作,并切换到Direct3D 11模式,以接受携带输入帧数据的基于纹理的样本。
关于c++ - 如何从D11纹理为Intel MFT编码器创建IMFSample,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43432670/