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();
한 번에 하나의 프레임을 수행하면 비디오 프로세서가 너무 느려지므로 비디오가 끊길 수 있습니다. 비디오 파이프 라인을 사용해야합니다. –
음, 비디오는 가능한 한 실시간으로 표시되어야합니다. 비디오 파이프 라인에 대한 제안 사항이 있습니까? – wshirey
죄송합니다. 제안이 있으면 답변을 남겼습니다. –