我正在尝试使用MediaFoundation API对视频进行编码,但我在将样本推送到SinkWriter时遇到了问题。
我正在通过桌面复制API获取帧编码。我最终得到的是ID3D11Texture2D,其中包含桌面图像。
我正在尝试创建一个包含此曲面的IMFVideoSample,然后将该视频样本推送到SinkWriter。
我尝试过以不同的方式解决这个问题:
我调用了MFCreateVideoSampleFromSurface(texture, &pSample)
,其中纹理是ID3D11Texture2D,填充在SampleTime和SampleDuration中,然后将创建的样本传递给SinkWriter。
SinkWriter返回E_INVALIDARG。
我尝试通过传递nullptr作为第一个参数并使用MFCreateDXGISurfaceBuffer自己创建缓冲区,然后将生成的缓冲区传递给Sample来尝试创建示例。 这也不起作用。
我仔细阅读了MediaFoundation文档,但无法找到有关如何使用DirectX纹理创建样本的详细信息。
我用完了很多东西试试 有没有人以前使用过这个API,可以想一想我应该检查的东西,或者我可以怎样调试这个?
答案 0 :(得分:1)
首先,您应该学会使用mftrace
tool。
很可能,它会马上告诉你这个问题。
但我的猜测是,可能存在以下问题。
除了SampleTime / SampleDuration之外,还可能需要一些其他属性。
可能SinkWriter需要一个可以在CPU上读取的纹理。要解决这个问题,当一个框架可用时,创建一个相同格式+大小的分段纹理,调用CopyResource将桌面复制到分段纹理,然后将该分段纹理传递给MF。
即使你使用硬件编码器让CPU从不尝试读取纹理数据,我也不认为将桌面纹理直接传递给MF是个好主意。
为样本设置D3D纹理时,不会在任何地方复制数据,样本只会保留纹理。
MF以异步方式工作,如果需要,它可以在其拓扑节点中缓冲多个样本。
DD同步为您提供数据,您只能访问AcquireNextFrame和ReleaseFrame调用之间的纹理。