我想使用实时视频我正在高效地从媒体基础解码。 最初,我在解码每个帧后同步运行渲染功能。传入的帧速率约为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();
}
答案 0 :(得分:1)
您可以尝试这样做:在解码器之后插入帧速率转换器DSP。确保您的输入格式与DSP兼容。将帧速率设置为60 fps。
这样做,我认为你可以保持同步方法。
如果您想以60 fps手动显示,我们需要更多代码才能查看问题的来源。