Модель буфера утечки контейнеров (Microsoft Media Foundation)

При потоковой передаче мультимедиа по сети декодер получает закодированные данные с теоретически постоянной скоростью (скорость передачи). Декодер использует эти данные для создания декодированных выходных данных. Однако в общем случае декодер использует данные с переменной скоростью, так как кодировщик может использовать переменную скорость кодирования.

Модель "дырявого контейнера" — это способ моделирования требований к буферизации для плавного воспроизведения. В этой модели декодер поддерживает буфер. Закодированные данные походят из сети в буфер, а из буфера — в декодер. Если буфер недостаточно, это означает, что декодер удаляет данные из буфера быстрее, чем сеть доставляет их. Если буфер переполнен, это означает, что сеть доставляет данные быстрее, чем декодер использует их.

В этом разделе описывается модель буферов "утечки" для кодирования и декодирования.

Негерметичность ведра

Чтобы понять модель дырявого контейнера, рассмотрим ведро с небольшим отверстием в нижней части. Контейнер определяется тремя параметрами:

  • Емкость (B)
  • Скорость, с которой вода вытекает из ведра (R)
  • Начальная заполненность контейнера (F)

В этой метафоре контейнер является буфером:

Иллюстрация, показывающая буфер в виде контейнера, скорость ввода в виде воды, поступающей в контейнер, и скорость вывода, как вода выходит через отверстие в контейнере

Если вода наливается в ведро с точной скоростью R, ведро останется на уровне F, так как скорость ввода равна скорости вывода. Если скорость ввода увеличивается, а R остается постоянной, в контейнере накапливается вода. Если скорость ввода превышает R в течение длительного периода, в конечном итоге контейнер переполняется. Однако скорость ввода может меняться вокруг R без переполнения контейнера, если средняя скорость ввода не превышает емкость контейнера. Чем больше емкость, тем больше скорость ввода может меняться в течение заданного периода времени.

В ASF контейнер с утечкой определяется тремя параметрами:

  • Средняя скорость передачи данных в байтах в секунду, соответствующая скорости вывода (R)
  • Окно буфера, измеряемое в миллисекундах, которое соответствует емкости контейнера (B).
  • Начальная заполненность буфера, которая обычно имеет нулевое значение.

Скорость передачи данных измеряет среднее количество битов в секунду в закодированном потоке. Окно буфера измеряет количество миллисекундах данных с той скоростью, которая может поместиться в буфере. Размер буфера в битах равен R * (B / 1000).

Полезные данные ASF могут поступать в контейнер утечки в нерегулярное время и в нерегулярных количествах, но должны оставлять контейнер с постоянной положительной скоростью передачи. Из-за буферного окна возможна задержка между временем поступления полезных данных в контейнер и его выходом. Максимальная задержка, которая может произойти, — B/R. Данные полезных данных, которые входят в контейнер, соответствуют времени презентации и никогда не должны переполнять контейнер. Помимо времени презентации, каждая полезная нагрузка также имеет время отправки — время, когда полезные данные покидают контейнер в соответствии с скоростью передачи. Время отправки должно быть раньше времени презентации, чтобы гарантировать, что при приближении к заполнению негерметичего контейнера все полезные данные покидают контейнер до или во время его презентации. Для этого время презентации смещается на значение B/R ( предварительная версия), а время отправки начинается с нуля. Время отправки должно быть не позднее времени представления, так как это указывает на то, что полезные данные вошли в контейнер слишком поздно и не могут быть включены в объект данных. Значение preroll включается в объект заголовка ASF .

Для потоковой передачи без сбоев по сети сжатые потоки в мультимедийном содержимом должны поддерживать постоянную скорость передачи на протяжении всего воспроизведения. Модель контейнеров с утечками ASF гарантирует, что данные мультимедиа передаются по сети с постоянной скоростью. Параметры контейнера с утечкой указываются в объекте Свойства расширенного потока объекта заголовка ASF. В Microsoft Media Foundation они задаются как атрибуты для типа мультимедиа, представляющего поток.

