Метки времени и длительность
В этом разделе описывается, как преобразования Media Foundation должны обрабатывать метки времени.
MFT должен задать как можно более точную метку времени и длительность во всех выходных примерах. Для простого MFT, который принимает один входной буфер и полностью обрабатывает его в выходной буфер, MFT должен просто скопировать метку времени и длительность непосредственно из входного примера в выходной образец. Однако многие преобразования являются более сложными, чем это, и может потребовать более сложных вычислений времени вывода. Все MFT должны соблюдать следующие основные правила:
- MFT должен попытаться поместить метку времени и длительность для всех несжатых видео или звуковых выходных примеров, если точный метка времени или длительность заданы в входных образцах или может быть вычисляться. Интерполяция может потребоваться для некоторых меток времени вывода, особенно для декодеров.
- Метки времени и длительность входных выборок должны сохраняться на выходных образцах как можно больше.
- Метки времени вывода или продолжительности могут не совпадать с входными данными, так как MFT удерживает данные или разбивает выходные данные на части разного размера, чем входные данные. В этом случае MFT должен вычислить метку времени вывода из самого раннего входного примера, содержащего данные, используемые для создания выходного примера. Чтобы вычислить метку времени вывода, добавьте входную метку времени соответствующего входного примера к длительности данных, которые уже были преобразованы из этого примера. Второй пример в конце этого раздела иллюстрирует эту идею.
- Если входные образцы имеют длительность, эта длительность должна быть сохранена. Если входной образец не имеет длительности, MFT должен вычислить длительность, если это возможно, из размера выходного буфера или скорости данных, заданной типом носителя.
- Вычисляемые продолжительности должны быть усечены (округлены вниз), а не округлены до ближайшего увеличения. Конвейер имеет достаточно простой для обработки длительности, которые немного неточные, но проще для конвейера обрабатывать длительность, которая составляет 1% слишком коротко, чем длительность, которая составляет 1% слишком долго. Тем не менее, нет никаких оснований намеренно сократить продолжительность, кроме округления.
Декодеры
Декодатор преобразует сжатые пакеты в несжатые данные. Так как выходные данные распаковываются, декодеры имеют особое обязательство получить метки времени и длительность правильно. Некоторые сжатые форматы, в частности MPEG-2, не имеют меток времени для всех входных пакетов и часто не имеют длительности в любом пакете. Для этих форматов декодатор отвечает за размещение допустимой метки времени и длительности для каждого выходного примера, суммируя подразумеваемые продолжительности всех выходных данных с момента последнего отметки входных данных.
Для видео, если длительность недоступна в сжатом формате, декодатор должен вычислить длительность как обратную частоту кадров, преобразованную в 100-наносекундных единиц и округленной.
Для звука, если длительность недоступна в сжатом формате, декодатор должен вычислить длительность в виде обратной частоты выборки звука, умноженной на число выборок в выходном буфере, преобразованного в 100-наносекундных единиц и округленного вниз.
Единственное время, когда преобразование должно выводить образец без метки времени, заключается в том, что MFT никогда не получил метку времени для входного образца или если нет способа вычислить точную метку времени вывода из предыдущей метки времени ввода.
Декодеры звука
Для декодировщиков звука продолжительность каждого выходного примера вычисляется по частоте выборки звука и количеству выборок PCM на канал в выходном буфере.
Правильный способ вычисления меток времени вывода зависит от того, содержат ли входные образцы метки времени.
Если входные образцы содержат метки времени, декодирования вычисляет выходные метки времени из входных меток времени следующим образом:
- Если каждый входной буфер содержит один или несколько полных сжатых кадров без частичных кадров, то метка времени вывода равна метке времени ввода, минус известная задержка декодера. Например, декодирования Dolby Digital (AC-3) имеет задержку 256 примеров PCM. Например, при частоте выборки 48 кГц задержка составляет 5,33 миллисекунда (msec). Таким образом, если входная метка времени составляет 1000 msec, выходной меткой времени является 1000 – 5,33 = 994,66 мс. Если входной буфер включает несколько целых сжатых кадров, декодатор создаст один выходной образец для каждого кадра в входном примере. Все выходные образцы будут правильно отметки времени, чтобы не было пробелов.
- В зависимости от формата транспорта входной буфер может содержать частичные кадры. Например, буфер может содержать часть кадра из предыдущего входного буфера, за которым следует один или несколько полных кадров, а затем начало следующего кадра. В этом случае обычно предполагается, что входная метка времени соответствует первому кадру, который начинается в буфере. (То есть частичный кадр, запущенный в предыдущем буфере, не включается в метку времени для текущего буфера.) Вычислите метку времени вывода соответствующим образом.
Если входные образцы не содержат метки времени:
- Декодировщик должен создавать собственные метки времени, задав для первой метки времени выходные данные равным нулю.
- Длительность выборки вычисляется по количеству выходных выборок в буфере и частоте выборки.
- Последующие метки времени вычисляются из предыдущей метки времени и длительности: текущая метка времени и текущая длительность = следующая метка времени. В выходных метках времени не должно быть пробелов.
Если входной поток изначально содержит метки времени, но по какой-то причине не переключается на метки времени, декодировщик должен продолжать создавать собственные выходные метки времени, таким образом, что они непрерывны и нет пробела.
Если входной поток содержит метки времени, но в то время есть пробелы, декодатор просто распространяет эти пробелы. Другими словами, декодатор не должен пытаться исправить несогласованные метки времени в входном потоке.
Смесители
Заметка
В Windows Vista конвейер Media Foundation не поддерживает MFT с несколькими входными данными. Много входные MFT поддерживаются в Windows 7.
Миксер принимает несколько входных данных и смешает их в один выход. Если входные потоки не полностью заблокированы или немного смещаются друг от друга, может возникнуть неоднозначность по поводу времени, в течение которого необходимо задать выходные данные. Ниже приведены некоторые рекомендации в зависимости от типа носителя:
Аудио. При запуске или сразу после сброса или очистки звуковой миксер должен ждать, чтобы создать выходные образцы, пока он не получил входной образец во всех необходимых входных потоках. На этом этапе она должна выбрать наиболее раннюю метку времени начальных выборок для использования в качестве базового показателя для выходных меток времени. Другие потоки должны быть заполнены тишиной, чтобы составить любое время несоответствия. Если образец получен в необязательный входной поток, его также следует учитывать в вычислении. С этого момента MFT должен стремиться создать непрерывную и неразрывную цепочку меток времени вывода. Как правило, MFT не должен пытаться учитывать одно смещение потока относительно другого. Вместо этого он должен вычислить выходные метки времени из базовой метки времени, скорости вывода и размеров буфера. При возникновении другого потока или очистки MFT должен сбрасывать свои базовые метки времени.
Видео. При запуске или сразу после сброса или очистки видеомиксатор должен ждать, чтобы создать выходные образцы, пока он не получил входной образец во всех необходимых входных потоках. На этом этапе она должна выбрать наиболее раннюю метку времени начальных выборок для использования в качестве базового показателя для выходных меток времени. Как правило, он должен стремиться к поддержанию непрерывных и регулярных меток времени вывода и фиксированных длительности, даже если входные данные не являются обычными, при необходимости повторяя входные кадры.
Кодеры
Кодировщик преобразует несжатый звук или видео в сжатые пакеты. Кодировщик должен следовать этим рекомендациям:
Кодировщик должен соответствовать соглашениям выходного формата. Если формат обычно не имеет метки времени для каждого примера, как в MPEG-2, то не каждый выходной образец должен иметь метку времени и длительность.
Метки времени ввода должны сохраняться в выходном формате, если формат имеет поля для меток времени, если сведения о времени не доступны из другого источника, например самого приложения.
Мультиплексоры
Заметка
В Windows Vista конвейер Media Foundation не поддерживает MFT с несколькими входными данными. Много входные MFT поддерживаются в Windows 7.
Мультиплексор объединяет два разных аудиопотока или видеопотока в один чередованный формат, например AVI или MPEG-2 Транспортный поток. Мультиплексер должен соответствовать следующим рекомендациям:
Мультиплексер должен соответствовать соглашениям формата выходных данных. Если формат обычно не имеет метки времени для каждого примера, как в MPEG-2, то не каждый выходной образец должен иметь метку времени и длительность.
Метка времени должна отражать самое раннее время, которое будет помещено на любой кадр, начинающийся в этом пакете, или время первого звукового образца, который будет декодирован из этого пакета. Игнорируйте эту инструкцию, если она конфликтует с соглашениями формата выходных данных.
Демультиплексеры
Демультиплексер разделяет чередуемый формат, например AVI или MPEG-2 Transport Stream, в базовые аудиопотоки и видеопотоки.
Если формат содержит определенные сведения о метках времени, которые можно использовать для вычисления точных меток времени вывода на основе меток времени ввода, эти сведения следует использовать. Однако если формат содержит время в совершенно другой базе, которая не имеет отношения к входным меткам времени, и точное смещение к метке времени ввода нельзя вычислить, собственные времена формата должны игнорироваться.
Если в формате нет доступных сведений о метки времени, демультиплексер должен соответствовать этим правилам:
При возможности несжатые выходные потоки должны иметь допустимые метки времени и длительность, вычисляемые из ближайшей предыдущей метки времени ввода.
Сжатые выходные потоки должны иметь метки времени только для первого выходного примера, полученного из входного примера с меткой времени. Если входной образец не имеет метки времени, выходные образцы, производные от этого входного примера, не должны иметь метку времени. Если входной образец разбивается на несколько выходных примеров, только первый выходной образец должен иметь метку времени, а остальные не должны иметь метки времени.
Примеры
Пример 1. Предположим, что эффект видео всегда принимает несжатый входной кадр, применяет эффект и копирует его в выходные данные. Он никогда не сохраняет какие-либо кадры или буферы входных данных. Этот MFT просто копирует метку времени и длительность из входного примера в выходной пример, если они доступны, и не выполняет вычисление времени вообще.
Пример 2. Предположим, что звуковой эффект преобразует все, кроме 10 миллисекунда (мс) каждого входного буфера, сохраняя дополнительные 10 мс для объединения со следующим буфером. Получает поток примеров, которые имеют длительность 50 мс. Время ввода отображается в следующей таблице.
Образец | Время ввода | Длительность ввода | Время вывода | Длительность вывода |
---|---|---|---|---|
1 | 20 | 50 | 20 | 40 |
2 | 70 | 50 | 60 | 50 |
3 | 121 | 50 | 110 | 50 |
4 | 171 | 50 | 161 | 50 |
Обратите внимание на несоответствие между фактической длительностью образца 2 и подразумеваемой длительностью на основе следующей метки времени (121 ? 70 = 51).
Так как MFT сохраняет 10 мс, он выводит первые 40 мс входного образца 1 в качестве выходного примера 1, с меткой времени 20 мс и длительностью 40 мс.
Выходной пример 2 объединяет 10 мс, ранее удерживаемых с 40 мс входного образца 2. Этот пример получает метку времени 60 мс (метка времени предыдущего входного примера, 20 мс, а также длительность данных, уже обработанных из этого примера, 40 мс). Она предоставляется длительностью 50 мс.
Аналогичным образом следующий пример имеет метку времени 110 мс (70 мс + 40 мс) с длительностью 50 мс.
Следующий расчет более интересен. Подразумеваемая метка времени от предыдущего выходного времени и длительности составляет 160 мс (метка времени 110 мс + длительность 50 мс). Тем не менее, метка времени вывода должна вычисляться из входной метки времени самого раннего входного примера, перекрывающего выходной образец во времени, а также длину всех данных, уже обработанных из этого примера. Ближайший перекрывающиеся входные образцы — это пример 4 (метка времени = 171), но это не самая ранняя. Самый ранний пример перекрытия — это пример 3 (метка времени = 121). Добавьте 40 мс, которые уже обработаны из этого примера, результат равен 161.
Связанные разделы