Есть что-нибудь о преддверии встречи на высшем уровне?

внешний интерфейс прямая трансляция

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

  • Низкий порог: каждый может ответить на вопрос
  • Высокий бонус: почти все они больше миллиона, но не исключено, что робот поделится с вами деньгами :)
  • Низкая задержка: вопросы задаются в одно и то же время и отвечают в одно и то же время. Это очень напряжно для отложенных прямых трансляций, и почти задержку нужно контролировать в пределах 2 с. Итак, HLS в основном холодный.
  • У KOL есть ритм, такой как Wang Sicong, бросающий монеты.
  • якорная давка
  • . . .

Мне как фронтенд-разработчику кажется, что мир прямых трансляций слишком далек от нас, есть две большие горы, одна — X5, а другая — Apple. Потому что X5 и Apple вынуждены не предоставлять MSE для front-end использования, что приводит к результату либо прямая трансляция с HLS, либо вы не будете транслировать. Сейчас я работаю в Tencent, и недавно у меня возникли проблемы с X5.Почему они не поддерживают MSE? Ответ они дали:

image.png-47.2kB

Можно сказать, что в следующем году технология MSE должна значительно расширить возможности интерфейса. Однако MSE используется только как технология на стороне воспроизведения, откуда берется поток? Как работала прямая трансляция H5?

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

https://www.villianhr.com/2017/03/31/Полностью продвинутая прямая трансляция H5

На данном этапе наиболее популярными протоколами являются: HLS, RTMP, HTTPFLV. Задержка — лучшее, что есть в HLS.Это проигрыватель потокового вещания собственной разработки Apple, а задержка воспроизведения составляет около 10 с+. И RTMP, и HTTPFLV имеют какое-то отношение к Adobe, что заставляет людей чувствовать себя неотделимыми от Flash.Задержка у обоих на удивление хорошая, всего около 3 с, но поток внутри действительно в формате FLV.

Однако W3C с этим не согласен Я совершенно не хочу больше иметь ничего общего с Flash У меня есть WebM, FMP4, зачем TS подстраиваться под ваш FLV?

Чтобы решить эту проблему с самого начала, MPEG представила стандарт прямого вещания MPEG-DASH, чтобы унифицировать различные неудобные файлы описания потоков. Он в основном основан на файлах mpd для нарезки и загрузки файлов. Давайте сначала посмотрим на простой файл MPEG-DASH:

<?xml version="1.0" encoding="utf-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" profiles="urn:mpeg:dash:profile:isoff-live:2011,http://dashif.org/guidelines/dash-if-simple" maxSegmentDuration="PT2S" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT10S">
   <ProgramInformation>
      <Title>Media Presentation Description from DASHI-IF live simulator</Title>
   </ProgramInformation>
   <BaseURL>http://vm2.dashif.org/dash/vod/testpic_2s/</BaseURL>
   <Period id="precambrian" start="PT0S">
      <AdaptationSet contentType="audio" mimeType="audio/mp4" lang="eng" segmentAlignment="true" startWithSAP="1">
         <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
         <SegmentTemplate startNumber="1" initialization="$RepresentationID$/init.mp4" duration="2" media="$RepresentationID$/$Number$.m4s"/>
         <Representation id="A48" codecs="mp4a.40.2" bandwidth="48000" audioSamplingRate="48000">
            <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
         </Representation>
      </AdaptationSet>
      <AdaptationSet contentType="video" mimeType="video/mp4" segmentAlignment="true" startWithSAP="1" par="16:9" minWidth="640" maxWidth="640" minHeight="360" maxHeight="360" maxFrameRate="60/2">
         <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
         <SegmentTemplate startNumber="1" initialization="$RepresentationID$/init.mp4" duration="2" media="$RepresentationID$/$Number$.m4s"/>
         <Representation id="V300" codecs="avc1.64001e" bandwidth="300000" width="640" height="360" frameRate="60/2" sar="1:1"/>
      </AdaptationSet>
   </Period>
</MPD>

Основной принцип заключается в том, что фон нарезает полный файл потока для создания начального сегмента и медиасегментов, которые являются файлами сегментов потока, такими как.mp4,.tsЖдать. Более подробная информация будет описана ниже.

А как насчет задержки протокола?

В основном это зависит от вашего протокола. Максимальная задержка быстрее, чем у HTTP-FLV, почти

Основное введение в MPD

