Я пытаюсь записать некоторые 4: 2: 0 необработанные данные, полученные с карты захвата, в AVI-файл. Для каждого пикселя буфер символов содержит 2 байта (16 бит). Порядок данных такой же, как у FOURCC UYVY: YUV 4: 2: 2 (выборка Y для каждого пикселя, выборка Y и V для каждого второго пикселя по горизонтали в каждой строке). Макропиксель содержит 2 пикселя в 1 u_int32.
Сначала я попробовал Videowriter OpenCV. Но это просто медленно для такого огромного количества видеоданных (я записываю 2 видеопотока, каждый в формате 1080p25), поэтому я переключился на библиотеку «Видео для Windows» - Windows. Мой C ++ - алгоритм содержит следующий исходный код:
Сначала я инициализирую AVIFile avi_left и AVIStream avi_left_s:
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));
Если поступают новые данные:
//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);
Если захват завершен:
//Closing AVIStream & AVIFile
AVIStreamClose(avi_left_s);
AVIFileClose(avi_left);
AVIFileExit();
Но этот код не работает нормально. Во время выполнения последней части я получаю сообщение об ошибке: Unbehandelte Ausnahme bei 0x5ee36266 в XsensDecklinkCapture.exe: 0xC0000005: Zugriffsverletzung beim Lesen Позиция 0xcdcdcdcd. Может быть, у вас есть идеи? Есть ли в моем коде большие ошибки?