9

BlackMagic SDK を使用してプレビュー アプリケーションを作成しようとしていますが、再生が途切れます。私は MFC フレームワークを使用しており、ビデオ プレビュー ウィンドウ用に CWnd をサブクラス化しています。

ビデオの各フレームが到着すると、RGB への色変換を行い、関数を呼び出して RGB ビットマップを表示します。

void VideoPreview::Display(int width, int height, byte* buffer)
{
    __int64 begin = GetTickCount();
    HRESULT     hr;
    CRect       rcRect, statusBarRect;

    GetClientRect (rcRect);

    BITMAPINFO bmInfo;
    ZeroMemory(&bmInfo, sizeof(BITMAPINFO));
    bmInfo.bmiHeader.biSize       = sizeof(BITMAPINFOHEADER);
    bmInfo.bmiHeader.biBitCount   = 32;
    bmInfo.bmiHeader.biPlanes     = 1;
    bmInfo.bmiHeader.biWidth      = width;
    bmInfo.bmiHeader.biHeight     = -height;

    dc->SetStretchBltMode(COLORONCOLOR);

    int iResult = StretchDIBits(*dc,
        rcRect.left, rcRect.top, rcRect.right, rcRect.bottom,
        0, 0, width, height,
        buffer, &bmInfo, 0, SRCCOPY);
    DWORD dwError;
    if (iResult == 0 || iResult == GDI_ERROR)
    {
        dwError = GetLastError();
    }
    else
        fpsCount++;
    procTimeCount += GetTickCount() - begin;
}

より滑らかなビデオを作成するにはどうすればよいですか?

更新

GDI の代わりに Direct2D を使用することになり、パフォーマンスが大幅に向上しました。以下のコードは、レンダリングに現在使用しているものです。

    // initialization
HRESULT hr = D2D1CreateFactory(
    D2D1_FACTORY_TYPE_SINGLE_THREADED,
    &pD2DFactory
    );
    // Obtain the size of the drawing area.
RECT rc;
GetClientRect(&rc);

// Create a Direct2D render target              
hr = pD2DFactory->CreateHwndRenderTarget(
    D2D1::RenderTargetProperties(),
    D2D1::HwndRenderTargetProperties(
    this->GetSafeHwnd(),
    D2D1::SizeU(
        1280, 720
        /*rc.right - rc.left,
        rc.bottom - rc.top*/)
        ),
    &pRT);

D2D1_BITMAP_PROPERTIES properties;
properties.pixelFormat = D2D1::PixelFormat(
  DXGI_FORMAT_B8G8R8A8_UNORM,
  D2D1_ALPHA_MODE_IGNORE);
properties.dpiX = properties.dpiY = 96;
hr = pRT->CreateBitmap(D2D1::SizeU(1280, 720), properties, &pBitmap);
ASSERT(SUCCEEDED(hr));

// per frame code
// buffer is rgb frame
HRESULT hr;
pRT->BeginDraw();
pBitmap->CopyFromMemory(NULL, buffer, width*4);
pRT->DrawBitmap(pBitmap);
pRT->EndDraw();
4

1 に答える 1

0

BlackMagic には、DirectShowビデオ ソース フィルタが付属しています。GraphEditPlusBlackMagic フィルタをビデオ ソースとしてレンダリング コードを生成するために使用します。Rendererフィルターは、選択した にリンクできますHWND。これにより、最高のパフォーマンスが得られるはずです。

バッファをブリットするために使用したとしても、現在の実装はより多くの使用を誘発するRAMと思います。CPUDirect2D

于 2014-12-11T23:13:34.073 に答える