Как правильно рассчитать, какие сегменты готовы к загрузке, используя MPEG-DASH - PullRequest
0 голосов
/ 24 апреля 2019

Что я пытаюсь сделать?

Напишите простой клиент MPEG-DASH, используя шаблон SegmentTemplate, чтобы вычислить, какие сегменты готовы для загрузки для живого источника.

Снимок, сделанный с использованием chrome инструментов отладки в данный момент X, показывающий запрос mpd (8af651fd747.....mpd) и фактические сегменты, извлеченные с уважением для этого запроса.

enter image description here

Учитывая следующее MPD

<MPD availabilityStartTime="2019-04-24T06:43:32Z" maxSegmentDuration="PT4.096S" minBufferTime="PT4.096S" minimumUpdatePeriod="PT15.835S" profiles="urn:mpeg:dash:profile:isoff-live:2011" publishTime="2019-04-24T11:14:01Z" suggestedPresentationDelay="PT11.878S" timeShiftBufferDepth="PT65.536S" type="dynamic" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:cenc="urn:mpeg:cenc:2013" xmlns:ms="urn:microsoft" xmlns:mspr="urn:microsoft:playready">
  <Location>https://content-aaps1.uplynk.com/channel/8af651fd7473474f86a05ffb0a1c8972.mpd?rmt=wv&amp;cid=8af651fd7473474f86a05ffb0a1c8972&amp;oid=600e5c27541344a1bf3818617ad712ce&amp;prettydash=1&amp;exp=1556091088&amp;rn=4138683939&amp;tc=1&amp;ct=c&amp;sig=5fb7f0c18f3f1d2ad4fdee53c02c1e1ed904bc5e8474f4ebf886d209ff7f21c9&amp;pbs=05b6594bcf4b4728ac1094976a80194d</Location>
  <Period id="2826.240" start="PT2826.240S">
    <AdaptationSet id="2" maxFrameRate="30" maxHeight="720" maxWidth="1280" mimeType="video/mp4" segmentAlignment="true" startWithSAP="1">
      <Representation bandwidth="2604473" codecs="avc1.64001e" frameRate="30" height="360" id="E" scanType="progressive" width="640">
        <BaseURL>https://x-default-stgec.uplynk.com/aapm/slices/8c1/600e5c27541344a1bf3818617ad712ce/8c1027496a964b049f1bd5895f8f0412/</BaseURL>
        <SegmentTemplate duration="368640" initialization="https://x-default-stgec.uplynk.com/aapm/slices/8c1/600e5c27541344a1bf3818617ad712ce/8c1027496a964b049f1bd5895f8f0412/$RepresentationID$_init.mp4?pbs=05b6594bcf4b4728ac1094976a80194d&amp;_jt=l&amp;chid=8af651fd7473474f86a05ffb0a1c8972" media="$RepresentationID$$Number%08d$.m4f?pbs=05b6594bcf4b4728ac1094976a80194d&amp;_jt=l&amp;chid=8af651fd7473474f86a05ffb0a1c8972" presentationTimeOffset="254361599" startNumber="690" timescale="90000"/>
      </Representation>
    </AdaptationSet>
  </Period>
  <UTCTiming schemeIdUri="urn:mpeg:dash:utc:http-iso:2014" value="https://content-aaps1.uplynk.com/misc/utcservertime"/>
</MPD>

Я вижу, что следующий запрос сегмента должен быть # 3955

Что я пробовал до сих пор

    period.end = 1556104456;
    period.start = 2826;
    availability_start_time = 1556088212;
    max_segment_duration = 4;
    time_shift_buffer_depth = 65

Итак, прежде всего, я прочитал DASH-IF-IOP 4.3 section 4.3.4.2 page #82 и реализовал следующий код:

   int k1 = 1;
int period_duration = period.end - (period.start + data_.availability_start_time);
int k2 = ceil((float)period_duration / (float)data_.max_segment_duration);
double duration = ((float)representation.duration / (float)representation.timeScale);
size_t live_edge = std::min(
    (int)floor((float)((data_.publish_time - data_.availability_start_time - period.start) / duration)), k2);

size_t oldest = std::max(k1, (int)floor((float)((data_.publish_time - data_.availability_start_time - period.start -
                                                    data_.time_shift_buffer_depth) /
                                                duration)));

после вычисления всего: k1=1, k2 = 3355, live_edge=3272 и oldest=3256

Также попытался использовать ffmpegdashdec.c

для min_segment:

if (c->is_live && pls->fragment_duration)
    {
        num = pls->first_seq_no + (((get_current_time_in_sec() - c->availability_start_time) - c->time_shift_buffer_depth) * pls->fragment_timescale) / pls->fragment_duration;
    }

для max_segment:

num = pls->first_seq_no + (((get_current_time_in_sec() - c->availability_start_time)) * pls->fragment_timescale) / pls->fragment_duration;

после небольшой модификации:

size_t pmax = (((data_.publish_time - data_.availability_start_time))) / duration;
size_t pmin = ((data_.publish_time - data_.availability_start_time) - data_.time_shift_buffer_depth) / duration;

pmin=3946 pmax=3961

в экзамене ffmpegПоэтому мне пришлось вручную удалить переменную first_seq_no, потому что, похоже, я удвоил добавление SegmentTemplate@StartNumber.

даже после успеха в этой задаче, как мне точно составить список запросов Segment(NOW) ----> Segment(LIVE_EDGE)

...