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();
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. –
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
Xin lỗi, nếu tôi có đề xuất, tôi đã để lại câu trả lời. –