События источника Sequencer
Когда источник Sequencer Source воспроизводит последовательность файлов, сеанс мультимедиа обычно отправляет все те же события, которые отправляются во время обычного воспроизведения, и которые перечислены в события сеансов мультимедиа. Приложение получает эти события с помощью интерфейса МВФMediaEventGenerator сеанса мультимедиа.
Кроме того, существуют некоторые события, относящиеся к сегментам списка воспроизведения.
Событие | Описание |
---|---|
MENewPresentation | Сигнализирует приложению о предварительной подготовке следующей топологии. Чтобы обеспечить простой переход между двумя последовательными презентациями, источник последовательности загружает следующую топологию заранее. Хотя активная топология по-прежнему воспроизводит, источник последовательности отправляет это событие для следующей топологии, пока в источнике есть следующая топология. Эти данные события для этого события — дескриптор презентации для следующей топологии. Приложение отвечает за настройку соответствующей топологии в сеансе мультимедиа, как описано в разделе Using the Sequencer Source. |
MEEndOfPresentationSegment | Источник последовательности вызывает это событие, когда сеанс мультимедиа завершил воспроизведение текущего сегмента, если этот сегмент следует другому сегменту. (Если текущий сегмент является последним, источник последовательности вызывает событие MEEndOfPresentation.) Сеанс мультимедиа перенаправит это событие приложению. Как правило, приложение получает MEEndOfPresentationSegment после начала обработки следующего сегмента сеанса мультимедиа, но пока приемники мультимедиа по-прежнему предоставляют образцы для предыдущего сегмента. |
MESessionTopologyStatusс состоянием MF_TOPOSTATUS_SINK_SWITCHED. | Сеанс мультимедиа вызывает это событие при переходе к следующей топологии в источнике последовательности и приемниках мультимедиа завершили воспроизведение предыдущей топологии. Это событие содержит указатель на следующую топологию. |
Пример 1. Воспроизведение без пропуска
Если используется источник последовательности, количество событий, полученных из сеанса мультимедиа, может быть запутанным, особенно поскольку события, связанные с одним сегментом, часто пересекаются с событиями для следующего сегмента.
В первом примере приложение помещает в очередь три сегмента, S1, S2 и S3. Третий сегмент имеет флаг SequencerTopologyFlags_Last, чтобы сигнализировать о том, что он является последним сегментом в последовательности. Сегмент, которому соответствует каждое событие, присваивается в скобках. Также перечислены вызовы SetTopology приложения, чтобы сделать порядок операций более понятным.
- Вызовы приложений МВФMediaSession::SetTopology (S1)
- MESessionTopologySet (S1)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S1)
- MENewPresentation (предварительная версия S2)
- Вызовы приложений МВФMediaSession::SetTopology (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (начало S1)
- MESessionTopologySet (S2)
- MEEndOfPresentationSegment (конец S1)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED (S1)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (переход на S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (начало S2)
- MENewPresentation (предварительная версия S3)
- Вызовы приложений МВФMediaSession::SetTopology (S2)
- MESessionTopologySet (S3)
- MEEndOfPresentationSegment (конец S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (переход на S3)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S3)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (начало S3)
- MEEndOfPresentation (конец S3; последний сегмент)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED
- MESessionEnded
Этот список не включает каждое событие, которое может быть получено. (Например, он пропускает событие MESessionCapabilitiesChanged, которое отправляется при изменении возможностей сеанса. Приложение обычно получает несколько событий MESessionCapabilitiesChanged во время презентации.) Перечисленные здесь события — это те, которые показывают переход от одного сегмента к следующему. Наиболее важными событиями являются MENewPresentation, которая сигнализирует приложению о подготовке следующей топологии и MEEndOfPresentationSegment, которая сигнализирует конец сегмента (за исключением последнего сегмента).
Так как события в Media Foundation асинхронны и не сериализуются с помощью вызовов методов, точный порядок может отличаться. Например, можно получить MF_TOPOSTATUS_STARTED_SOURCE для S1 до вызова приложения SetTopology для S2.
Кроме того, вы можете не получить все события, перечисленные здесь. MEEndOfPresentation и события MESessionEnded, например, не отправляются, если последний сегмент не имеет флага SequencerTopologyFlags_Last.
Наконец, этот список не указывает на время. Время от "начала S1" до "конца S1" составляет всю длительность S1, которая может быть несколько секунд или много часов в зависимости от источника.
Пример 2. Воспроизведение с пропуском сегмента
В этом примере приложение помещает в очередь одни и те же сегменты, но пропускает сегмент 3 во время воспроизведения сегмента 1. В этом случае отправляются следующие события:
- Вызовы приложений МВФMediaSession::SetTopology (S1)
- MESessionTopologySet (S1)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S1)
- MENewPresentation (предварительная версия S2)
- Вызовы приложений МВФMediaSession::SetTopology (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (начало S1)
- MESessionTopologySet (S2)
- Вызовы приложений IMFMediaSession::Start (переход к S3)
- MENewPresentation (предварительная версия S3)
- Вызовы приложений МВФMediaSession::SetTopology (S3)
- MESessionStarted
- MEEndOfPresentationSegment (S1 отменено)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED (S1)
- MESessionTopologySet (S3)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (переход на S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (S2)
- MEEndOfPresentationSegment (отмена S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (переход на S3)
- MESessionTopologyStatus: TOPOSTATUS_READY (S3)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (S3)
Когда приложение вызывает Пуск, чтобы перейти к сегменту 3, источник последовательности отменяет сегмент 1, который по-прежнему воспроизводит. Событие MEEndOfPresentationSegment для этого сегмента содержит атрибут MF_EVENT_SOURCE_TOPOLOGY_CANCELED, указывающий, что сегмент закончился, так как он был отменен. Затем, так как сегмент 2 уже предварительно свернут, этот сегмент запускается, но затем немедленно отменяется. Событие MEEndOfPresentationSegment для сегмента 2 также содержит атрибут MF_EVENT_SOURCE_TOPOLOGY_CANCELED. Затем сеанс может переключиться на сегмент 3 и воспроизвести его обычно.
Связанные разделы