DASH на самом деле просто набор понятий, первоначальный замыселDynamic Adaptive Streaming over HTTP. Он в основном основан на файлах mpd для нарезки и загрузки файлов. Весь режим чем-то похож на HLS, но его можно применять ко всем видеоформатам, таким как mp4, webm. Он делит весь видеофайл на определенные сегменты HTTPFLV. Однако это лучше, чем HLS, о котором говорилось выше.

Режим воспроизведения MPD на самом деле представляет собой URL-адрес нарезанного воспроизведения, согласованный в соответствии с содержимым XML. Простой файл MPD:

<?xml version="1.0" encoding="utf-8"?>
<MPD availabilityStartTime="1970-01-01T00:00:00Z" id="Config part of url maybe?" maxSegmentDuration="PT2S" minBufferTime="PT2S" minimumUpdatePeriod="P100Y" profiles="urn:mpeg:dash:profile:isoff-live:2011,http://dashif.org/guidelines/dash-if-simple" publishTime="2018-01-06T06:57:00Z" timeShiftBufferDepth="PT5M" type="dynamic" ns1:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" 
      xmlns="urn:mpeg:dash:schema:mpd:2011" 
      xmlns:ns1="http://www.w3.org/2001/XMLSchema-instance">
      <ProgramInformation>
            <Title>Media Presentation Description from DASHI-IF live simulator</Title>
      </ProgramInformation>
      <BaseURL availabilityTimeOffset="10.000000">https://vm2.dashif.org/livesim-dev/ato_10/testpic_2s/</BaseURL>
      <Period id="p0" start="PT0S">
            <AdaptationSet contentType="audio" lang="eng" mimeType="audio/mp4" segmentAlignment="true" startWithSAP="1">
                  <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
                  <SegmentTemplate duration="2" initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/$Number$.m4s" startNumber="0" />
                  <Representation audioSamplingRate="48000" bandwidth="48000" codecs="mp4a.40.2" id="A48">
                        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
                  </Representation>
            </AdaptationSet>
            <AdaptationSet contentType="video" maxFrameRate="60/2" maxHeight="360" maxWidth="640" mimeType="video/mp4" minHeight="360" minWidth="640" par="16:9" segmentAlignment="true" startWithSAP="1">
                  <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
                  <SegmentTemplate duration="2" initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/$Number$.m4s" startNumber="0" />
                  <Representation bandwidth="300000" codecs="avc1.64001e" frameRate="60/2" height="360" id="V300" sar="1:1" width="640" />
            </AdaptationSet>
      </Period>
</MPD>

Содержимое каждого тега в файле XML соответствует стандарту MPEG-DASH LA. Он содержит N + 1 тег периодов внутри. Каждый период содержит связанные медиапотоки, такие как видео: разные кодировки, углы обзора, пропускная способность и т. д., аудио: разные языки, типы, пропускная способность и т. д. Некоторые общие параметры, такие как кодек, частота кадров, аудиоканал, не могут быть изменены в один и тот же Период. Поэтому очень важно предоставить как можно больше подробной информации о периоде. Хотя информацию в разделе «Период» нельзя динамически изменять, пользователи могут вручную выбрать желаемое разрешение, пропускную способность и т. д.

Period может содержать несколько потоков, поэтому он также может предоставлять такие функции, как вставка рекламы или разделение потока просмотра. Это также является первоначальным намерением MPEG-DASH согласовать содержимое нескольких медиапотоков через один файл. Его инфраструктурное содержание:

此处输入图片的描述

Здесь давайте кратко представим конкретное содержание нескольких ключевых TAG.

MPD

Это самый внешний тег файла в MPD, и для его описания существуют соответствующие атрибуты. Атрибуты в этом теге чрезвычайно важны, он определяет атрибуты файла, описываемые MPD, а также порядок воспроизведения и содержимое медиапотока.

Повторите еще раз: файлы MPD очень важны!Файлы MPD очень важны!Файлы MPD очень важны!

Его основные свойства:

image.png-127.6kB

Далее мы кратко представляем один за другим:

  • id: Установить идентификатор MPD, обычно не требуется.
  • профили: установка базового стандарта MPD Подробности см. в следующих профилях.

