繁体   English   中英

从 CanvasBitmap 转换为 ID3D11Texture2D

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM