Время представления последовательности

В этом разделе описывается, как источник Sequencer обрабатывает время презентации во время воспроизведения.

Общие сведения

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

В последовательности редактирования приложение заранее указывает длительность каждого сегмента перед началом воспроизведения. В последовательности списка воспроизведения приложение не указывает длительность заранее. (На самом деле длительность может быть неизвестна.)

В обоих случаях можно указать время начала и остановки мультимедиа для сегмента. Это время определяет позицию в исходном файле, где начинается и заканчивается сегмент. Например, предположим, что исходный файл имеет длину 90 секунд. Если вы хотите обрезать первые 10 секунд и последние 10 секунд, укажите следующие значения:

  • Запуск мультимедиа: 10 секунд
  • Остановка мультимедиа: 80 секунд

Чтобы указать время начала мультимедиа, задайте атрибут MF_TOPONODE_MEDIASTART на исходном узле. Чтобы указать время остановки носителя, задайте атрибут MF_TOPONODE_MEDIASTOP на исходном узле.

Чтобы создать последовательность редактирования, задайте атрибут MF_SESSION_GLOBAL_TIME при создании сеанса мультимедиа. В противном случае сеанс мультимедиа ожидает последовательности списков воспроизведения. В последовательности редактирования каждая топология сегмента должна иметь атрибуты MF_TOPOLOGY_PROJECTSTART и MF_TOPOLOGY_PROJECTSTOP .

Последовательности списков воспроизведения

В последовательности списка воспроизведения часы презентации начинаются с нуля и продолжаются через границы сегментов. Собственные источники предоставляют примеры с метками времени, равными времени мультимедиа. Конвейер преобразует метки времени в правильное время представления, как показано ниже.

  • Новая метка времени = время мультимедиа + смещение - начало мультимедиа

Значение смещения — это время представления, в котором закончился предыдущий сегмент. Для первого сегмента смещение равно нулю. Ниже приведены два примера вычисления этих преобразований меток времени:

  • Пример 1. Предположим, что первый сегмент (S1) составляет 10 секунд, а второй сегмент (S2) имеет нулевое время начала мультимедиа. Собственный источник использует время мультимедиа для своих меток времени, поэтому первый образец из S2 имеет метку времени, равную нулю. Смещение составляет 10 секунд (длительность S1), поэтому скорректированная метка времени: 0 + 10 − 0 = 10 секунд.
  • Пример 2. Предположим, что сегмент S1 имеет длину 10 секунд, а время начала носителя S2 составляет 5 секунд. Первый образец из S2 имеет метку времени 5 секунд (время мультимедиа). Смещение составляет 10 секунд, поэтому скорректированная метка времени: 5 + 10 − 5 = 10 секунд.

Все компоненты конвейера, подчиненные от исходных узлов, получают образцы с скорректированными метками времени. Исходные узлы в топологии могут иметь разное время запуска носителя, поэтому корректировки вычисляются отдельно для каждой ветви топологии.

При переключении презентации на следующий сегмент часы презентации не останавливаются и не сбрасываются, а время презентации монотонно увеличивается. Перед запуском нового сегмента сеанс мультимедиа отправляет приложению событие MESessionNotifyPresentationTime . Событие указывает время начала сегмента относительно часов представления и значение смещения. При запуске нового сегмента конвейер вызывает start в источнике sequencer со значением VT_EMPTY. Источник sequencer отправляет событие MESourceStarted без времени начала.

Для поиска приложение указывает идентификатор сегмента и смещение по времени в пределах сегмента. После поиска часы презентации начинаются со смещения сегмента . Ниже приведен пример того, как работает этот процесс:

  • Пример 3. Приложение стремится сегментировать S3 со смещением сегмента в 10 секунд. Часы представления начинаются с 10 секунд (смещение сегмента). Смещение не включает длительность сегментов S1 и S2. Источник sequencer отправляет событие MESourceStarted со временем начала, равным смещению сегмента, 10 секунд.

Если после поиска воспроизведение продолжается до следующего сегмента, переход работает так же, как в предыдущих примерах, за исключением того, что смещение не включает пропущенные сегменты.

Ниже приведены некоторые дополнительные сведения, влияющие на способ использования меток времени в примерах.

  • Декодеторы могут нуждаться в данных по истечении времени остановки носителя. Конвейер извлекает из источника столько данных, сколько требуется декодеру, а затем обрезает выходные примеры декодера.
  • Преобразования могут буферивывать данные. Например, для этого может потребоваться звуковой эффект. Когда сегмент заканчивается, метка времени для последней выборки из преобразования находится раньше конца сегмента, так как преобразование сдерживает некоторые данные. При запуске следующего сегмента метка времени в первой выборке немного раньше, чем начало сегмента. Нет пробелов в метках времени, поэтому данные, которые достигают приемника мультимедиа, являются непрерывными. После завершения последнего сегмента конвейер очищает преобразование, поэтому данные не теряются.
  • Чтобы получить предыдущий ключевой кадр, источнику может потребоваться запуститься немного раньше времени начала мультимедиа. Таким образом, после корректировки первый образец может иметь отрицательное время презентации.

Редактирование последовательностей

В последовательности редактирования приложение заранее задает границы сегмента, задавая атрибуты MF_TOPOLOGY_PROJECTSTART и MF_TOPOLOGY_PROJECTSTOP . Конвейер вычисляет корректировки для меток времени почти так же, как и для последовательности списков воспроизведения:

  • Для смещения используется значение MF_TOPOLOGY_PROJECTSTART вместо наблюдаемого конца сегмента.

  • Для поиска смещение использует значение, равное значению MF_TOPOLOGY_PROJECTSTART сегмента плюс смещение сегмента.

Таким образом, время презентации в последовательности редактирования всегда связано с началом презентации, даже если приложение стремится к другому сегменту.

Сеанс мультимедиа

Источник Sequencer