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


Использование мультимедийных потоков в приложениях

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

Примечание

Эти API являются устаревшими. Приложения должны использовать фильтр Sample Grabber или реализовать пользовательский фильтр для получения данных из графа фильтра DirectShow.

 

Интерфейсы потоковой передачи мультимедиа значительно упрощают процесс управления мультимедийными данными, устраняя зависимость от конкретных характеристик источника оборудования или программного обеспечения и обеспечивая поддержку всех форматов мультимедиа Microsoft DirectX®. Потоки абстрагируют данные на очень высоком уровне; Приложения даже могут перемещать данные из одного потока в другой, ничего не зная о формате данных.

Чтобы создать мультимедийный поток, выполните следующие действия.

  1. Создайте мультимедийный поток. Метод создания и инициализации потока зависит от архитектуры. DirectShow поддерживает интерфейс IAMMultiMediaStream , который используется для инициализации потока. Другие внутрипроцессные реализации IMultiMediaStream будут создаваться и инициализироваться с помощью различных механизмов.
  2. После инициализации объекта потока мультимедиа приложение будет использовать QueryInterface для получения интерфейса IMultiMediaStream для объекта . Используйте этот интерфейс для определения свойств потока и перечисления самих потоков. Вы можете получить определенный поток, вызвав метод IMultiMediaStream::GetMediaStream с определенным идентификатором назначения. MSPID_PrimaryVideo и MSPID_PrimaryAudio, представляющие основные видео- и аудиопотоки, являются наиболее часто используемыми идентификаторами назначения.
  3. Вызовите IUnknown::QueryInterface для интерфейса, относяскогося к типу мультимедиа потока. Если вы хотите отрисовывать видеопоток, например, извлеките его интерфейс IDirectDrawMediaStream . Интерфейсы мультимедиа определяют дополнительные методы, необходимые для полного использования возможностей формата.
  4. Создайте один или несколько примеров из данных потока. Каждый поток мультимедиа поддерживает метод IMediaStream::CreateSharedSample для создания примера. Результирующий пример поддерживает интерфейс IStreamSample , который обеспечивает контроль над образцом и его характеристиками. Как правило, поток мультимедиа поддерживает зависящий от формата метод создания образца, который является более мощным, чем упомянутые выше методы IStreamSample . Например, IDirectDrawMediaStream может создавать примеры, присоединенные к нужной поверхности DirectDraw и прямоугольнику обрезки. Однако в некоторых ситуациях необходимо обрабатывать данные, не зная о их формате. Если вы хотите выполнить потоковую передачу данных независимо от их формата, используйте метод IMediaStream::CreateSharedSample для создания примеров данных.
  5. После создания всех требуемых примеров потоков запустите поток, вызвав метод IMultiMediaStream::SetState , и передайте флаг STREAMSTATE_RUN в качестве параметра.
  6. Вызовите метод IStreamSample::Update , чтобы обновить пример потока. Когда метод IStreamSample::Update завершает работу, вы можете получить доступ к данным примера. Если требуется активировать определенный вызов события или функции при возврате обновления, передайте соответствующие указатели на метод IStreamSample::Update .

Дополнительные сведения об интерфейсах потоковой передачи мультимедиа см. в разделе Потоковая передача мультимедиа.