我正在编写一个使用UWP Screen Capture API的屏幕捕获应用程序。
结果,我在目标帧或应用程序的图像的每一帧都得到了一个ID3D11Texture2D
的回调,我希望将其用作MediaFoundation的SinkWriter的输入,以在mp4容器文件中创建h264。
我面临两个问题:
要解决这些问题,我的方法是:
ID3D11DeviceContext::CopyResource
将原始纹理复制到使用D3D11_USAGE_STAGING
和D3D11_CPU_ACCESS_READ
标志创建的新纹理IMFMediaBuffer
缓冲区,并用MFCreateDXGISurfaceBuffer
包裹它,并将其强制转换为IMF2DBuffer
并使用IMF2DBuffer::ContiguousCopyTo
来< em>我用MFCreateMemoryBuffer
创建的IMFMediaBuffer 所以我基本上每帧都复制两次,一次在GPU上,一次在CPU上,这是可行的,但是效率很低。
有什么更好的方法? MediaFoundation是否足够聪明以处理具有填充的输入帧?
答案 0 :(得分:0)
效率低下是由于您尝试pointer
而不是将纹理用作视频编码器输入。 MF H.264编码器(在大多数情况下是一种硬件编码器)可以将视频内存支持的纹理作为直接输入,这就是您想要做的(分别设置编码器-请参阅D3D / DXGI设备管理器)。
填充不适用于纹理框架。如果使用传统的系统内存数据在帧中进行填充,则Media Foundation原语通常能够使用填充来处理数据:Image Stride和MF_MT_DEFAULT_STRIDE
,以及其他Video Format Attributes。