#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.