此处输入图片的描述

  • тип: используется для установки основных свойств файлов MPD. Есть два значения

    • static: продолжительность сегмента должна быть между @availabilityStartTime и @availabilityEndTime.
    • динамический: в основном на основе времени доступностиStartTime.
  • AvailabilityStartTime: задайте базовое время всех сегментов. Если тип динамический, это свойство является обязательным.

  • AvailabilityEndTime: диапазон статических файлов для статических файлов.

  • pulishTime: установить абсолютное время генерации файла MPD (настенные часы).

  • mediaPresentationDuration: устанавливает общую продолжительность текущих медиасегментов. НапримерPT20M, что означает продолжительность 20 минут. Это свойство можно использовать в качестве альтернативы, если MPD.minimumUpdatePeriod и Period.duration не установлены.

  • MinimumUpdatePeriod: устанавливает время обновления текущего файла MPD. Это свойство не должно присутствовать, если type = static.

  • minBufferTime: используется для установки минимальной продолжительности сегмента, например:PT2S. обычный иRepresentation.bandwidth(bps)Используются вместе для расчета значения минимального размера сегмента.

  • timeShiftBufferDepth: используется для установки допустимого диапазона сегмента в MPD. Или это можно понимать как время истечения срока действия. Здесь мы подробно опишем позже.

  • maxSegmentDuration: установите максимальную продолжительность сегмента.

Мы уже поняли основные атрибуты в теге MPD выше.Эти атрибуты очень важны во всем MPEG-DASH.Позже мы кратко объясним моменты, касающиеся обновления MPD и истечения срока действия файла.

Механизм обновления файла MPD

Обновления файлов MPD в первую очередь определяются настройкой свойства @minimumUpdatePeriod, например:minimumUpdatePeriod="PT10S". Используемые для идентификации, файлы MPD начинаются с момента последнего сбора MPD и проверяют наличие обновлений через 10 с. Если этот атрибут отсутствует или равен 0, это означает, что срок действия файла MPD не истечет. Вся логика обновления такова:

image.png-97.2kB

При обновлении файла MPD следует обратить внимание на некоторые вещи:

  • Значение атрибута MPD.id должно совпадать со значением предыдущего MPD.
  • Свойство Period.id должно быть таким же, как и у предыдущего Period.
  • MPD.publishTime должен совпадать со временем обновления.

Дополнительные сведения см. в официальных стандартах ISO/ITU.5.4 Media Presentation Description updates.

Срок действия файла сегмента истек

Особенно для файлов живых фрагментов из-за ограниченной емкости сервера они не всегда будут храниться на сервере. Лучше всего согласовать время истечения соответствующего Сегмента. Как определяется это время истечения?

В основном по следующей формуле:

[max(AST, now-timeShiftBufferDepth), now]
  • AST: свойство MPD.availabilityStartTime.
  • timeShiftBufferDepth: это свойство MPD.timeShiftBufferDepth, которое используется для согласования времени истечения срока действия.

Потому что обычно,max(AST, now-timeShiftBufferDepth) = now-timeShiftBufferDepth. Таким образом, указанный диапазон можно сократить до:

now-timeShiftBufferDepth <= time <= now

Весь интервал времениMPD.timeShiftBufferDepthзначение свойства для управления. Например, значение параметра для тега MPD:

timeShiftBufferDepth="PT5M"

Затем диапазон допустимости файла состоит в том, что ссылка в течение 5 минут до момента публикации последнего файла MPD является действительной.

Period

Период в основном используется для хранения определенных данных потокового мультимедиа, которые сами по себе используются только для установкиstartTimeи различать несколькоPeriod@idэффект. Он имеет несколько основных свойств:

image.png-43.6kB

Здесь я выражаю это непосредственно в текстовой форме:

 
<xs:sequence>
	<xs:element name="BaseURL" type="BaseURLType" minOccurs="0" maxOccurs="unbounded"/> 
	<xs:element name="SegmentBase" type="SegmentBaseType" minOccurs="0"/>

	<xs:element name="SegmentList" type="SegmentListType" minOccurs="0"/> 
	<xs:element name="SegmentTemplate" type="SegmentTemplateType" minOccurs="0"/> 
	<xs:element name="AssetIdentifier" type="DescriptorType" minOccurs="0"/>

	<xs:element name="EventStream" type="EventStreamType" minOccurs="0" maxOccurs="unbounded"/> 
	<xs:element name="AdaptationSet" type="AdaptationSetType" minOccurs="0" maxOccurs="unbounded"/>
	<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute ref="xlink:href"/>
<xs:attribute ref="xlink:actuate" default="onRequest"/>
<xs:attribute name="id" type="xs:string" />
<xs:attribute name="start" type="xs:duration"/>
<xs:attribute name="duration" type="xs:duration"/>
<xs:attribute name="bitstreamSwitching" type="xs:boolean" default="false"/> 
<xs:anyAttribute namespace="##other" processContents="lax"/>

