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


Запись dv-файла типа 2

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

Файл DV AVI типа 2 содержит два потока: один из них содержит видео DV, а другой — звук. Чтобы записать файл типа 2 во время предварительного просмотра, используйте диаграмму фильтра, показанную на следующей схеме.

Запись типа 2 с предварительной версией

Этот граф почти такой же, как и граф для захвата типа 1 (см. раздел Запись dv-файла типа 1). Однако поток записи проходит через фильтр разделителя DV , прежде чем достичь фильтра AVI Mux . Таким образом, мультиплекс AVI получает два потока: аудиопоток и видеопоток с кодировкой DV.

Создайте этот график следующим образом:

ICaptureGraphBuilder2 *pBuilder;  // Capture graph builder.
IBaseFilter           *pDV;       // DV capture filter (MSDV)
IBaseFilter           *pAviMux    // Avi Mux filter.
IBaseFilter           *pDVSplit;  // DV Splitter

// Initialize pDV (not shown). 
// Create and initialize the Capture Graph Builder (not shown).

// Create the DV Splitter and add it to the filter graph.
hr = CoCreateInstance(CLSID_DVSplitter, 0, CLSCTX_INPROC_SERVER,
    IID_IBaseFilter, reinterpret_cast<void**>)(&pDVSplit));
hr = pGraph->AddFilter(pDVSplit, L"DV Splitter");

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

// Connect the capture pin to the DV Splitter, and render one stream from
// the DV Splitter to the AVI Mux. 
hr = pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Interleaved, 
    pDV, pDVSplit, pAviMux);

// Render the other stream from the DV splitter to the AVI Mux.
hr = pBuilder->RenderStream(0, 0, pDVSplit, 0, pAviMux);

// Render the preview stream.
hr = pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Interleaved, 
    pDV, 0, 0);

// Remember to release all interfaces.
  1. Создайте разделитель DV и добавьте его в граф фильтра.
  2. Вызовите ICaptureGraphBuilder2::SetOutputFileName , чтобы подключить фильтр AVI Mux к фильтру модуля записи файлов.
  3. Вызовите ICaptureGraphBuilder2::RenderStream , чтобы подключить фильтр захвата MSDV к разделителу DV. Этот вызов также подключает один из выходных контактов разделителя DV к мультиплексии AVI.
  4. Вызовите RenderStream еще раз, чтобы подключить другой контакт разделителя DV к мультиплексу AVI.
  5. Вызовите RenderStream в третий раз для отрисовки потока предварительного просмотра. Пропустите этот шаг, если не хотите просматривать видео.

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