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


Метод ICaptureGraphBuilder2::RenderStream (strmif.h)

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

Метод RenderStream подключает выходной контакт исходного фильтра к фильтру приемника, при необходимости с помощью промежуточного фильтра.

Синтаксис

HRESULT RenderStream(
  [in] const GUID  *pCategory,
  [in] const GUID  *pType,
  [in] IUnknown    *pSource,
  [in] IBaseFilter *pfCompressor,
  [in] IBaseFilter *pfRenderer
);

Параметры

[in] pCategory

Указатель на GUID, указывающий одну из категорий контактов, перечисленных в разделе Набор свойств закрепления. Чтобы сопоставить любое закрепление независимо от категории, задайте для этого параметра значение NULL. Ниже приведены типичные значения.

  • PIN_CATEGORY_CAPTURE
  • PIN_CATEGORY_PREVIEW
  • PIN_CATEGORY_CC

[in] pType

Указатель на GUID основного типа, указывающий тип носителя выходного контакта; или NULL для использования любого контакта, независимо от типа носителя. Список возможных значений см. в разделе Основные типы.

[in] pSource

Указывает указатель на начальный фильтр для соединения или на выходной контакт.

[in] pfCompressor

Указатель на интерфейс IBaseFilter промежуточного фильтра, например фильтра сжатия. Может иметь значение NULL.

[in] pfRenderer

Указатель на интерфейс IBaseFilter фильтра приемника, например фильтр отрисовщика или фильтра мультиплексора. Если значение равно NULL, метод использует отрисовщик по умолчанию (см. примечания).

Возвращаемое значение

Возвращает значение HRESULT . Возможные возвращаемые значения включают следующие.

Код возврата Описание
S_OK
Успешно.
VFW_S_NOPREVIEWPIN
Предварительный просмотр был отрисован с помощью фильтра Smart Tee.
E_FAIL
Ошибка.
E_INVALIDARG
Недопустимый аргумент.
E_POINTER
Аргумент указателя NULL.
VFW_E_NOT_IN_GRAPH
Фильтр отсутствует в графе фильтров. Эта ошибка может возникнуть, если вы не вызвали AddFilter для добавления pSource, pIntermediate или pSink в граф. Это также может произойти, если вы не вызвали SetFiltergraph для подключения графа к построителю графов захвата. в этом случае объект Capture Graph Builder автоматически создает собственный граф фильтра. См. статью О построителе графов записи.

Комментарии

Этот метод отрисовывает поток, соединяя два или более фильтров в цепочке:

  • Параметр pSource указывает начало цепочки( фильтр или выходной контакт).
  • Параметр pIntermediate указывает промежуточный фильтр, обычно фильтр сжатия. Этот параметр может принимать значение NULL.
  • Параметр pSink указывает фильтр в конце цепочки. Как правило, этот фильтр является либо отрисовщиком для предварительного просмотра, либо мультиплексированием для записи файлов.
Метод подключает pSource к pIntermediate, а затем подключает pIntermediate к pSink. Если pIntermediate имеет значение NULL, метод просто подключает pSource к pSink. Все фильтры, заданные pSource, pIntermediate и pSink , должны быть добавлены в граф перед вызовом метода . Метод использует Intelligent Connect, поэтому в граф могут быть добавлены дополнительные фильтры, такие как декодеры.

Если параметр pSink имеет значение NULL, метод пытается использовать отрисовщик по умолчанию. Для видео используется отрисовщик видео, а для звука — отрисовщик DirectSound.

Если pSource является фильтром, метод выполняет поиск выходного маркера в этом фильтре. В этом случае используйте параметры pCategory и pType , чтобы сузить область поиска. Например, если фильтр имеет отдельные контакты для предварительного просмотра и записи, можно указать PIN_CATEGORY_CAPTURE или PIN_CATEGORY_PREVIEW. Если pSource является выходным контактом, задайте для pCategory и pTypeзначение NULL.

Во всех случаях метод выполняет поиск несвязанных контактов. Если заданным критериям соответствует несколько контактов, метод использует первый такой контакт, который он находит.

Обратите внимание, что для записи DV, если тип мультимедиа — MEDIATYPE_Interleaved, а параметр pSink имеет значение NULL, метод разделяет поток с чередованием на аудиопоток и видеопоток и отрисовывает оба этих потока.

Метод RenderStream обрабатывает многие сведения, необходимые для графов захвата:

Умный tee. Некоторые фильтры захвата имеют закрепление, но не предварительного просмотра. Для предварительного просмотра контакт захвата должен быть подключен к фильтру Smart Tee. Этот фильтр разделяет данные на два потока: поток записи и поток предварительного просмотра. При указании PIN_CATEGORY_PREVIEW или PIN_CATEGORY_CAPTURE метод вставляет фильтр Smart Tee, если он необходим. Затем он отрисовывает указанный поток в фильтре Smart Tee. Если вы отрисовываете поток предварительного просмотра и метод использует фильтр Smart Tee, он возвращает VFW_S_NOPREVIEWPIN.