Значения контейнеров с утечкой определяются как в приемнике файлов ASF, так и в базовом объекте мультиплексера ASF, а также в кодировщике Windows Media. Эти значения могут быть одинаковыми или отличаться. Например, рассмотрим сценарий потоковой передачи, который требует, чтобы примеры звука были доставлены позже, чем примеры видео, чтобы можно было передавать файл без задержки. Для этого для негерметичего контейнера аудиопотока в приемнике мультимедиа можно задать значение, превышающее значение, заданное в аудиокодировщике Windows Media.

Чтобы задать значения B/R в кодировщике, приложение должно задать свойства MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX и MFPKEY_BMAX . Сведения о настройке свойств в кодировщике см. в разделе Свойства кодирования.

Используемый контейнер

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

Рассмотрим следующий пример: у вас есть 3-галлонное ведро с отверстием, через которое может протекать 1 галлон в минуту. Вы положили ведро под шпильку и открыть клапан, чтобы выпустить воду со скоростью 1 галлон в минуту. Вода вытекает из ведра так же быстро, как он входит, не оставляя дополнительных в ведро. Затем вы увеличиваете поток от spigot до 2 галлонов в минуту. Каждую минуту, что вода течет с такой скоростью, 2 галлона идти в ведро и 1 галлон вытекает, оставляя 1 галлон в ведро. В конце 3 минут, 6 галлонов воды пошли в ведро, 3 галлона просочились, и ведро заполнено.

На практике теоретическая максимальная скорость передачи данных за интервал, равный окну буфера, никогда не достигается. В предыдущем примере предполагается постоянная скорость передачи данных. Учитывая то же 3-галлонное ведро, вы можете увеличить скорость потока от spigot до 6 галлонов в минуту в течение одной минуты, а затем повернуть шпильку в течение двух минут. Несмотря на то, что общее количество воды, помещенной в ведро, находится в пределах теоретического максимума для буферного окна, концентрация этого количества в одной части окна приводит к переполнению ведра. При 6 галлонах в минуту, 3-галлон ведро переполнено вскоре после 30 секунд пройти. Таким образом, фактический максимальный объем данных, которые могут быть доставлены в буфер в течение любого интервала, равного параметру окна буфера, зависит от размера отдельных выборок и времени их доставки.

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

Рассмотрим следующий пример кодировщика и декодера, соединенных друг с другом по сети. Кодирование видеофайла со скоростью 30 кадров в секунду с скоростью 6000 бит в секунду и буферным окном 3 секунды (общий размер буфера составляет 18 000 бит). Первый пример кодируется как ключевой кадр и занимает 7000 бит. Буфер кодировщика теперь содержит 7000 бит. Следующие 29 кадров — это разностные кадры с общим объемом 3000 бит. Поэтому первая секунда содержимого (30 кадров) поставила бы заполненность буфера в 10 000 бит, если ничего не было утечки. Мы знаем, что скорость потока составляет 6000 бит в секунду, поэтому после первой секунды закодированного содержимого помещается в буфер кодировщика, полнота падает до 4000 бит. В приложении для декодирования этот поток доставляется в буфер декодера со скоростью 6000 бит в секунду. Через одну секунду буфер содержит 6000 бит. Первый образец содержит 7000 бит, поэтому буфер декодера должен быть заполнен больше, прежде чем декодер начнет удалять образцы.

Установка значений "Утечка" для потоков ASF

В сценарии кодирования файлов приложение может задавать значения контейнеров с утечкой при настройке потоков в профиле ASF.

После создания потока и ссылки на интерфейс IMFASFStreamConfig потока можно задать значения с помощью следующих атрибутов:

Сведения о добавлении потоков и получении указателя IMFASFStreamConfig см. в разделе Добавление сведений о потоке в приемник файлов ASF.

