我是DirectX的新手,我正在尝试做一个简单的应用程序,该应用程序读取视频并将其显示在Quad上。

我使用Windows Media Foundation(IMFSourceReader)阅读视频,当解码样本(IMFSample)时,该视频向我发送回调。

我想将此IMFSample *转换为ID3D11ShaderResourceView *,以将其用作绘制四边形的纹理,但是转换失败。

这是我的工作(我删除了不相关的错误检查):

HRESULT SourceReaderCB::OnReadSample(HRESULT hrStatus, DWORD dwStreamIndex, DWORD dwStreamFlags, LONGLONG llTimestamp, IMFSample *pSample)
{
    ...
    DWORD NumBuffers = 0;
    hr = pSample->GetBufferCount(&NumBuffers);

    if (FAILED(hr) || NumBuffers < 1)
    {
        ...
    }

    IMFMediaBuffer* SourceMediaPtr = nullptr;
    hr = pSample->GetBufferByIndex(0, &SourceMediaPtr);

    if (FAILED(hr))
    {
        ...
    }

    ComPtr<IMFMediaBuffer> _pInputBuffer = SourceMediaPtr;
    ComPtr<IMF2DBuffer2> _pInputBuffer2D2;

    bool isVideoFrame = (_pInputBuffer.As(&_pInputBuffer2D2) == S_OK);
    if (isVideoFrame)
    {
        IMFDXGIBuffer* pDXGIBuffer = NULL;
        ID3D11Texture2D* pSurface = NULL;

        hr = _pInputBuffer->QueryInterface(__uuidof(IMFDXGIBuffer), (LPVOID*)&pDXGIBuffer);
        if (FAILED(hr))
        {
            SafeRelease(&SourceMediaPtr);
            goto done;
        }

        hr = pDXGIBuffer->GetResource(__uuidof(ID3D11Texture2D), (LPVOID*)&pSurface);
        if (FAILED(hr))
        {
            ...
        }

        ID3D11ShaderResourceView* resourceView;

        if (pSurface)
        {
            D3D11_TEXTURE2D_DESC textureDesc;
            pSurface->GetDesc(&textureDesc);

            D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc;
            shaderResourceViewDesc.Format = DXGI_FORMAT_R8_UNORM;
            shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
            shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;
            shaderResourceViewDesc.Texture2D.MipLevels = 1;

            ID3D11ShaderResourceView* resourceView;
            hr = d3d11device->CreateShaderResourceView(pSurface, &shaderResourceViewDesc, &resourceView);
            if (FAILED(hr))
            {
                ... // CODE FAILS HERE
            }
            ...
        }
    }
}

我的第一个问题是,我将shaderResourceViewDesc.Format设置为DXGI_FORMAT_R8_UNORM,这可能只会给我红色图像(我将在以后进行研究)。

我面临的第二个阻塞性问题是,ID3D11Texture2D到ID3D11ShaderResourceView的转换失败,并显示以下错误消息:
ID3D11Device::CreateShaderResourceView: A ShaderResourceView cannot be created of a Resource that did not specify the D3D11_BIND_SHADER_RESOURCE BindFlag. [ STATE_CREATION ERROR #129: CREATESHADERRESOURCEVIEW_INVALIDRESOURCE]

我知道在创建纹理时会丢失一个标志,该标志阻止我执行我想做的事情,但是由于数据缓冲区是由WMF创建的,因此我不确定应该采取什么措施来解决此问题。

谢谢你的帮助

最佳答案

调试输出表明纹理不兼容,因为它是在没有D3D11_BIND_SHADER_RESOURCE标志的情况下创建的(在 BindFlag structureD3D11_TEXTURE2D_DESC字段中指定)。

您将阅读Media Foundation原语已经创建的纹理。在某些情况下,您可以更改创建标志,但是通常情况是,您需要自己创建兼容的纹理,在纹理之间复制数据,然后以纹理作为参数而不是原始纹理调用CreateShaderResourceView方法。

关于c++ - 将IMFSample *转换为ID3D11ShaderResourceView *,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45509705/

10-12 22:35
查看更多