Для периода мы в основном фокусируемся на содержимом атрибута атрибута.

  • id: используется для идентификации уникальности периода. если MPD.type=dynamic, идентификатор не изменится при обновлении MPD.

  • start: используется для установки времени начала ссылки на сегмент в разделе Period. Однако начало не определяется по собственному Периоду, а также должно определяться по предыдущему Периоду:

    • Если у текущего Периода нет атрибута начала, а предыдущий Период обычный, с атрибутами начала и продолжительности. тогда текущийPeriod.start = prevPeriod.start + prevPeriod.duration
    • Если текущий период не имеет начального атрибута,MPD.type = static, период является первой меткой периода MPD, тогда начальное значение будет установлено на 0 по умолчанию.
  • продолжительность: используется для определения продолжительности текущего периода

  • bitstreamSwitching: разрешить ли изменение потока переключения, по умолчанию — false.

Например:

  <Period id="p0" start="PT0S">
    // ...
  </Period>

AdapationSet

AdaptionSet в основном используется для выражения основной информации о содержащемся в данный момент потоке, что эквивалентно информации блока ftype+moof в MP4.

Основные свойства следующие,

<xs:sequence>

	<xs:element name="Accessibility" type="DescriptorType" minOccurs="0" maxOccurs="unbounded"/>

	<xs:element name="Role" type="DescriptorType" minOccurs="0" maxOccurs="unbounded"/> 
	<xs:element name="Rating" type="DescriptorType" minOccurs="0" maxOccurs="unbounded"/> 
	<xs:element name="Viewpoint" type="DescriptorType" minOccurs="0" maxOccurs="unbounded"/> 
	<xs:element name="ContentComponent" type="ContentComponentType" minOccurs="0" maxOccurs="unbounded"/>

	<xs:element name="BaseURL" type="BaseURLType" minOccurs="0" maxOccurs="unbounded"/> 
	<xs:element name="SegmentBase" type="SegmentBaseType" minOccurs="0"/>

	<xs:element name="SegmentList" type="SegmentListType" minOccurs="0"/>

	<xs:element name="SegmentTemplate" type="SegmentTemplateType" minOccurs="0"/> 
	<xs:element name="Representation" type="RepresentationType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
	<xs:attribute ref="xlink:href"/>
	<xs:attribute ref="xlink:actuate" default="onRequest"/> <xs:attribute name="id" type="xs:unsignedInt"/> 
	<xs:attribute name="group" type="xs:unsignedInt"/> <xs:attribute name="lang" type="xs:language"/> 
	<xs:attribute name="contentType" type="xs:string"/> <xs:attribute name="par" type="RatioType"/>
	<xs:attribute name="minBandwidth" type="xs:unsignedInt"/> <xs:attribute name="maxBandwidth" type="xs:unsignedInt"/> 
	<xs:attribute name="minWidth" type="xs:unsignedInt"/> <xs:attribute name="maxWidth" type="xs:unsignedInt"/> 
	<xs:attribute name="minHeight" type="xs:unsignedInt"/> <xs:attribute name="maxHeight" type="xs:unsignedInt"/> 
	<xs:attribute name="minFrameRate" type="FrameRateType"/> <xs:attribute name="maxFrameRate" type="FrameRateType"/>
	<xs:attribute name="segmentAlignment" type="ConditionalUintType" default="false"/> 
	<xs:attribute name="subsegmentAlignment" type="ConditionalUintType" default="false"/> 
	<xs:attribute name="subsegmentStartsWithSAP" type="SAPType" default="0"/> 
	<xs:attribute name="bitstreamSwitching" type="xs:boolean"/>

Будет ли понятнее увидеть картинку:

image.png-295.5kB

Я не буду вдаваться в подробности об этих свойствах, давайте посмотрим на демо, чтобы понять:

<AdaptationSet contentType="video" maxFrameRate="60/2" maxHeight="360" maxWidth="640" mimeType="video/mp4" minHeight="360" minWidth="640" par="16:9" segmentAlignment="true" startWithSAP="1">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
    <SegmentTemplate initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/t$Time$.m4s" timescale="90000">
        <SegmentTimeline>
            <S d="180000" r="150" t="136377021600000" />
        </SegmentTimeline>
    </SegmentTemplate>
    <Representation bandwidth="300000" codecs="avc1.64001e" frameRate="60/2" height="360" id="V300" sar="1:1" width="640" />
