Поделиться через


Запись DV в несжатый RGB

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

В этом примере показано, как записать dv с видеокамеры и сохранить его в файл в виде несжатого RGB во время предварительного просмотра. Используйте диаграмму фильтра, показанную на следующей схеме.

запись несжатого rgb-файла в файл

Фильтр разделителя DV разделяет чередующиеся аудио- и видеопотоки на отдельные видео и аудиопотоки. Видео с кодировкой DV передается в фильтр dv Video Decoder , который выводит несжатое видео RGB. Видео RGB направляется через фильтр Smart Tee в фильтр AVI Mux (для захвата) и отрисовщик видео (для предварительного просмотра). Тем временем аудиопоток из разделителя DV проходит через фильтр Бесконечное закрепление Tee в AVI Mux и звуковой отрисовщик. Диспетчер фильтров графов синхронизирует все эти потоки, используя метки времени в примерах и эталонные часы графа.

Этот граф может показаться излишне сложным, но он гарантирует, что видеопоток с кодировкой DV декодируется только один раз, что сводит к минимуму требования к ЦП. Кроме того, обратите внимание, что видео проходит через фильтр Smart Tee, а звук — через фильтр Infinite Pin Tee. Smart Tee может удалять кадры предварительного просмотра, чтобы повысить производительность захвата, что желательно для видео, но не для звука, где выброшенные примеры очень заметны. Кроме того, поскольку звук требует гораздо более низкой пропускной способности, чем видео, вероятность удаления звука в файле относительно невелика.

Этот граф необходимо построить по одному разделу за раз, но метод RenderStream по-прежнему может помочь. Используйте следующий код:

// Build the file-writing section of the graph.
hr = pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, 
    OLESTR("C:\\Example3.avi"), &pMux, 0);

// MSDV to DV splitter.
IBaseFilter *pDVSplit;  // Create the DV Splitter (CLSID_DVSplitter)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pDV, 0, pDVSplit);

// Splitter to DV Decoder to Smart Tee.
IBaseFilter *pDVDec; // Create the DV Decoder (CLSID_DVVideoCodec)
IBaseFilter *pSmartTee; // Create the Smart Tee (CLSID_SmartTee)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Video, pDVSplit, pDVDec,
    pSmartTee);

// Smart Tee (video) to Avi Mux.
IPin *pPin1;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 0, &pPin1);
hr = pBuilder->RenderStream(0, 0, pPin1, 0, pMux);

// Smart Tee to preview.
IPin *pPin2;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 1, &pPin2);
hr = pBuilder->RenderStream(0, 0, pPin2, 0, pMux);

// DV Splitter (audio) to Infinite Tee to Avi Mux.
IBaseFilter *pTee; // Create the Infinite Pin Tee (CLSID_InfTee)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Audio, pDVSplit, pTee, pMux);

// Infinite Pin Tee to preview.
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);

Необходимо создать фильтры Dv Splitter, DV Video Decoder, Smart Tee и Infinite Pin Tee и добавить каждый из них в граф фильтра. (Для краткости эти действия опущены в предыдущем коде.) В этом примере используется метод ICaptureGraphBuilder2::FindPin для поиска контактов захвата и предварительного просмотра в фильтре Smart Tee; Capture всегда является выходным контактом 0, а предварительный просмотр — выходным контактом 1.

Цифровое видео в DirectShow