在C++中通过DirectShow将4:2:0YUV原始数据写入AVI文件
Writing 4:2:0 YUV-Rawdata into an AVI-File via DirectShow in C++
我正试图将从捕获卡接收的一些4:2:0原始数据写入AVI文件。对于每个像素,字符缓冲区包含2个字节(16位)。数据的顺序与FOURCC UYVY:YUV 4:2:2(在每一像素处进行Y采样,在每一行上水平地在每一秒像素处进行U和V采样)相同。宏像素在1u_int32中包含2个像素。
首先,我尝试了OpenCV视频编写器。但对于如此庞大的视频数据来说,这太慢了(我正在捕获两个视频流,每个都是1080p25格式),所以我切换到了"Windows视频"-Windows库。但即使是这个也不能实时地进行文件写入。我最后的机会是导演秀。我想使用AVI Mux和文件写入器过滤器将我的原始数据存储为AVI文件,但我不知道如何"给"AVI Mux我的原始信息(字符数组),它只包含UYVY顺序的视频数据,没有音频。也许你可以给我一个建议。这就是我现在所拥有的:
CoInitialize(NULL);
IGraphBuilder*pGraph= NULL;
CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void **)&pGraph);
IMediaControl*pMediaControl= NULL;
pGraph->QueryInterface(IID_IMediaControl,(void **)&pMediaControl);
ICaptureGraphBuilder2 *pCapture= NULL;
CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,CLSCTX_INPROC,IID_ICaptureGraphBuilder2, (void **)&pCapture);
IBaseFilter *pMux;
pCapture->SetOutputFileName(&MEDIASUBTYPE_Avi,L"Test.avi",&pMux,NULL);
IBaseFilter *pCap;
pCapture->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,pCap,NULL,pMux);
谢谢,
Valentin
(正如您在上一个问题中提到的10 fps,我认为这是有效帧速率)您是否正在将双1920x1080每像素12位10 fps写入文件中?这是每秒60兆字节,您可能刚刚达到HDD写入容量限制。
如果你的硬盘不够强大,选择不同的API是没有帮助的。您需要压缩数据,或者降低分辨率或FPS。或者使用更快的驱动器。
相关文章:
- 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文件