직접 쇼 응용 프로그램에서 라이브 비디오 스트리밍에 선을 그려하려고합니다. 선을 성공적으로 그리지 만, 아래 함수를 호출하여 선을 계속 만들고 싶다면 에서 오류가 발생합니다. drawlineOverlay()
이 하나씩 기능을 수행하고 호출 중 8 개가 정상이지만 9 번째 이후의 호출은 정상이 아닙니다. SetAlphaBitmap
은 처음 8 건의 호출에 대해 S_OK
을 반환하고 9 번째 호출은 8007000E
을 반환합니다. 그러나 비디오 스트리밍은 오버레이 다이어그램 만 매달려 평화롭게 진행됩니다. 때로는 비디오 스트리밍이 중지되고 매달린 후 계속해서 해당 기능을 호출하면됩니다.메모리 부족 오류로 인해 Setalphabitmap이 작동하지 않습니다.
왜이 오류가 발생합니까?
void drawlineOverlay(HWND m_hwndApp)
{
int cx, cy;
HRESULT hr;
HBITMAP hbm;
RECT rcClient;
GetResolution(&cx,&cy);
GetClientRect(m_hwndApp,&rcClient);
HDC hdc = GetDC(m_hwndApp);
if (hdc == NULL)
{
return E_FAIL;
}
HDC hdcBmp = CreateCompatibleDC(hdc);
if (hdcBmp == NULL)
{
return E_FAIL;
}
hbm = CreateCompatibleBitmap(hdc,cx,cy);
BITMAP bm;
if (0 == GetObject(hbm, sizeof(bm), &bm))
{
DeleteDC(hdcBmp);
return E_FAIL;
}
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcBmp, hbm);
if (hbmOld == 0)
{
DeleteDC(hdcBmp);
return E_FAIL;
}
//To draw line
drawLine1(xx1, yy1, xx2, yy2,hdcBmp,2);
VMR9AlphaBitmap bmpInfo;
ZeroMemory(&bmpInfo, sizeof(bmpInfo));
bmpInfo.dwFlags = VMRBITMAP_HDC | VMRBITMAP_SRCCOLORKEY;
bmpInfo.hdc = hdcBmp;
SetRect(&bmpInfo.rSrc, 0, 0, bm.bmWidth, bm.bmHeight);
bmpInfo.rDest.left = 0.f;
bmpInfo.rDest.top = 0.f;
bmpInfo.rDest.right = 1.0f;
bmpInfo.rDest.bottom = 1.0f;
// Set the transparency value (1.0 is opaque, 0.0 is transparent).
bmpInfo.fAlpha = 0.5f;
bmpInfo.clrSrcKey = RGB(0,0,0);
if(m_pVideoRender != NULL)
{
IVMRMixerBitmap9* pBmp;
hr = m_pVideoRender->QueryInterface(IID_IVMRMixerBitmap9, (LPVOID *)&pBmp);
if (SUCCEEDED(hr))
{
hr = pBmp->SetAlphaBitmap(&bmpInfo);
if(FAILED(hr))
{
PrintMessage(L"pBmp->SetAlphaBitmap hr = 0x%x GetLastError() = %d\r\n",hr,GetLastError());
}
pBmp->Release();
//SAFE_RELEASE(pBmp);
}
}
// Clean up.
ReleaseDC(m_hwndApp, hdc);
DeleteBitmap(hbm);
DeleteObject(SelectObject(hdcBmp, hbmOld));
DeleteDC(hdcBmp);
}
void drawLine1(int xx1, int yy1, int xx2, int yy2,HDC hdcBmp)
{
RECT clntRc;
int temp,s1,s2,swap;
double dx,dy,p,x,y;
x = xx1;
y = yy1;
dx = abs(xx2 - xx1);
dy = abs(yy2 - yy1);
s1 = sign(xx2 - xx1);
s2 = sign(yy2 - yy1);
swap = 0;
if (dy > dx)
{
temp = dx;
dx = dy;
dy = temp;
swap = 1;
}
p = 2*dy - dx;
for (int i = 0; i < dx; i++)
{
clntRc.left =x;
clntRc.top = y;
clntRc.right = x+g_Thickness;
clntRc.bottom =y+g_Thickness;
FillRect(hdcBmp,&clntRc,CreateSolidBrush(RGB(0,255,0)));
while (p >= 0)
{
p = p - 2*dx;
if (swap)
x += s1;
else
y += s2;
}
p = p + 2*dy;
if (swap)
y += s2;
else
x += s1;
}
}
[mcve]를 입력하십시오. –
다음 호출 순서를 되돌려보십시오. DeleteBitmap (hbm); DeleteObject (SelectObject (hdcBmp, hbmOld))); – VuVirt
@VuVirt 방금 시도했지만 여전히 동일한 문제가 발생합니다. –