Модель буфера утекающего ведра (Microsoft Media Foundation)
При потоковой передаче мультимедиа через сеть декодатор получает закодированные данные с теоретически постоянной скоростью (скорость передачи). Декодатор использует эти данные для создания декодированных выходных данных. Однако в общем случае декодатор использует данные с переменной частоты, так как затем кодировщик может использовать переменную частоту кодирования.
Модель "подтекающего ведра" — это способ моделирования требований к буферизации для плавного воспроизведения. В этой модели декодатор сохраняет буфер. Закодированные данные идут из сети в буфер и из буфера в декодатор. Если буфер недозаполняется, это означает, что декодатор удаляет данные из буфера быстрее, чем сеть доставляет их. Если буфер переполнен, это означает, что сеть поставляет данные быстрее, чем декодировщик использует его.
В этом разделе описывается модель 'протекающего ведра' для кодирования и декодирования.
- Дырявое ведро
- контейнер, используемый
- задание значений утечки контейнеров для потоков ASF
- значения утечки контейнеров в мультиплексера ASF
- Обновление значений Leaky Bucket в медиаприемнике ASF
- связанные темы
Дырявое ведро
Чтобы понять модель утечки контейнера, рассмотрим контейнер с небольшой отверстием в нижней части. Три параметра определяют контейнер:
- Емкость (B)
- Скорость, с которой вода выходит из ведра (R)
- Начальная полнота контейнера (F)
В этой метафоре контейнер является буфером:
Если вода вливается в контейнер с точной скоростью R, контейнер останется на F, так как входная скорость равна скорости вывода. Если скорость ввода увеличивается, пока R остается постоянной, контейнер накапливает воду. Если скорость ввода превышает R в течение устойчивого периода, в конечном итоге ведро переполнится. Однако скорость ввода может отличаться в зависимости от R без переполнения контейнера, если средняя скорость ввода не превышает емкость контейнера. Чем больше емкость, тем больше скорость ввода может варьироваться в течение заданного периода времени.
В ASF утечка контейнера определяется тремя параметрами:
- Средняя скорость бита в байтах в секунду, соответствующая скорости вывода (R)
- Буферное окно, измеряемое в миллисекундах, соответствующее емкости контейнера (B).
- Начальная полнота буфера, которая обычно имеет значение нулю.
Скорость битов измеряет среднее число битов в секунду в кодированном потоке. Окно буфера измеряет количество миллисекунд данных на этой скорости, которые могут поместиться в буфер. Размер буфера в битах равен R * (B /1000).
Полезные данные ASF могут поступать в емкость с утечкой в нерегулярное время и в нерегулярных объемах, но должны выходить из емкости с постоянным положительным битрейтом. Из-за окна буфера возможна задержка между временем, когда полезные данные входят в ведро, и когда покидают его. Максимальная задержка, которая может произойти, — B/R. Нагрузочные данные, вводимые в контейнер, соответствуют времени презентации и никогда не должны переполнить контейнер. В дополнение ко времени презентации, каждая полезная нагрузка также имеет время отправки — время, когда данные полезной нагрузки покидают контейнер в соответствии с скоростью передачи. Время отправки должно быть раньше времени презентации, чтобы убедиться, что, когда ведро почти полное, каждая полезная нагрузка покидает его до или в момент своего представления. Для этого время презентации перемещается вперед по значению B/R (предварительной), а время отправки начинается с нуля. Время отправки должно быть не позднее времени презентации, так как это означает, что полезные данные вошли в контейнер слишком поздно и не могут быть включены в объект данных. Значение преролла включается в объект заголовка 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 галлон в минуту. Вода вытекает из ведра так же быстро, как она поступает, не оставляя лишнего в ведре. Затем вы увеличиваете поток из крана до 2 галлонов в минуту. Каждую минуту, что вода течет с такой скоростью, 2 галлона идут в ведро и 1 галлон утекает, оставляя 1 галлон в ведре. В конце 3 минут, 6 галлонов воды пошли в ведро, 3 галлона просочились, и ведро заполнено.
На практике теоретически максимальная скорость данных за интервал, равный окну буфера, никогда не достигается. В предыдущем примере предполагается постоянная скорость данных. Учитывая тот же 3-галлонный контейнер, вы можете увеличить скорость потока от крана до 6 галлонов в минуту на одну минуту, а затем перекрыть кран на две минуты. Несмотря на то что общее количество воды, помещенной в контейнер, находится в пределах теоретических максимумов для буферного окна, концентрация этого количества в одной части окна приводит к переполнению контейнера. При скорости 6 галлонов в минуту, 3-галлонное ведро переполняется уже через 30 секунд. Таким образом, фактический максимальный объем данных, которые можно доставлять в буфер в течение любого интервала, равного параметру буферного окна, зависит от размера отдельных выборок и при их доставке.
До сих пор в примерах рассматривается только буфер, используемый декодером, но буфер с утечкой также используется кодировщиком, который создает сжатое содержимое. Кодировщик выполняет все необходимые корректировки для алгоритмов сжатия, чтобы обеспечить скорость сжатия сжатых выборок в пределах границ, описанных в окне скорости и буфера, предполагая, что образцы будут доставлены декодировщику с постоянной скоростью. Контейнер кодировщика можно рассматривать как зеркальное отображение контейнера декодировщика. Резервуар кодировщика заполняется переменной скоростью, определяемой размером отдельных образцов, и стекает с постоянной скоростью, равной средней битовой скорости.
Рассмотрим следующий пример кодировщика и декодировщика, подключенного к сети. Видеофайл закодирован на 30 кадров в секунду с скоростью 6000 бит в секунду и буферным окном в 3 секунды (общий размер буфера 18 000 бит). Первый пример кодируется в виде ключевого кадра и занимает 7000 бит. Буфер кодировщика теперь содержит 7 000 бит. Следующие 29 кадров — это все разностные кадры, которые составляют 3000 битов. Таким образом, первая секунда содержимого (30 кадров) поместит заполненность буфера на 10 000 бит, если ничего не вытекает. Мы знаем, что битрейт потока составляет 6 000 бит в секунду, поэтому после того как первая секунда закодированного содержимого помещена в буфер кодировщика, заполненность снижается до 4 000 бит. В декодировании приложения этот поток передается в буфер декодера с 6000 битами в секунду. После одной секунды буфер содержит 6000 битов. Первый пример содержит 7000 бит, поэтому буфер декодировщика должен быть заполнен больше, прежде чем декодатор начнет удалять образцы.
Установка значений Leaky Bucket для потоков ASF
В сценарии кодирования файлов приложение может задать значения утечки контейнеров при настройке потоков в профиле ASF.
После создания потока и ссылки на интерфейс IMFASFStreamConfig потока можно задать значения с помощью следующих атрибутов:
- MF_ASFSTREAMCONFIG_LEAKYBUCKET1 (средние значения утечки контейнеров)
- MF_ASFSTREAMCONFIG_LEAKYBUCKET2 (максимальные значения утечки контейнеров)
Чтобы получить сведения о добавлении потоков и получении указателя 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 в потоке. Указанные значения окна буфера используются для обеспечения того, чтобы в кодированном файле правильно устанавливалось время отправки, помеченное в пакетах данных, и значение предварительной подготовки присутствовало в объекте заголовка ASF. Достаточно задать MF_ASFSTREAMCONFIG_LEAKYBUCKET1, так как эти указанные значения копируются в атрибут MF_ASFSTREAMCONFIG_LEAKYBUCKET2.
Для двухпроходных режимов кодирования необходимо задать оба этих атрибута, чтобы указать среднее и максимальное значение.
Для кодирования VBR приложение может запрашивать утечки значений контейнеров, используемых кодировщиком только после завершения передачи кодирования. Поэтому при настройке приемника мультимедиа приложение может не задавать атрибуты или свойства, связанные с утечкой контейнеров. После кодирования приложение должно запросить кодировщик для MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAXи MFPKEY_BMAX свойств и задать их в приемнике мультимедиа, чтобы точные значения отображались в объекте заголовка. Для примера кода о том, как обновить значения для кодирования 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