2012-11-29 9 views
8

BlackMagic SDK를 사용하여 미리보기 응용 프로그램을 작성하려고하지만 고르지 못한 재생이 발생합니다. MFC 프레임 워크를 사용하고 내 비디오 미리보기 창에 대한 CWnd 서브 클래 싱.비트 맵으로 비디오 프레임을 MFC 창에 그립니다.

비디오의 각 프레임이 도착하면 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; 
} 

더 부드러운 동영상을 만들려면 어떻게해야합니까?

업데이트 :

나는 Direct2D의 대신 GDI와 함께가는 결국 훨씬 더 나은 성능을 입수했습니다. 아래의 코드는 내가 렌더링을 위해 지금 사용하고 무엇을 :

// 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(); 
+1

한 번에 하나의 프레임을 수행하면 비디오 프로세서가 너무 느려지므로 비디오가 끊길 수 있습니다. 비디오 파이프 라인을 사용해야합니다. –

+0

음, 비디오는 가능한 한 실시간으로 표시되어야합니다. 비디오 파이프 라인에 대한 제안 사항이 있습니까? – wshirey

+0

죄송합니다. 제안이 있으면 답변을 남겼습니다. –

답변

0

에스엠은 DirectShow 비디오 소스 필터와 함께 제공됩니다. GraphEditPlus을 사용하여 BlackMagic 필터를 비디오 소스로 사용하여 렌더링 코드를 생성하십시오. Renderer 필터는 원하는 HWND에 연결할 수 있습니다. 최상의 성능을 제공해야합니다.

Direct2D을 사용하여 버퍼를 blit하더라도 현재 구현으로 인해 RAMCPU이 사용됩니다.

관련 문제