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


Объединение видеосъемки и предварительного просмотра

[Функция, связанная с этой страницей 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 имеет закрепление захвата и контакт предварительного просмотра. Он принимает один видеопоток из фильтра захвата и разделяет его на два потока: один для захвата и один для предварительного просмотра. Для поддержания пропускной способности в контакте захвата предварительный просмотр по мере необходимости удаляет кадры. Он также удаляет метки времени из каждого примера перед его доставкой по причинам, описанным в разделе DirectShow Video Capture Filters.

Хотя смарт-тройник разделяет поток, он физически не дублирует видеоданные. Вместо этого он использует пользовательские примеры объектов мультимедиа, которые совместно используют буферы. Примеры помечены как "доступные только для чтения", что гарантирует, что подчиненные фильтры не записывают данные.

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

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

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

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

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

Запись видео в файл