我正尝试使用MediaFoundation API对视频进行编码,但我遇到了将示例推送到SinkWriter的问题。使用Media Foundation对Direct X表面进行编码
我正在通过Desktop Duplication API获取要编码的帧。我最终得到的是带有桌面图像的ID3D11Texture2D。
我试图创建一个包含此表面的IMFVideoSample,然后将该视频示例推送到SinkWriter。
我试着去了解这个以不同的方式:
我叫
MFCreateVideoSampleFromSurface(texture, &pSample)
其中质地的ID3D11Texture2D,填补了SampleTime和SampleDuration,然后通过创建样品到SinkWriter。
SinkWriter返回了E_INVALIDARG。我尝试通过传递nullptr作为第一个参数并使用MFCreateDXGISurfaceBuffer自己创建缓冲区,然后将生成的缓冲区传递到Sample中来创建示例。
这也没有工作。我阅读了MediaFoundation文档,找不到有关如何从DirectX纹理创建样本的详细信息。
我跑出来的东西尝试。
有没有人在那里使用过这个API,并且可以想到我应该检查的东西,或者我可以怎样去调试这个东西?
我认为你使用MFCreateVideoSampleFromSurface和MFCreateDXGISurfaceBuffer犯了一个错误。这些函数创建用于写入DirectX和可视化表面的缓冲区,并使用接口“IMF2DBuffer”创建对象,但编码器和编写器需要具有“IMFMediaBuffer”的对象。他们无法理解'IMF2DBuffer'。尝试使用函数'MFCreateSampleCopierMFT' - 它创建的MFT对象用于从[IMFMediaBuffer]复制到[MSDN]上的IMF2DBuffer(https://msdn.microsoft.com/en-us/library/windows/desktop/dd388101(v = vs.85)的.aspx)。可能是它可以做倒转的工作!?! –
你确定吗? 查看“MFCreateDXGISurfaceBuffer”的文档,它指出它返回一个指向IMFMediaBuffer的指针。 –
您可以尝试通过'MFCreateDXGISurfaceBuffer'中的'IMFMediaBuffer'缓冲区获取数据。 –