簡體   English   中英

使用Direct3D渲染視頻

[英]Render video using direct3D

我們有一個使用DirectDraw 8的舊應用程序。它將一個像素一個像素地直接寫入視頻內存,一切都很好。 現在,我需要將其移植到Windows商店應用中。

Media Foundation似乎是渲染視頻的推薦途徑,並經歷了“ Media Engine本機C ++視頻播放示例(Windows 8.1)”,但即使Media Foundation也使用DirectDraw進行視頻渲染。

    ComPtr<ID3D11Texture2D> backBuffer; 
    DX11SwapChain->GetBuffer(0, IID_PPV_ARGS(&backBuffer));

     m_spMediaEngine->TransferVideoFrame(backBuffer.Get(), nullptr, &m_rcTarget, &m_bkgColor);

     DX11SwapChain->Present(1, 0);

因此,遍歷了Direct3D示例並能夠獲得backBuffer。 但是,所有樣本似乎都在處理繪圖線等,而與設置單個像素無關。

如何獲得像素? 即設置BackBuffer [somepixel] = someRGBA

UpdateSubresource對我來說很好。 我可以得到大約60 FPS,這相當不錯。

    // get a pointer directly to the back buffer
    swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), &Backbuffer);

    // Width and Height
    swapchain->GetDesc1(&scd);
    Width = scd.Width;
    Height = scd.Height;

    TextureData = new UINT32[Width * Height];


void CMyClass::Render()
{
    UINT n, i;
    UINT  *psrc;
    psrc = TextureData;
    i = ScreenColourI & 255;
    ScreenColourI += 1;

    for (n=0; n<Width*Height; n++)
    {
        *psrc++ = (i<<16) | (i<<8) | i ;
        i++;
        i &= 255;
    }

    myID3D11DeviceContext->UpdateSubresource (Backbuffer.Get(), 0, NULL, TextureData, Width*4, 0);

    // switch the back buffer and the front buffer
    swapchain->Present(1, 0);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM