Объединение захвата видео и предпросмотра

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

В предыдущих разделах описывается, как записать видео в различные форматы файлов. В разделе просмотр видео описывается создание графа динамической предварительной версии. Однако многие приложения должны одновременно выполнять оба действия. Чтобы создать объединенный граф предварительного просмотра и записи файлов, просто сделайте два вызова к ICaptureGraphBuilder2::RenderStream:

// Render the preview stream to the video renderer.
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, 
    NULL, NULL);

// Render the capture stream to the mux.
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap, 
    NULL, pMux);

В этом коде построитель графа захвата скрывает некоторые сведения.

  • Если фильтр захвата содержит разъем предварительного просмотра или разъем видеопорта, а также разъем записи, метод RenderStream просто отображает оба разъема, как показано на следующем рисунке.

    граф захвата и предварительного просмотра

  • Если у фильтра есть только захватный контакт, построитель графов захвата использует фильтр Smart Tee для разделения потока захвата. На следующем рисунке показан граф с Smart Tee.

    граф записи и предварительного просмотра с смарт-фильтра tee

Фильтр Smart Tee имеет контакт захвата и контакт предварительного просмотра. Он принимает один видеопоток из фильтра записи и разделяет его на два потока, один для записи и один для предварительной версии. Чтобы сохранить пропускную способность на контакте захвата, предпросмотровый контакт удаляет кадры по мере необходимости. Кроме того, он удаляет метки времени из каждого сампла перед передачей, по причинам, рассмотренным в разделе Фильтры видеозахвата DirectShow.

Хотя Smart Tee разбивает поток, он физически не дублирует видеоданные. Вместо этого он использует пользовательские объекты мультимедиа, которые совместно используют буферы. Образцы помечены как "только для чтения", чтобы гарантировать, что последующие фильтры не записывают данные.

Если в графе захвата есть окно предварительного просмотра, менеджер графов фильтров может остановить весь граф, включая поток захвата.

  • Блокировка компьютера.
  • Нажмите клавиши CTRL+ALT+DELETE на компьютере, который является членом домена.
  • Запуск полноэкранного приложения Direct3D, например игры или сохранения экрана.
  • Переключение мониторов или изменение разрешения дисплея.
  • Запуск программы, которая приводит к отображению диалогового окна управления учетными записями пользователей (UAC). (Windows Vista или более поздней версии.)
  • Запуск DOS в полноэкранном режиме.

Любое из этих событий может прервать сеанс записи, что может привести к потере данных. Вот что происходит внутри: средство отрисовки видео теряет необходимые ресурсы Direct3D или DirectDraw. В процессе восстановления этих ресурсов отрисовщик видео должен повторно подключиться к вышестоящему фильтру, что заставляет диспетчер фильтров остановить граф.

Ниже приведены два возможных решения этой проблемы.

  • Не включать поток предварительного просмотра. Однако помните, что метод ICaptureGraphBuilder2::RenderStream автоматически добавляет окно предварительного просмотра, если устройство захвата имеет контакт видеопорта. См. разъемы видеопорта в файле захвата.
  • Используйте механизм буферизации потоков для отправки потока предварительного просмотра в график в другом процессе.

Захват видео в файл