在C++中通过Windows视频将4:2:0YUV原始数据写入AVI文件
Writing 4:2:0 YUV-Rawdata into an AVI-File via Video for Windows in C++
我正试图将从捕获卡接收的一些4:2:0原始数据写入AVI文件。对于每个像素,字符缓冲区包含2个字节(16位)。数据的顺序与FOURCC UYVY:YUV 4:2:2(在每一像素处进行Y采样,在每一行上水平地在每一秒像素处进行U和V采样)相同。宏像素在1u_int32中包含2个像素。
首先,我尝试了OpenCV视频编写器。但对于如此庞大的视频数据来说,这太慢了(我正在捕获两个视频流,每个流都是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 in XsensDecklinkCapture.exe:0xC0000005:Zugriffsverletzung beim Lesen an Position 0xcdcdcdcd。也许你有什么想法?我的代码中有什么大错误吗?
在检查视频代码本身之前,一旦出现访问违规异常,就应该直接解决这个问题。您有异常-您可以检查异常位置的调用堆栈,并且应该将其发布在此处以提供导致问题的代码行。
使用0xcdcdcdcd
,您可能会遇到未初始化的指针被当作有效指针访问的问题。
相关文章:
- C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?
- 从USBPcap库读取原始数据
- BoostSpirit.Qi-针对原始数据类型进行边界检查
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上
- 使用 QDataStream 对原始数据进行反序列化
- 当原始数据是常量时,修改指针指向的位置是 UB 吗?
- IMAGE_SECTION_HEADER的虚拟地址和指针到原始数据的差异
- 直接从 RAM 发送原始数据
- MEX C++原始数据访问
- 服务器客户端通过原始数据错误C 发送接收结构
- 如何从C 中的卷曲中获取原始数据
- 在C/C 中创建和发送原始数据包
- 如何捕获麦克风缓冲区原始数据
- 用原始数据填充 std::vector
- opencv::Mat,从原始数据中获取像素值
- 使用 Qt 通过蓝牙发送多个原始数据包
- 将sqlite原始数据读取到qbyTearray
- 矢量调整大小抛出bad_alloc会使原始数据无效
- 在C++中通过DirectShow将4:2:0YUV原始数据写入AVI文件
- 在C++中通过Windows视频将4:2:0YUV原始数据写入AVI文件