c++ - 写入 4 :2:0 YUV-Rawdata into an AVI-File via Video for Windows in C++

标签 c++ video avi

我正在尝试将从采集卡接收到的一些 4:2:0 原始数据写入 AVI 文件。对于每个像素,字符缓冲区包含 2 个字节(16 位)。数据的顺序与 FOURCC UYVY 相同:YUV 4:2:2(Y 在每个像素处采样,U 和 V 在每行上每隔一个像素水平采样)。一个宏像素在 1 个 u_int32 中包含 2 个像素。

首先我尝试了 OpenCV Videowriter。但这对于如此大量的视频数据来说太慢了(我正在捕获 2 个视频流,每个都是 1080p25 格式),所以我切换到 Windows 的“Video for Windows”-Library。我的 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 in XsensDecklinkCapture.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xcdcdcdcd。也许你有什么想法?我的代码中有什么大错误吗?

最佳答案

甚至在检查视频代码本身之前,一旦出现访问冲突异常,您就应该直接解决这个问题。您有异常 - 您可以检查异常位置的调用堆栈,您应该将其张贴在这里以提供导致问题的代码行。

使用 0xcdcdcdcd 时,您可能会遇到未初始化指针被访问的问题,就好像它是有效的一样。

关于c++ - 写入 4 :2:0 YUV-Rawdata into an AVI-File via Video for Windows in C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9310812/

相关文章:

c++ - 当从 GCC 3.1.2 移植到 4.2.2 时编码中断

c++ - 如何在主机内存上分配 OpenCL 缓冲区的一半,在设备内存上分配另一半?

.net - 如何在 UWP 中以位图形式从视频中读取帧

javascript - VideoJS居中播放按钮

video - 使用 OpenCV 从 .avi 视频中获取帧

c++ - C++中operator()和operator<有什么区别?

python - OpenCV:FFMPEG:未找到标记 0xffffffff/'����'(格式 'mp4/MP4 (MPEG-4 Part 14)')'

ffmpeg - 转换为 DV AVI Type-1 视频

ffmpeg - ffmpeg的限制?

c++ - 如何一次定义几个仅名称不同的函数(不使用宏)?