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


Запись DV в uncompressed RGB

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

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

записи несжатой rgb-

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

Этот граф может показаться ненужным сложным, но гарантирует, что видеопоток в кодировке DV декодируется только один раз, что сводит к минимуму требования к ЦП. Кроме того, обратите внимание, что видео проходит через фильтр Smart Tee, пока звук проходит через фильтр Бесконечного пин-кода Tee. Смарт-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, декодер видео DV, Смарт-tee и бесконечные фильтры пин-кода, а также добавить каждый из них в граф фильтров. (Для краткости эти действия опущены из предыдущего кода.) В этом примере используется метод ICaptureGraphBuilder2::FindPin для поиска закреплений записи и предварительного просмотра в фильтре Smart Tee; запись всегда имеет выходной пин-код 0, а предварительная версия — 1.

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