从Media Foundation高效获取Direct3D中的视频

时间:2015-12-15 08:39:05

标签: multithreading video-streaming rendering directx-11 ms-media-foundation

我想使用实时视频我正在高效地从媒体基础解码。 最初,我在解码每个帧后同步运行渲染功能。传入的帧速率约为25-30 fps,但我想将图形(游戏)内容渲染为60fps。 如果我异步进行,我会得到损坏的输出/黑屏/两者或由于激进的锁定而导致非常低的帧率。由于GPU操作是异步的,我无法找到合理的关键部分。这通常是怎么做的?我可以使用我的一个临时表面(source,dest或g_pDecodedTexture)作为同步点并使用CRITICAL_SECTION将它写入/它们,但我不知道关键部分应该放在渲染(读取)线程的哪个位置。如果我围绕整个渲染功能,我的帧率非常低,如果我不这样做,我会得到不正确的输出。也许还有另一种更适合同步的方法。

在渲染设置时间

    hr = g_d3dDevice->CreateShaderResourceView(g_pDecodedTexture, &shaderResourceViewDesc, &g_pTextureRV);

在解码线程中

      void Decode()
      {
           MFT_OUTPUT_DATA_BUFFER output = { 0 };
           //...
           encoder->ProcessOutput(0,1,&output,&status);
           // 
           CComPtr<IMFMediaBuffer>  spMediaBuffer;
           CComPtr<IMFDXGIBuffer>   spDXGIBuffer;
           CComPtr<IDXGIResource>  spDecodedTexture;

           output.pSample->GetBufferByIndex(0, &spMediaBuffer);
           spMediaBuffer->QueryInterface(IID_PPV_ARGS(&spDXGIBuffer);
           spDXGIBuffer->GetResource(IID_PPV_ARGS(&spDecodedTexture);

           //....

            CComPtr<ID3D11Texture2D> source;
            spDXGIBuffer->QueryInterface<ID3D11Texture2D>(&source);

            //
            CComPtr<ID3D11Resource> dest;
            swapChain->GetBuffer(0, __uuidof(ID3D11Resource), (void**)&dest);
            deviceContext->CopyResource(dest, source);
            deviceContext->CopyResource(g_pDecodedTexture, source);          
       }

在渲染线程中

void Render()
{
    //...
    deviceContext->PSSetShaderResources(0, 1, &g_pTextureRV);
    //..

    m_deviceContext->VSSetShaderResources(0, 1, &g_pTextureRV);
    //..
    immediateContext->DrawIndexed(...);   
    //..
    immediateContext->DrawIndexed(...);   
    //..
    immediateContext->DrawIndexed(...);   
    //..
    immediateContext->DrawIndexed(...);   
    //
    Present();
}

1 个答案:

答案 0 :(得分:1)

您可以尝试这样做:在解码器之后插入帧速率转换器DSP。确保您的输入格式与DSP兼容。将帧速率设置为60 fps。

这样做,我认为你可以保持同步方法。

如果您想以60 fps手动显示,我们需要更多代码才能查看问题的来源。