Запись 4: 2: 0 YUV-Rawdata в AVI-файл через видео для Windows в C ++ - PullRequest
0 голосов
/ 16 февраля 2012

Я пытаюсь записать некоторые 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. Может быть, у вас есть идеи? Есть ли в моем коде большие ошибки?

1 Ответ

2 голосов
/ 16 февраля 2012

Прежде чем даже проверять видеокод как таковой, как только у вас возникнет исключение нарушения прав доступа, вы должны решить эту проблему напрямую.У вас есть исключение - вы можете проверить стек вызовов в позиции исключения, и вы должны опубликовать его здесь, чтобы указать строку кода, которая вызывает проблему.

С 0xcdcdcdcd вы, вероятно, будете иметь проблему с неинициализированным указателемдоступ к нему, как будто он действителен.

...