0
votes

I am trying to re-use a set of MPEG-DASH videos that were originally generated using a live profile but now need replaying.

After a bit of playing around it seems more complicated than I had originally anticipated simply changing the type from dynamic to static didn't work presumably because we are also missing details like the end of the video which obviously wouldn't be present in a live scenario but are with on-demand. I know that I could re-build the full .mp4 of the stream and then re-chunk as on-demand but that seems the wrong way to do it. Also Mozilla state here:

You can use the same media files for both live transmission and VOD at a later stage

So there must be some way to do it...

Here is the manifest file from the original broadcast 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>

If I play this back as is it tries to retrieve live files (which obviously don't exist) from now.

Any help would be greatly appreciated!

1

1 Answers

0
votes

Ok so its actually a lot simpler than I expected!

You first need to change type="dynamic" to static. That should allow the file to be played as if it was a live broadcast again, no scrub bar...

To get the scrub bar back we need to set the mediaPresentationDuration. To set this we need to count the number of segments then multiply that by the segment duration in my case 4000 milliseconds. Then put this is the format PT1H22M12.000S.

So in this manifest we can playback the files with the following adjusted manifest (Note my BaseURL was also wrong...):

<?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>

I created a little script to do all this its on GitHub.