GPAC MPEG-DASH повторное использование фрагментированного видео с живым профилем для воспроизведения по требованию

#video #live-streaming #mpeg #mpeg-dash

#Видео #прямая трансляция #mpeg #mpeg-dash

Вопрос:

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

После небольшой игры это кажется более сложным, чем я первоначально предполагал, простое изменение типа с dynamic на static не сработало, по-видимому, потому, что нам также не хватает деталей, таких как конец видео, которые, очевидно, не будут присутствовать в реальном сценарии, но по требованию. Я знаю, что я мог бы воссоздать полный файл .mp4 потока, а затем повторно создать фрагмент по требованию, но это кажется неправильным способом сделать это. Также Mozilla заявляет здесь:

Вы можете использовать одни и те же медиафайлы как для прямой трансляции, так и для VOD на более позднем этапе

Поэтому должен быть какой-то способ сделать это…

Вот файл манифеста из исходной трансляции live.mpd :

 <?xml version="1.0"?>
<!-- MPD file Generated with GPAC version 0.6.2-DEV-rev135-g2dd7b95-master  at 2016-04-07T11:49:25.297Z-->
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT4.000S" type="dynamic" publishTime="2016-04-07T11:49:25Z" availabilityStartTime="2016-04-07T11:49:05.259Z" minimumUpdatePeriod="PT0H0M2.000S" maxSegmentDuration="PT0H0M4.011S" profiles="urn:mpeg:dash:profile:isoff-live:2011">
    <ProgramInformation moreInformationURL="http://192.168.1.103:8080/recording_29/">
        <Title>1</Title>
    </ProgramInformation
    <BaseURL>http://192.168.1.103:3000/bbc_apr16/uhd0/recording_29/</BaseURL>

    <Period id="GENID_DEF" start="PT0H0M0.000S">
        <AdaptationSet segmentAlignment="true" lang="und">
            <SegmentTemplate timescale="90000" media="live_$RepresentationID$_$Number$.m4s" startNumber="1" duration="360000" initialization="live_$RepresentationID$_.mp4"/>
            <Representation id="audio" mimeType="audio/mp4" codecs="mp4a.40.2" audioSamplingRate="48000" startWithSAP="1" bandwidth="6868">
                <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
            </Representation>
        </AdaptationSet>
        <AdaptationSet segmentAlignment="true" maxWidth="3840" maxHeight="2160" maxFrameRate="25" par="16:9" lang="und">
            <SegmentTemplate timescale="90000" media="live_$RepresentationID$_$Number$.m4s" startNumber="1" duration="360000" initialization="live_$RepresentationID$_.mp4"/>
            <Representation id="video_2160p" mimeType="video/mp4" codecs="avc1.42c01f" width="3840" height="2160" frameRate="25" sar="1:1" startWithSAP="1" bandwidth="31726550">
            </Representation>
            <Representation id="video_720p" mimeType="video/mp4" codecs="avc1.42c01f" width="1280" height="720" frameRate="25" sar="1:1" startWithSAP="1" bandwidth="3175420">
            </Representation>
        </AdaptationSet>
    </Period>
</MPD>
  

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

Любая помощь будет высоко оценена!

Ответ №1:

Хорошо, на самом деле это намного проще, чем я ожидал!

Сначала вам нужно перейти type="dynamic" на static . Это должно позволить воспроизводить файл так, как если бы он снова транслировался в прямом эфире, без панели очистки…

Чтобы вернуть панель очистки, нам нужно установить mediaPresentationDuration . Чтобы установить это, нам нужно посчитать количество сегментов, а затем умножить его на длительность сегмента в моем случае 4000 миллисекунд. Затем укажите этот формат PT1H22M12.000S .

Итак, в этом манифесте мы можем воспроизводить файлы со следующим скорректированным манифестом (обратите внимание, что мой baseUrl также был неправильным …):

 <?xml version="1.0"?>
<!-- MPD file Generated with GPAC version 0.6.2-DEV-rev135-g2dd7b95-master  at 2016-04-07T11:49:25.297Z-->
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT4.000S" type="static" publishTime="2016-04-07T11:49:25Z" availabilityStartTime="2016-04-07T11:49:05.259Z" minimumUpdatePeriod="PT0H0M2.000S" maxSegmentDuration="PT0H0M4.011S" profiles="urn:mpeg:dash:profile:isoff-live:2011" mediaPresentationDuration="PT1H22M12.000S">
    <ProgramInformation moreInformationURL="http://192.168.1.103:8080/recording_29/">
        <Title>1</Title>
    </ProgramInformation>

    <Period id="GENID_DEF" start="PT0H0M0.000S">
        <AdaptationSet segmentAlignment="true" lang="und">
            <SegmentTemplate timescale="90000" media="live_$RepresentationID$_$Number$.m4s" startNumber="1" duration="360000" initialization="live_$RepresentationID$_.mp4"/>
            <Representation id="audio" mimeType="audio/mp4" codecs="mp4a.40.2" audioSamplingRate="48000" startWithSAP="1" bandwidth="6868">
                <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
            </Representation>
        </AdaptationSet>
        <AdaptationSet segmentAlignment="true" maxWidth="3840" maxHeight="2160" maxFrameRate="25" par="16:9" lang="und">
            <SegmentTemplate timescale="90000" media="live_$RepresentationID$_$Number$.m4s" startNumber="1" duration="360000" initialization="live_$RepresentationID$_.mp4"/>
            <Representation id="video_2160p" mimeType="video/mp4" codecs="avc1.42c01f" width="3840" height="2160" frameRate="25" sar="1:1" startWithSAP="1" bandwidth="31726550">
            </Representation>
            <Representation id="video_720p" mimeType="video/mp4" codecs="avc1.42c01f" width="1280" height="720" frameRate="25" sar="1:1" startWithSAP="1" bandwidth="3175420">
            </Representation>
        </AdaptationSet>
    </Period>
</MPD>
  

Я создал небольшой скрипт, чтобы сделать все это на GitHub.