Эти значения содержат следующий набор сведений:

  • Средняя скорость передачи данных: получение средней скорости для выходного типа мультимедиа, выбранного во время согласования типов носителей. Используйте атрибут MF_MT_AUDIO_AVG_BYTES_PER_SECOND (для аудиопотоков) или атрибут MF_MT_AVG_BITRATE (для видеопотоков).
  • Окно буфера. Если у вас есть экземпляр кодировщика и согласованы типы выходных носителей, вы можете обновить это значение позже, запросив кодировщик для интерфейса IWMCodecLeakyBucket , а затем вызвав IWMCodecLeakyBucket::GetBufferSizeBits (wmcodecifaces.h, wmcodecdspuuid.lib). В противном случае используйте значение по умолчанию 3000 миллисекундах.
  • Начальный размер буфера: задайте значение 0.

Значения, предоставляемые приложением, зависят от типа кодирования и типа носителя потока. Например, для кодирования с постоянной скоростью требуется предопределенная фиксированная скорость и окно буфера. Приложение может указать эти значения контейнеров с утечкой, задав свойство кодировки MFPKEY_VIDEOWINDOW и атрибут MF_ASFSTREAMCONFIG_LEAKYBUCKET1 в потоке. Указанные значения окна буфера используются, чтобы убедиться, что закодированный файл имеет правильное время отправки, отмеченное в пакетах данных, а значение preroll отображается в объекте заголовка ASF. Достаточно задать MF_ASFSTREAMCONFIG_LEAKYBUCKET1 , так как указанные значения копируются в атрибут MF_ASFSTREAMCONFIG_LEAKYBUCKET2 .

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

Для кодирования VBR приложение может запрашивать значения нетекучих контейнеров, используемые кодировщиком, только после завершения этапа кодирования. Таким образом, при настройке приемника мультимедиа приложение может не задавать атрибуты или свойства, связанные с утечками контейнеров. После кодирования приложение должно запросить у кодировщика свойства MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX и MFPKEY_BMAX и задать их в приемнике мультимедиа, чтобы точные значения отражались в объекте header. Пример кода об обновлении значений для кодирования VBR см. в разделе "Обновление свойств кодирования в приемнике файлов" статьи Учебник. 1-проходное кодирование Windows Media.

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

Значения контейнеров с утечкой в мультиплексоре ASF

В Media Foundation значения контейнеров с утечкой используются мультиплексором ASF для настройки внутренних значений контейнеров утечки, используемых для создания пакетов данных. Полезные данные содержатся в образце мультимедиа, а ряд примеров мультимедиа представляет собой пакет данных ASF. На основе значений контейнеров утечки и времени представления мультиплексор назначает время отправки для каждой выборки мультимедиа, чтобы скорость передачи пакетов по сети была с постоянной скоростью (R).

Приложение не может напрямую задавать значения контейнеров, вызывающих утечку, в мультиплексоре. Значения должны быть указаны в приемнике мультимедиа ASF, который задает соответствующие значения в мультиплексоре. Значения, заданные в MF_ASFSTREAMCONFIG_LEAKYBUCKET1 и MF_ASFSTREAMCONFIG_LEAKYBUCKET2 , используются мультиплексором для проверки того, что выборки, отправленные в приемник мультимедиа ASF, создаются с использованием указанных значений.

Обновление значений контейнеров утечки в приемнике мультимедиа ASF

Приложение может перезаписать значения контейнеров уровня потока (заданные в профиле ASF во время создания потока), задав свойство MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET в хранилище свойств приемника мультимедиа. Чтобы получить ссылку на хранилище свойств, используйте объект ContentInfo, реализованный приемником мультимедиа. Дополнительные сведения см. в разделе Настройка свойств в приемнике файлов.

Примечание Эта операция разрешена только для аудиопотоков.

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

Как и атрибуты конфигурации потока для контейнеров с утечкой, установите среднюю скорость передачи и размер буфера, а также начальную заполненность буфера в массиве DWORD. Дополнительные сведения см. в разделе "Настройка значений утечки контейнеров для потоков ASF" этой статьи.

Поддержка ASF в Media Foundation

Кодеки Windows Media