首页 文章

通过C中的DirectShow将4:2:0 YUV-Rawdata写入AVI文件

提问于
浏览
0

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

首先,我尝试了OpenCV Videowriter . 但这对于大量的视频数据来说太慢了(我正在捕获2个视频流,每个都是1080p25格式),所以我切换到Windows的“Video for Windows” - 图书馆 . 但即便是这个也不会实时写入文件 . 我的最后一次机会是Directshow . 我想使用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);

很多并且问候,

瓦伦丁

1 回答

  • 0

    (正如你在上一个问题中提到的10 fps,我认为是有效帧率)你是否将每像素双1920x1080 12位10 fps写入文件?这是每秒60兆字节,您可能只是达到了硬盘写入容量限制 .

    如果您的硬盘不够强大,选择不同的API将无济于事 . 您需要压缩数据,或降低分辨率或FPS . 或使用更快的驱动器 .

相关问题