Время представления последовательности
В этом разделе описывается, как source Sequencer Source обрабатывает время презентации во время воспроизведения.
Обзор
Источник последовательности поддерживает два разных режима: последовательности списков воспроизведения и последовательности редактирования.
В последовательности редактирования приложение указывает длительность каждого сегмента заранее перед началом воспроизведения. В последовательности списков воспроизведения приложение не указывает длительность заранее. (На самом деле длительность может быть не известна.)
В обоих случаях можно указать время начала и остановки мультимедиа сегмента. В этих случаях укажите позицию в исходном файле, где начинается и заканчивается сегмент. Например, предположим, что исходный файл составляет 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 в источнике последовательности со значением VT_EMPTY. Источник последовательности отправляет событие MESourceStarted без времени начала.
Для поиска приложение задает идентификатор сегмента и смещение времени в сегменте. После поиска часы презентации начинаются в сегменте смещение. Ниже приведен пример работы этого процесса.
- Пример 3. Приложение стремится сегментировать S3 с смещением сегмента в 10 секунд. Часы презентации начинаются с 10 секунд (смещение сегмента). Смещение не включает длительность сегментов S1 и S2. Источник последовательности отправляет событие MESourceStarted со временем начала, равным смещением сегмента, 10 секунд.
После поиска, если воспроизведение продолжается до следующего сегмента, переход работает так же, как предыдущие примеры, за исключением того, что смещение не включает пропущенные сегменты.
Ниже приведены некоторые дополнительные сведения, влияющие на то, как выборки имеют метку времени:
- Декодеры могут потребовать данные за пределами времени остановки мультимедиа. Конвейер извлекает столько данных из источника, сколько требует декодировщик, а затем обрезает выходные образцы декодера.
- Преобразования могут буферивывать данные. Например, для этого может потребоваться звуковой эффект. Когда сегмент заканчивается, метка времени последнего примера из преобразования выше конца сегмента, так как преобразование удерживает некоторые данные. При запуске следующего сегмента метка времени первого образца немного выше начала сегмента. Нет пробела в метках времени, поэтому данные, которые достигают приемника мультимедиа, непрерывны. Когда конечный сегмент заканчивается, конвейер очищает преобразование, поэтому данные не будут потеряны.
- Источнику может потребоваться начать немного раньше времени начала мультимедиа, чтобы забрать предыдущий ключевой кадр. Поэтому после корректировки первый пример может иметь отрицательное время презентации.
Изменение последовательностей
В последовательности редактирования приложение заранее задает границы сегмента, задав MF_TOPOLOGY_PROJECTSTART и MF_TOPOLOGY_PROJECTSTOP атрибуты. Конвейер вычисляет корректировки меток времени почти так же, как и для последовательности списков воспроизведения:
Для смещения используется значение MF_TOPOLOGY_PROJECTSTARTвместо использования наблюдаемого конца сегмента.
Для поиска смещение использует значение, равное значению MF_TOPOLOGY_PROJECTSTART сегмента, а также смещение сегмента.
Таким образом, время презентации в последовательности редактирования всегда относительно начала презентации, даже если приложение стремится к другому сегменту.
Связанные разделы