Reordering segments in dash segment list

孤人 提交于 2020-02-25 05:01:25

问题


I have a live dash manifest that looks like this.

<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="" maxSegmentDuration="PT4S" minimumUpdatePeriod="PT595H" minBufferTime="PT2S" type="dynamic" availabilityStartTime="2016-11-20T17:00:54Z" publishTime="2016-11-20T17:00:54Z" profiles="urn:hbbtv:dash:profile:isoff-live:2012,urn:mpeg:dash:profile:isoff-live:2011" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" timeShiftBufferDepth="PT120S">
<ProgramInformation>
    <Title>Title</Title>
</ProgramInformation>
<Period start="PT0S" id="p1">
    <AdaptationSet mimeType="audio/mp4" lang="en" startWithSAP="1" contentType="audio" segmentAlignment="true">
        <Representation audioSamplingRate="48000" bandwidth="128000" id="128kb" codecs="mp4a.40.2">
            <AudioChannelConfiguration value="2" schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011"/>
            <SegmentTemplate duration="4" media="audio/128kbps/segment_$Number$.m4s" initialization="audio/128kbps/init.mp4" startNumber="0"/>
        </Representation>
    </AdaptationSet>
    <AdaptationSet mimeType="video/mp4" minWidth="426" contentType="video" maxWidth="1920" minHeight="240" segmentAlignment="true" startWithSAP="1" maxHeight="1080">
        <Representation frameRate="60000/1000" height="480" width="858" bandwidth="1200000" codecs="avc1.42c00d" id="1200kb">
            <SegmentTemplate duration="4" media="video/480p/segment_$Number$.m4s" initialization="video/480p/init.mp4" startNumber="0"/>
        </Representation>
        <!-- Some more representations -->
    </AdaptationSet>
</Period>

While streaming, all of the segments are saved to disk to be used in VODs and highlights from the streaming session. I have the VOD solution done by remaking the live manifest into a static manifest.

My problem is when I want to create highlights, I want to reorder the segments and specify exactly what segments should be downloaded and played. I tried doing this using a SegmentationList. My new manifest that I have created looks like this:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

Highlight test

<Period start="PT0S" duration="PT0H2M24.000S">
    <AdaptationSet mimeType="video/mp4" minWidth="426" contentType="video" maxWidth="1920" minHeight="240" segmentAlignment="true" startWithSAP="1" maxHeight="1080">
        <Representation frameRate="60000/1000" height="480" width="858" bandwidth="1200000" codecs="avc1.42c00d" id="1200kb">
            <SegmentList duration="61440" timescale="15360">
                <Initialization sourceURL="video/480p/init.mp4"/>
                <!--Highlight 1-->
                <SegmentURL media="video/480p/segment_9399.m4s"/>
                <SegmentURL media="video/480p/segment_9400.m4s"/>
                <!--Highlight 2-->
                <SegmentURL media="video/480p/segment_9351.m4s"/>
                <SegmentURL media="video/480p/segment_9352.m4s"/>
                <!--Highlight 3-->
                <SegmentURL media="video/480p/segment_9449.m4s"/>
                <SegmentURL media="video/480p/segment_9450.m4s"/>
            </SegmentList>
        </Representation>
    </AdaptationSet>
    <AdaptationSet mimeType="audio/mp4" lang="en" startWithSAP="1" contentType="audio" segmentAlignment="true">
        <Representation audioSamplingRate="48000" bandwidth="128000" id="128kb" codecs="mp4a.40.2">
            <AudioChannelConfiguration value="2" schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011"/>
            <SegmentList duration="192000" timescale="48000">
                <Initialization sourceURL="audio/128kbps/init.mp4"/>
                <!--Highlight 1-->
                <SegmentURL media="audio/128kbps/segment_9399.m4s"/>
                <SegmentURL media="audio/128kbps/segment_9400.m4s"/>
                <!--Highlight 2-->
                <SegmentURL media="audio/128kbps/segment_9351.m4s"/>
                <SegmentURL media="audio/128kbps/segment_9352.m4s"/>
                <SegmentURL media="audio/128kbps/segment_9357.m4s"/>
                <!--Highlight 3-->
                <SegmentURL media="audio/128kbps/segment_9449.m4s"/>
                <SegmentURL media="audio/128kbps/segment_9450.m4s"/>
            </SegmentList>
        </Representation>
    </AdaptationSet>
