Поделиться через


Метки времени и длительности

В этом разделе описывается, как преобразования 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 миллисекунд (мс). Таким образом, если входная метка времени составляет 1000 мс, то выходная метка времени будет 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, на базовые аудио- и видеопотоки.

Если формат содержит определенные сведения о метках времени, которые можно использовать для вычисления точных выходных меток времени на основе входных меток времени, эти сведения следует использовать. Однако если формат содержит раз в совершенно другой базе, которая не имеет никакого отношения к входным меткам времени, а точное смещение входной метки времени не может быть вычислено, собственное время формата следует игнорировать.

Если формат не содержит сведений о метки времени, демультиплексер должен следовать следующим правилам:

  • Несжатые выходные потоки должны иметь допустимые метки времени и длительность, если это возможно, вычисляемые на основе ближайшей предыдущей метки времени ввода.

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

Примеры

Пример 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

 

Обратите внимание на несоответствие в 1 мс между фактической длительностью выборки 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.

Написание пользовательского MFT