</AdaptationSet>

Информация описания здесь не ограничивается атрибутом AS(AdaptionSet), но также может использоваться в представлении.

Representation

Представление вложено в AS, который также является информацией описания потока, что фактически эквивалентно IS (начальный сегмент).

Основная информация:

image.png-273.2kB

Основное использование этого заключается в предоставлении базовой информации для описания текущего потока:

<Representation bandwidth="300000" codecs="avc1.64001e" frameRate="60/2" height="360" id="V300" sar="1:1" width="640" />

Эффективный диапазон указанного Rep (Представительства) находится в рамках текущего Периода, то есть из:Period.start - Period.endTime. Чтобы максимизировать коэффициент использования информации описания Rep, все потоки, содержащиеся в Rep, могут использовать это содержимое в качестве информации описания.

Кроме того, мы также можем комбинироватьdependencyIdа такжеidдля повторного использования содержимого Rep. пройти черезdependencyIdУкажите шаблон Rep@id для прямого повторного использования информации.

<Representation bandwidth="300000" codecs="avc1.64001e" frameRate="60/2" height="360" id="1" sar="1:1" width="640" />

<Representation dependencyId="1" id="2" mimeType="video/mp4" />

Как MPD выражает сегменты

В MPD сегменты описываются в основномSegmentBase, SegmentTemplate and SegmentList. Полная репутация требует:

  • Теги N+1 SegmentList
  • 1 SegmentTemplate
  • N+1 тегов BaseURL, [0,1] SegmentBase, без тегов SegmentTemplate и SegmentList.

Здесь мы кратко опишем содержимое соответствующего тега Segment.

SegmentBase

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

<xs:sequence>
<xs:element name="Initialization" type="URLType" minOccurs="0"/>
<xs:element name="RepresentationIndex" type="URLType" minOccurs="0"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="timescale" type="xs:unsignedInt"/>
<xs:attribute name="presentationTimeOffset" type="xs:unsignedLong"/>
 <xs:attribute name="timeShiftBufferDepth" type="xs:duration"/>
 <xs:attribute name="indexRange" type="xs:string"/>
<xs:attribute name="indexRangeExact" type="xs:boolean" default="false"/>
 <xs:attribute name="availabilityTimeOffset" type="xs:double"/>
 <xs:attribute name="availabilityTimeComplete" type="xs:boolean"/>
 
 
 // extension prop
 <xs:extension base="SegmentBaseType">
   <xs:sequence>
	<xs:element name="SegmentTimeline" type="SegmentTimelineType" minOccurs="0"/>
	<xs:element name="BitstreamSwitching" type="URLType" minOccurs="0"/> 
   </xs:sequence>
	<xs:attribute name="duration" type="xs:unsignedInt"/>
	<xs:attribute name="startNumber" type="xs:unsignedInt"/>
</xs:extension>

Если вы чувствуете неясную, вы можете увидеть эту картинку:

![image.png-194.7kB][108]

InitializationТег может быть использован в качестве элемента или непосредственно в качестве свойства метка сегментов для установки ссылки URL начального сегмента. Основные настройки:

 <BaseURL>v-0144p-0100k-libx264.mp4</BaseURL>
 <SegmentBase indexRange="678-1597" timescale="12288">
    <Initialization range="0-677"/>
</SegmentBase>

indexRange устанавливает диапазон байтов сегмента мультимедиа, а диапазон устанавливает диапазон байтов начального сегмента.

Кроме того, есть несколько более важных свойств:

  • PresentationTimeOffset: установите время смещения текущего сегмента относительно начала периода.
  • timeShiftBufferDepth: переопределяет свойства MPD по умолчанию, и значение не может быть меньше, чем у MPD.
  • AvailabilityTimeOffset: установите доступное смещение времени для текущего сегмента.

Однако в реальной эксплуатации случаев использования SegmentBase очень мало, и впечатление о ней может составить каждый.

SegmentList

Этот тег используется для идентификации содержимого списка URL полного набора сегментов. Для получения конкретной информации о содержании см.:

<xs:element name="SegmentURL" type="SegmentURLType" minOccurs="0" maxOccurs="unbounded"/>

<xs:attribute name="media" type="xs:anyURI"/>
<xs:attribute name="mediaRange" type="xs:string"/>
<xs:attribute name="index" type="xs:anyURI"/>
<xs:attribute name="indexRange" type="xs:string"/>