</Period>

The problem I run into with this solution is firstly that the timer doesn't start at 0, it starts at 37596 (9399*4). My second problem is that it doesn't play highlight 2 when highlight 1 is finished. Instead if freezes as if had reached the end of the video.

I would guess there is something in the init file specifying how to play the segments.

Is there a way to do this by only creating a new manifest and not create a new init file?


回答1:


You don't need a new init file. The main problem is with the timestamps of the media segments. To solve the problem of the initial time, you should add the presentationTimeOffset attribute to the Manifest with the start time of the first segment you want to play.

The second issue is that discontinuities (in your case the time change between two highlights) should be handled by splitting them into new periods as the MPEG-DASH standard recommends:

In case of discontinuities it is recommended to add a new Period to reset the value of @presentationTimeOffset.

These two things could be combined as shown below (for the sake of simplicity I skipped the audio AdaptationSets). I've used SegmentTimeline in this case.

<MPD type="static" mediaPresentationDuration="PT0H2M24.000S" minBufferTime="PT4S" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" profiles="urn:mpeg:dash:profile:isoff-live:2011,urn:com:dashif:dash264">
    <Period start="PT0S" duration="PT8S">
        <!--Highlight 1-->
        <AdaptationSet mimeType="video/mp4" minWidth="426" contentType="video" maxWidth="1920" minHeight="240" segmentAlignment="true" startWithSAP="1" maxHeight="1080">
            <SegmentTemplate timescale="1" presentationTimeOffset="37596" startNumber="9399" initialization="video/480p/init.mp4" media="video/$RepresentationID$/segment_$Number$.m4s">
                <SegmentTimeline>
                    <S t="37596" d="4" r="1"/>
                </SegmentTimeline>
            </SegmentTemplate>
            <Representation frameRate="60000/1000" height="480" width="858" bandwidth="1200000" codecs="avc1.42c00d" id="480p" />
        </AdaptationSet>
    </Period>
    <Period duration="PT8S">
        <!--Highlight 2-->
        <AdaptationSet mimeType="video/mp4" minWidth="426" contentType="video" maxWidth="1920" minHeight="240" segmentAlignment="true" startWithSAP="1" maxHeight="1080">
            <SegmentTemplate timescale="1" presentationTimeOffset="37404" startNumber="9351" initialization="video/480p/init.mp4" media="video/$RepresentationID$/segment_$Number$.m4s">
                <SegmentTimeline>
                    <S t="37404" d="61440" r="1"/>
                </SegmentTimeline>
            </SegmentTemplate>
            <Representation frameRate="60000/1000" height="480" width="858" bandwidth="1200000" codecs="avc1.42c00d" id="480p" />
        </AdaptationSet>
    </Period>
    <Period duration="PT8S">
        <!--Highlight 3-->
        <AdaptationSet mimeType="video/mp4" minWidth="426" contentType="video" maxWidth="1920" minHeight="240" segmentAlignment="true" startWithSAP="1" maxHeight="1080">
            <SegmentTemplate timescale="1" presentationTimeOffset="37796" startNumber="9449" initialization="video/480p/init.mp4" media="video/$RepresentationID$/segment_$Number$.m4s">
                <SegmentTimeline>
                    <S t="37796" d="61440" r="1"/>
                </SegmentTimeline>
            </SegmentTemplate>
            <Representation frameRate="60000/1000" height="480" width="858" bandwidth="1200000" codecs="avc1.42c00d" id="480p" />
        </AdaptationSet>
    </Period>
</MPD>

Of course, the player needs to support both, the presentationTimeOffset and multi period. I think the Bitmovin Player should work, not sure about others like dash.js.



来源:https://stackoverflow.com/questions/41100894/reordering-segments-in-dash-segment-list

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!