2012-11-29 22 views
8

Tôi đang cố gắng viết một ứng dụng xem trước bằng cách sử dụng BlackMagic SDK, nhưng tôi đang phát lại bị phát. Tôi đang sử dụng MFC khuôn khổ, và phân lớp CWnd cho cửa sổ xem trước video của tôi.Vẽ các khung hình video dưới dạng bitmap thành MFC Window

Khi mỗi khung hình video đến, tôi chuyển đổi màu thành RGB và sau đó gọi hàm để hiển thị bitmap 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; 
} 

Có thể làm gì để tạo video mượt mà hơn?

Cập nhật:

tôi đã kết thúc đi với Direct2D thay vì GDI và đã nhận được hiệu suất tốt hơn. Mã bên dưới là những gì tôi đang sử dụng để hiển thị:

// 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

Làm một khung hình tại một thời điểm sẽ dẫn đến video bị giật vì nó quá chậm, ngay cả với các bộ vi xử lý hiện nay. Bạn cần sử dụng đường dẫn video. –

+0

Vâng, video cần được hiển thị gần với thời gian thực nhất có thể. Bất kỳ đề xuất nào về kênh video? – wshirey

+0

Xin lỗi, nếu tôi có đề xuất, tôi đã để lại câu trả lời. –

Trả lời

0

BlackMagic đi kèm với DirectShow bộ lọc nguồn video. Sử dụng GraphEditPlus để tạo mã hiển thị bằng bộ lọc BlackMagic làm nguồn video. Bộ lọc Renderer có thể được liên kết với một số HWND do bạn chọn. Điều này sẽ cho hiệu suất tốt nhất.

Tôi tin rằng việc triển khai hiện tại của bạn sẽ tạo ra nhiều hơn việc sử dụng RAMCPU, ngay cả khi bạn sử dụng Direct2D để xóa bộ đệm.

Các vấn đề liên quan