Основное содержание:

image.png-125.4kB

Этот тег часто используется для хранения полного списка видео.

 <SegmentList timescale="90000" duration="5400000">
       <RepresentationIndex sourceURL="representation-index.sidx"/>
       <SegmentURL media="segment-1.ts"/>
       <SegmentURL media="segment-2.ts"/>
       <SegmentURL media="segment-3.ts"/>
       <SegmentURL media="segment-4.ts"/>
       <SegmentURL media="segment-5.ts"/>
       <SegmentURL media="segment-6.ts"/>
       <SegmentURL media="segment-7.ts"/>
       <SegmentURL media="segment-8.ts"/>
       <SegmentURL media="segment-9.ts"/>
       <SegmentURL media="segment-10.ts"/>
</SegmentList>

SegmentTemplate

SegmentTemplate в основном используется, когда количество фрагментов файла слишком велико.SegmentListЭтикетки - это небольшая потеря. Для некоторых живых сценариев, таких как прямая трансляция, Lianmai и т. д. использоватьSegmentTemplateДолжно быть очень полезно. Его можно предоставить клиенту для анализа связанных ссылок через startNumber и соответствующий URL-адрес шаблона. Например:

<Representation mimeType="video/mp4"
                   frameRate="24"
                   bandwidth="1558322"
                   codecs="avc1.4d401f" width="1277" height="544">
  <SegmentTemplate media="http://cdn.bitmovin.net/bbb/video-1500/segment-$Number$.m4s" 
  initialization="http://cdn.bitmovin.net/bbb/video-1500/init.mp4" 
  startNumber="0" 
  timescale="24" 
  duration="48"/>
</Representation>

Конкретные свойства:

image.png-35.5kB

  • index: для полей шаблона замените идентификаторы $Number$ и $Time$.
  • инициализация: используется для идентификации конкретного адреса сегмента инициализации.В этом свойстве можно использовать только идентификатор $RepresentationID$.

Использование метода шаблона может значительно уменьшить размер файла MPD, но дополнительно увеличит время анализа MPD следующими клиентами. Помимо использования вышеперечисленного$Number$Помимо расшифровки формы, вы также можете использовать$RepresentationID$идентификатор для выполнения замены символов:

<SegmentTemplate
    duration="2"     
    initialization="$RepresentationID$/init.mp4"
    media="$RepresentationID$/$Number$.m4s" 
    startNumber="0" />
<Representation 
    bandwidth="300000" 
    codecs="avc1.64001e" 
    frameRate="60/2" 
    height="360" 
    id="V300" 
    sar="1:1" 
    width="640" />

Какое общее количество идентификаторов можно использовать? В каких тегах можно использовать эти идентификаторы? Кратко опишем:

Идентификатор Назначение

Идентификатор часто используется в тегах SegmentTemplate, только следующие атрибуты могут использовать идентификаторы:media, index, initializationа такжеbitstreamSwitchingАтрибуты.

  • $RepresentationID$: соответствуетRepresentationАтрибут id в теге, например, вышеV300. . .

Чтобы получить полное объяснение идентификатора, вы можете подписаться на общедоступную учетную запись WeChat: Front-end Little Jimmy и ввести: MPD.identifier, чтобы получить его.

SegmentTimeline

SegmentTimeline пройдет несколькоSэтикетка, чтобы идентифицировать то же самоеMPD durationСодержимое сегмента внутри. То есть SegmentTimeline предоставляет только контейнер шаблонов, а идентификатор конкретного потока по-прежнему определяетсяSсодержимое ярлыка. Посмотрите прямо на простейший ST (SegmentTimeline):

<SegmentTimeline timescale="1000">
    <S t="0" r="10" d="24000"/>
</SegmentTimeline>

Вот, давайте посмотримSОсновные значения свойств под этикеткой:

  • t: определяет время начала текущего сегмента в потоке периода. В общем, никаких настроек не требуется. Если установлено, его значение равноprevious S@t + @d * (@r + 1). предыдущийSОтметка времени окончания тега.
  • d: определяет продолжительность текущего сегмента
  • r: Установите количество вхождений текущего сегмента.

Давайте посмотрим на ДЕМО:

Для получения подробных объяснений и описаний DEMO вы можете подписаться на общедоступную учетную запись WeChat: Front-end Little Jimmy и ввести: MPD.timeline, чтобы получить ее.

В продолжении будет еще одна статья, которая даст более глубокое понимание прямых трансляций DASH.