Скрытые субтитры. Этот метод можно использовать для записи или предварительного просмотра скрытых субтитров. Некоторые фильтры записи предоставляют данные VBI, другие — данные с закрытыми субтитрами. Чтобы обработать любой случай, вызовите метод дважды, один раз с помощью PIN_CATEGORY_VBI и один раз с помощью PIN_CATEGORY_CC. Метод вставляет все фильтры, необходимые для преобразования данных VBI в скрытые субтитры. Для предварительного просмотра данных задайте для параметра pSinkзначение NULL. Чтобы записать данные в файл, используйте указатель интерфейса IBaseFilter фильтра мультиплексоров. Вы можете записывать и просматривать данные на том же графике. Вызовите метод один раз, используя значение NULL , и снова с помощью мультиплексера. Задайте для параметра pIntermediateзначение NULL.

Контакты видеопорта. Фильтры, работающие с оборудованием для захвата видеопорта (VPE), могут иметь контакты видеопорта (PIN_CATEGORY_VIDEOPORT) вместо контактов предварительного просмотра. Для работы предварительного просмотра или записи пин-код видеопорта должен подключиться к фильтру overlay Mixer. Метод обрабатывает эти сведения. Указывать PIN_CATEGORY_VIDEOPORT не нужно. Укажите PIN_CATEGORY_PREVIEW или PIN_CATEGORY_CAPTURE, и метод подключит контакт правильно. Аналогичным образом некоторые фильтры доставляют данные VBI с помощью контактов видеопорта (PIN_CATEGORY_VIDEOPORT_VBI). Как и в случае с PIN_CATEGORY_VIDEOPORT, метод обрабатывает эти сведения. Указывать PIN_CATEGORY_VIDEOPORT_VBI не нужно.

Поддержка фильтров. Если устройство захвата использует драйвер модели драйвера Windows (WDM), графу могут потребоваться определенные фильтры, вышестоящий из фильтра захвата видео WDM, например фильтр ТВ-тюнера или аналоговый фильтр видеоперекладки. Если этот метод успешно отрисовывает поток, он также вставляет все фильтры WDM, необходимые в графе. Метод запрашивает входные контакты в фильтре отслеживания, чтобы определить, какие среды они поддерживают, и подключает их к соответствующим фильтрам.

Пример кода

Для типичного графа захвата подключите контакт предварительного просмотра к отрисовщику по умолчанию без промежуточного фильтра:
C++
// Video: 
pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
    pCaptureFilter, NULL, NULL); 
// Audio:
pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Audio, 
    pCaptureFilter, NULL, NULL); 
Подключите закрепление записи к фильтру мультиплексора или фильтру записи файлов в зависимости от типа файла, который требуется вывести. Для файлов AVI используйте фильтр AVI Mux . Для файлов ASF используйте фильтр модуля записи WM ASF . Как правило, указатель на этот фильтр будет получен из параметра ppf метода ICaptureGraphBuilder2::SetOutputFileName .
C++
pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, L"C:\\Example.avi", 
    &ppf, &pSink);
pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
    pCaptureFilter, NULL, ppf);

Источники файлов

Этот метод можно использовать для перекодирования или повторного сжатия файла. В следующем обсуждении предполагается, что файл содержит не более одного видеопотока и одного аудиопотока или одного потока с чередованием. В противном случае метод будет работать неправильно.

Источник файла имеет один вывод, поэтому задайте для pCategory и pTypeзначение NULL. Вызовите метод дважды: один раз для отрисовки видеопотока, а один раз — для отрисовки аудиопотока. Первый вызов подключает исходный фильтр к фильтру синтаксического анализа и отображает один из выходных контактов фильтра синтаксического анализа. Второй вызов отрисовывает оставшиеся выходные данные средства синтаксического анализа. Если вы сжимаете один поток, но не другой, обязательно укажите фильтр сжатия в первом вызове. Метод автоматически выбирает правильный поток на основе типа сжатия.

C++
pBuilder->RenderStream(NULL, NULL, pSrc, pCompressor, pMux);
pBuilder->RenderStream(NULL, NULL, pSrc, NULL, pMux);
Полный пример см. в разделе Повторная сжатие AVI-файла.

Требования

Требование Значение
Целевая платформа Windows
Header strmif.h (включая Dshow.h)
Библиотека Strmiids.lib

См. также раздел

Создание графов с помощью конструктора графов захвата

Коды ошибок и успешного выполнения

Интерфейс ICaptureGraphBuilder2

Запись видео