캡처 카드에서받은 일부 4 : 2 : 0 원시 데이터를 AVI 파일에 쓰려고합니다. 모든 픽셀에 대해 char 버퍼는 2 바이트 (16 비트)를 포함합니다. 데이터의 순서는 FOURCC UYVY : YUV 4 : 2 : 2 (모든 픽셀에서 Y 샘플, 각 라인에서 두 번째 픽셀마다 수평으로 샘플링 된 U 및 V)와 동일합니다. 매크로 픽셀은 1 개의 u_int32에 2 픽셀을 포함합니다.CU에서 Windows 용 비디오를 통해 4 : 2 : 0 YUV-Rawdata를 AVI 파일로 작성
먼저 OpenCV Videowriter를 사용해 보았습니다. 그러나이 엄청난 양의 비디오 데이터 (이 비디오 스트림을 캡처하고 있는데 각각 1080p25 형식입니다)가 느리기 때문에 Windows 용 "Video for Video"라이브러리로 전환했습니다.
우선은 AVIFile가 & AVIStream의 avi_left_s avi_left 초기화 : 캡처가 종료 된 경우
//m_byteBufferleft = rawdata as char array in UYVY-order
BYTE* bufferleft=(BYTE*)m_byteBufferleft;
// Writing Data
long size = width * height * 2;
HRESULT hr = AVIStreamWrite(avi_left_s,frameCount-1,1,bufferleft,size,AVIIF_KEYFRAME,NULL,NULL);
: 새로운 데이터가 도착하는 경우
HRESULT hr = S_OK;
AVIFileInit();
hr=AVIFileOpen(&avi_left,L"Test.avi",OF_WRITE|OF_CREATE, NULL);
if (hr != 0)
{
printf("AVI ERROR");
Sleep(3000);
exit(0);
}
//No compression output with 25 fps
al_info.fccType = streamtypeVIDEO;
al_info.fccHandler = 0;
al_info.dwScale = 1;
al_info.dwRate = 25;
al_info.dwSuggestedBufferSize = 0;
al_info.dwSampleSize = 0;
SetRect(&al_info.rcFrame, 0, 0,1920,1080);
//Define Header for the YUV-Rawdata
BITMAPINFO bi;
ZeroMemory(&bi,sizeof(bi));
BITMAPINFOHEADER &bmi = bi.bmiHeader;
bmi.biSize=sizeof(bmi);
bmi.biWidth=1920;
bmi.biHeight=1080;
bmi.biPlanes=1;
bmi.biBitCount=16;
bmi.biCompression=0x59565955;
bmi.biSizeImage = bmi.biWidth*bmi.biHeight*2;
bmi.biXPelsPerMeter=10000;
bmi.biYPelsPerMeter=10000;
bmi.biClrUsed=0;
bmi.biClrImportant=0;
hr = AVIFileCreateStream(avi_left,&avi_left_s,&al_info);
hr = AVIStreamSetFormat(avi_left_s, 0,&bmi,sizeof(bmi));
를 - 내 C++ 알고리즘은 다음과 같은 소스 코드가 포함되어 있습니다 :
//Closing AVIStream & AVIFile
AVIStreamClose(avi_left_s);
AVIFileClose(avi_left);
AVIFileExit();
하지만이 코드는 작동하지 않습니다. 괜찮아. 마지막 부분이 실행되는 동안 오류 메시지가 나타납니다. XsensDecklinkCapture.exe의 Unbehandelte Ausnahme bei 0x5ee36266 : 0xC0000005 : 0x1400005 : Zigriffsverletzung beim Lesen 위치 0xcdcdcdcd. 어쩌면 당신은 어떤 생각을 가지고 있을까요? 내 코드에 큰 실수가 있습니까?
죄송합니다.) 마침내 얻었습니다. 코드는 정상적으로 작동합니다.) 감사합니다. – user1213697
사실 실제로 속도를 높이기위한 아이디어가 매우 느립니다. – user1213697
느린 것이 있으면 원래 질문에 게시 한 코드가 아닙니다. 'AVI' API는 매우 가볍습니다. 비디오 프로세싱으로 워크 스테이션에 엄청난 부하가 걸린 지 15 년이 넘었으며, 이미 API가 그 당시에 훌륭하게 작동했습니다. 다른 곳에서는 속도가 느려지므로 디버깅 과정에서 이러한 처리 단계를 격리해야합니다. –