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