Определите число сегментов носителя DASH из файла MPD.

Как определить $ Количество сегментов носителя DASH, если в файле MPD нет списков URL-адресов сегментов?
Он имеет только тег шаблона сегмента, поэтому я не знаю, сколько сегментов имеет носитель, связанный с этим MPD.
Далее файл MPD:

<?xml version="1.0" encoding="UTF-8" ?>
<MPD profiles="urn:mpeg:dash:profile:isoff-live:2011" type="dynamic" availabilityStartTime="2017-09-24T02:32:58Z" minimumUpdatePeriod="PT2.0S" minBufferTime="PT1S" timeShiftBufferDepth="PT2M" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd">
<Period start="PT0S">

<AdaptationSet mimeType="video/mp4" startWithSAP="1" segmentAlignment="true">

<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" />
<ContentProtection schemeIdUri="urn:uuid:5E629AF5-38DA-4063-8977-97FFBD9902D4">
<mas:MarlinContentIds xmlns:mas="marlin:mas:1-0:services:schemas:mpd" >
<mas:MarlinContentId>urn:marlin:kid:48e495a75aefaa2f22a8c15f8c564afa</mas:MarlinContentId>
</mas:MarlinContentIds>
</ContentProtection>

<SegmentTemplate timescale="10000000" presentationTimeOffset="311133404" duration="20000000" startNumber="1" media="$RepresentationID$_Segment-$Number$.m4v" initialization="$RepresentationID$_init.m4i" />
<Representation width="1920" height="1080" frameRate="25" codecs="avc1.640029" scanType="progressive" id="Stream_0_1600000" bandwidth="1600000" />
<Representation width="1920" height="1080" frameRate="25" codecs="avc1.640029" scanType="progressive" id="Stream_1_2600000" bandwidth="2600000" />
<Representation width="1920" height="1080" frameRate="25" codecs="avc1.640029" scanType="progressive" id="Stream_2_3900000" bandwidth="3900000" />
<Representation width="1920" height="1080" frameRate="25" codecs="avc1.640029" scanType="progressive" id="Stream_3_4800000" bandwidth="4800000" />

</AdaptationSet>

<AdaptationSet mimeType="audio/mp4" startWithSAP="1" lang="ita" segmentAlignment="true">
<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" />
<ContentProtection schemeIdUri="urn:uuid:5E629AF5-38DA-4063-8977-97FFBD9902D4">
<mas:MarlinContentIds xmlns:mas="marlin:mas:1-0:services:schemas:mpd" >
<mas:MarlinContentId>urn:marlin:kid:48e495a75aefaa2f22a8c15f8c564afa
</mas:MarlinContentId>
</mas:MarlinContentIds>
</ContentProtection>
<SegmentTemplate timescale="10000000" presentationTimeOffset="311133404" duration="20000000" startNumber="1" media="$RepresentationID$_Segment-$Number$.m4a" initialization="$RepresentationID$_init.m4i" />
<Representation audioSamplingRate="48000" codecs="mp4a.40.5" id="Stream_4_96000" bandwidth="96000" />
</AdaptationSet>
</Period>
</MPD>

Мне сложно понять, как следующий сегмент $Number рассчитывается.

                                      Thanks, Giovanni

0

Решение

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

Поскольку startNumber = 1, мы можем получить самый последний номер сегмента, рассчитав startNumber + (elapsedDur / сегментDur).

ИМХО, это хороший способ сохранить небольшой размер манифеста. Но это ожидает, что клиент DASH синхронизирует свои часы. В противном случае вы в конечном итоге запросите несуществующие номера сегментов (слишком рано или поздно). Вы также столкнетесь с большим количеством 404, если сегменты еще не рекламируются.

0

Другие решения

Других решений пока нет …