Eventos de origem do sequenciador
Quando a Origem do Sequencer reproduz uma sequência de arquivos, a Sessão de Mídia geralmente envia todos os mesmos eventos que são enviados durante a reprodução normal e que são listados em Eventos de Sessão de Mídia. O aplicativo obtém esses eventos usando a interface IMFMediaEventGenerator da Sessão de Mídia.
Além disso, há alguns eventos específicos para segmentos de playlist.
Evento | Descrição |
---|---|
MENewPresentation | Sinaliza o aplicativo para pré-registrar a próxima topologia. Para fornecer uma transição perfeita entre duas apresentações consecutivas, a origem do sequenciador carrega a próxima topologia com antecedência. Enquanto a topologia ativa ainda estiver em execução, a origem do sequenciador envia esse evento para a próxima topologia, desde que haja uma topologia subsequente disponível na origem. Esses dados de evento para esse evento são o descritor de apresentação para a próxima topologia. O aplicativo é responsável por definir a topologia correspondente na Sessão de Mídia, conforme descrito em Usando a origem do sequencer. |
MEEndOfPresentationSegment | A origem do sequenciador gera esse evento quando a Sessão de Mídia tiver concluído a reprodução do segmento atual, se esse segmento for seguido por outro segmento. (Se o segmento atual for o último, a origem do sequenciador gerará o evento MEEndOfPresentation em vez disso.) A Sessão de Mídia encaminha esse evento para o aplicativo. Normalmente, o aplicativo recebe MEEndOfPresentationSegment após a Sessão de Mídia começar a processar o próximo segmento, mas enquanto os coletores de mídia ainda estão fornecendo os exemplos para o segmento anterior. |
MESessionTopologyStatus, com MF_TOPOSTATUS_SINK_SWITCHED de status. | A Sessão de Mídia gera esse evento quando faz uma transição para a próxima topologia na origem do sequenciador e os coletores de mídia foram concluídos reproduzindo a topologia anterior. Esse evento contém um ponteiro para a próxima topologia. |
Exemplo 1: Reprodução sem ignorar
Quando a origem do sequenciador está envolvida, o número de eventos obtidos da Sessão de Mídia pode ser confuso, especialmente porque eventos associados a um segmento geralmente são intercalados com eventos para o próximo segmento.
No primeiro exemplo, o aplicativo enfileira três segmentos, S1, S2 e S3. O terceiro segmento tem o sinalizador SequencerTopologyFlags_Last , para sinalizar que é o último segmento na sequência. O segmento ao qual cada evento corresponde é dado entre parênteses. As chamadas SetTopology do aplicativo também estão listadas para tornar a ordem das operações mais clara.
- O aplicativo chama IMFMediaSession::SetTopology (S1)
- MESessionTopologySet (S1)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S1)
- MENewPresentation (pré-registro S2)
- O aplicativo chama IMFMediaSession::SetTopology (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (início do S1)
- MESessionTopologySet (S2)
- MEEndOfPresentationSegment (final de S1)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED (S1)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (transição para S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (início do S2)
- MENewPresentation (pré-registro S3)
- O aplicativo chama IMFMediaSession::SetTopology (S2)
- MESessionTopologySet (S3)
- MEEndOfPresentationSegment (final de S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (transição para S3)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S3)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (início do S3)
- MEEndOfPresentation (final de S3; último segmento)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED
- MESessionEnded
Essa lista não inclui todos os eventos que você pode receber. (Por exemplo, ele omite o evento MESessionCapabilitiesChanged , que é enviado sempre que os recursos da sessão são alterados. Um aplicativo normalmente recebe vários eventos MESessionCapabilitiesChanged durante uma apresentação.) Os eventos listados aqui são os que mostram a transição de um segmento para o outro. Os eventos mais importantes são MENewPresentation, que sinaliza o aplicativo para pré-registrar a próxima topologia e MEEndOfPresentationSegment, que sinaliza o fim de um segmento (exceto para o último segmento).
Como os eventos no Media Foundation são assíncronos e não são serializados com chamadas de método, a ordem exata pode variar. Por exemplo, você pode receber MF_TOPOSTATUS_STARTED_SOURCE para S1 antes que o aplicativo chame SetTopology para S2.
Além disso, talvez você não obtenha todos os eventos listados aqui. Os eventos MEEndOfPresentation e MESessionEnded , por exemplo, não são enviados, a menos que o último segmento tenha o sinalizador SequencerTopologyFlags_Last .
Por fim, essa lista não indica a passagem do tempo. O tempo de "início do S1" ao "fim do S1" é toda a duração de S1, que pode ser de alguns segundos ou muitas horas, dependendo da origem.
Exemplo 2: Reprodução com ignorar segmento
Neste exemplo, o aplicativo enfileira os mesmos segmentos, mas ignora para o segmento 3 enquanto o segmento 1 está sendo reproduzido. Nesse caso, os seguintes eventos são enviados:
- O aplicativo chama IMFMediaSession::SetTopology (S1)
- MESessionTopologySet (S1)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S1)
- MENewPresentation (pré-registro S2)
- O aplicativo chama IMFMediaSession::SetTopology (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (início do S1)
- MESessionTopologySet (S2)
- O aplicativo chama IMFMediaSession::Start (ignorar para S3)
- MENewPresentation (pré-registro S3)
- O aplicativo chama IMFMediaSession::SetTopology (S3)
- MESessionStarted
- MEEndOfPresentationSegment (S1 cancelado)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED (S1)
- MESessionTopologySet (S3)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (transição para S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (S2)
- MEEndOfPresentationSegment (S2 cancelado)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (transição para S3)
- MESessionTopologyStatus: TOPOSTATUS_READY (S3)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (S3)
Quando o aplicativo chama Iniciar para pular para o segmento 3, a origem do sequenciador cancela o segmento 1, que ainda está sendo reproduzido. O evento MEEndOfPresentationSegment para esse segmento contém o atributo MF_EVENT_SOURCE_TOPOLOGY_CANCELED , indicando que o segmento terminou porque foi cancelado. Em seguida, como o segmento 2 já está pré-rolado, esse segmento é iniciado, mas cancelado imediatamente. O evento MEEndOfPresentationSegment para o segmento 2 também contém o atributo MF_EVENT_SOURCE_TOPOLOGY_CANCELED . Em seguida, a sessão pode alternar para o segmento 3 e reproduzi-la normalmente.
Tópicos relacionados