Что я пытаюсь сделать?
Напишите простой клиент MPEG-DASH, используя шаблон SegmentTemplate
, чтобы вычислить, какие сегменты готовы для загрузки для живого источника.
Снимок, сделанный с использованием chrome
инструментов отладки в данный момент X
, показывающий запрос mpd
(8af651fd747.....mpd
) и фактические сегменты, извлеченные с уважением для этого запроса.
Учитывая следующее 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&cid=8af651fd7473474f86a05ffb0a1c8972&oid=600e5c27541344a1bf3818617ad712ce&prettydash=1&exp=1556091088&rn=4138683939&tc=1&ct=c&sig=5fb7f0c18f3f1d2ad4fdee53c02c1e1ed904bc5e8474f4ebf886d209ff7f21c9&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&_jt=l&chid=8af651fd7473474f86a05ffb0a1c8972" media="$RepresentationID$$Number%08d$.m4f?pbs=05b6594bcf4b4728ac1094976a80194d&_jt=l&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
Также попытался использовать ffmpeg
'с dashdec.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)