Запись 4: 2: 0 YUV-Rawdata в AVI-файл через DirectShow на 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.Но даже этот не выполняет запись файла в режиме реального времени.Мой последний шанс - Directshow.Я хочу использовать AVI Mux и фильтры File Writer для хранения моих необработанных данных в виде 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 голосов
/ 16 февраля 2012

(Как вы упомянули 10 кадров в секунду в предыдущем вопросе, который, как я полагаю, является эффективной частотой кадров) Вы записываете двойной 1920x1080 12 бит на пиксель 10 кадров в секунду в файл?Это 60 мегабайт в секунду, возможно, вы просто превышаете предел емкости записи на жесткий диск.

Выбор другого API не поможет, если ваш жесткий диск недостаточно мощный.Вам нужно либо сжать данные, либо уменьшить разрешение или FPS.Или используйте более быстрые диски.

...