[英]Convert from CanvasBitmap to ID3D11Texture2D
我有一个使用 Win2d 准备电影帧的程序。 该框架采用 CanvasBitmap 格式。 我想将这样的帧保存为电影。 为此,我从 CanvasBitmap 切换到 ID3D11Texture2D。 我按如下方式进行操作,但是在保存了数十个样本后,出现了“设备丢失”类型的错误。 可能原因是样品的发布。 是否有另一种方法可以从 CanvasBitmap 切换到 ID3D11Texture2D - 以便有效地保存电影帧?
int AddWin2DFrame (CanvasBitmap^ frame)
{
ComPtr<ID2D1Device> nativeDevice = GetWrappedResource<ID2D1Device>(frame->Device);
ComPtr<ID2D1Bitmap1> nativeBitmap = GetWrappedResource<ID2D1Bitmap1>(frame);
ComPtr<IDXGISurface> dxgiSurface;
CHK(nativeBitmap->GetSurface(&dxgiSurface));
ComPtr<ID3D11Resource> d3dResource;
CHK(dxgiSurface.As(&d3dResource));
Microsoft::WRL::ComPtr<IMFMediaBuffer> writeBuffer;
CHK(MFCreateDXGISurfaceBuffer(__uuidof(ID3D11Texture2D), d3dResource.Get(), 0, false, &writeBuffer));
ComPtr<IMF2DBuffer> p2DBuffer;
DWORD length;
writeBuffer->QueryInterface(__uuidof(IMF2DBuffer), &p2DBuffer);
CHK(p2DBuffer->GetContiguousLength(&length));
CHK(writeBuffer->SetCurrentLength(length));
Microsoft::WRL::ComPtr<IMFSample> writeSample;
CHK(MFCreateSample(&writeSample));
CHK(writeSample->AddBuffer(writeBuffer.Get()));
CHK(writeSample->SetSampleDuration(sampleDuration));
CHK(writeSample->SetSampleTime(_hnsSampleTime));
CHK(_spSinkWriter->WriteSample(_streamIndex, writeSample.Get()));
}
问题已经解决了。 通过设置 MF_SINK_WRITER_D3D_MANAGER 来修复它,如下所示:
ComPtr<IMFAttributes> spAttr;
CHK(MFCreateAttributes(&spAttr, 4));
CHK(spAttr->SetUnknown(MF_SINK_WRITER_D3D_MANAGER, deviceManager.Get()));
.........
CHK(MFCreateSinkWriterFromURL(ws1.c_str(), spByteStream.Get(), spAttr.Get(), &_spSinkWriter));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.