Tempos de Apresentação de Sequência

Este tópico descreve como o Sequencer Source lida com os tempos de apresentação durante a reprodução.

Visão geral

A origem do sequenciador dá suporte a dois modos diferentes: sequências de playlist e sequências de edição.

Em uma sequência de edição, o aplicativo especifica a duração de cada segmento com antecedência, antes de iniciar a reprodução. Em uma sequência de playlist, o aplicativo não especifica a duração com antecedência. (Na verdade, a duração pode não ser conhecida.)

Em ambos os casos, você pode especificar a hora de início e de parada de mídia de um segmento. Esses horários especificam a posição no arquivo de origem em que o segmento começa e termina. Por exemplo, suponha que o arquivo de origem tenha 90 segundos. Se você quisesse cortar os primeiros 10 segundos e os últimos 10 segundos, especificaria os seguintes valores:

  • Início da mídia: 10 segundos
  • Parada de mídia: 80 segundos

Para especificar a hora de início da mídia, defina o atributo MF_TOPONODE_MEDIASTART no nó de origem. Para especificar o tempo de parada de mídia, defina o atributo MF_TOPONODE_MEDIASTOP no nó de origem.

Para criar uma sequência de edição, defina o atributo MF_SESSION_GLOBAL_TIME ao criar a Sessão de Mídia. Caso contrário, a Sessão de Mídia espera sequências de playlist. Em uma sequência de edição, cada topologia de segmento deve ter o atributo MF_TOPOLOGY_PROJECTSTART e o atributo MF_TOPOLOGY_PROJECTSTOP .

Sequências de playlist

Em uma sequência de playlist, o relógio da apresentação começa em zero e continua entre os limites do segmento. As fontes nativas fornecem amostras com carimbos de data/hora iguais ao tempo de mídia. O pipeline converte os carimbos de data/hora no horário correto da apresentação da seguinte maneira:

  • Novo carimbo de data/hora = tempo de mídia + deslocamento − início da mídia

O valor de offset é a hora da apresentação em que o segmento anterior terminou. Para o primeiro segmento, o deslocamento é zero. Aqui estão dois exemplos de como essas conversões de carimbo de data/hora são calculadas:

  • Exemplo 1: suponha que o primeiro segmento (S1) tenha 10 segundos e o segundo segmento (S2) tenha uma hora de início de mídia igual a zero. A fonte nativa usa o tempo de mídia para seus carimbos de data/hora, portanto, o primeiro exemplo de S2 tem um carimbo de data/hora zero. O deslocamento é de 10 segundos (a duração de S1), portanto, o carimbo de data/hora ajustado é:0 + 10 − 0 = 10 segundos.
  • Exemplo 2: suponha que o segmento S1 tenha 10 segundos e S2 tenha um tempo de início de mídia de 5 segundos. O primeiro exemplo de S2 tem um carimbo de data/hora de 5 segundos (tempo de mídia). O deslocamento é de 10 segundos, portanto, o carimbo de data/hora ajustado é:5 + 10 − 5 = 10 segundos.

Todos os componentes de pipeline downstream dos nós de origem recebem amostras com os carimbos de data/hora ajustados. Os nós de origem em uma topologia podem ter tempos de início de mídia diferentes, portanto, os ajustes são calculados separadamente para cada branch da topologia.

Quando a apresentação alterna para o próximo segmento, o relógio da apresentação não para ou redefine e o tempo da apresentação aumenta monotonicamente. Antes de um novo segmento ser iniciado, a Sessão de Mídia envia ao aplicativo um evento MESessionNotifyPresentationTime . O evento especifica a hora de início do segmento, em relação ao relógio da apresentação e o valor do deslocamento. Quando um novo segmento é iniciado, o pipeline chama Iniciar na origem do sequenciador com o valor VT_EMPTY. A origem do sequenciador envia um evento MESourceStarted sem hora de início.

Para buscar, o aplicativo especifica um identificador de segmento mais um deslocamento de tempo dentro do segmento. Após a busca, o relógio de apresentação começa no deslocamento do segmento . Aqui está um exemplo de como esse processo funciona:

  • Exemplo 3: o aplicativo busca segmentar S3, com um deslocamento de segmento de 10 segundos. O relógio de apresentação começa em 10 segundos (o deslocamento do segmento). O deslocamento não inclui a duração dos segmentos S1 e S2. A origem do sequenciador envia um evento MESourceStarted com uma hora de início igual ao deslocamento do segmento, 10 segundos.

Após uma busca, se a reprodução continuar para o próximo segmento, a transição funcionará exatamente como os exemplos anteriores, exceto que o deslocamento não inclui os segmentos ignorados.

Aqui estão alguns detalhes adicionais que afetam como as amostras são carimbadas:

  • Os decodificadores podem precisar de dados além do tempo de parada de mídia. O pipeline extrai o máximo de dados da origem que o decodificador requer e, em seguida, corta os exemplos de saída do decodificador.
  • As transformações podem armazenar dados em buffer. Por exemplo, um efeito de áudio pode precisar fazer isso. Quando um segmento termina, o carimbo de data/hora no último exemplo da transformação é anterior ao final do segmento, pois a transformação está retendo alguns dados. Quando o próximo segmento é iniciado, o carimbo de data/hora no primeiro exemplo é ligeiramente anterior ao início do segmento. Não há nenhuma lacuna nos carimbos de data/hora, portanto, os dados que atingem o coletor de mídia são contínuos. Quando o segmento final termina, o pipeline drena a transformação, portanto, nenhum dado é perdido.
  • A origem pode precisar iniciar um pouco antes da hora de início da mídia para pegar o quadro-chave anterior. Portanto, após o ajuste, o primeiro exemplo pode ter um tempo de apresentação negativo.

Editando sequências

Em uma sequência de edição, o aplicativo especifica os limites do segmento com antecedência, definindo os atributos MF_TOPOLOGY_PROJECTSTART e MF_TOPOLOGY_PROJECTSTOP . O pipeline calcula os ajustes para os carimbos de data/hora quase da mesma maneira que para uma sequência de playlist:

Portanto, o tempo de apresentação em uma sequência de edição é sempre relativo ao início da apresentação, mesmo que o aplicativo busque outro segmento.

Sessão de Mídia

Origem do sequenciador