【问题标题】:Reordering segments in dash segment list对短划线段列表中的段重新排序
【发布时间】:2016-12-12 12:24:10
【问题描述】:

我有一个如下所示的实时仪表板清单。

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

流式传输时,所有片段都会保存到磁盘中,以用于 VOD 和流式传输会话的精彩片段。我通过将实时清单重新制作成静态清单来完成 VOD 解决方案。

我的问题是当我想创建精彩片段时,我想重新排序片段并准确指定应该下载和播放哪些片段。我尝试使用 SegmentationList 来执行此操作。我的新证明 我创建的样子是这样的:

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

亮点测试

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

我在使用这个解决方案时遇到的问题首先是计时器不是从 0 开始,而是从 37596 (9399*4) 开始。我的第二个问题是当高亮 1 完成时它不会播放高亮 2。相反,如果冻结就好像已经到了视频的结尾。

我猜在 init 文件中有一些东西指定了如何播放这些片段。

有没有办法通过只创建一个新的清单而不创建一个新的 init 文件来做到这一点?

【问题讨论】:

    标签: video-streaming streaming mpeg-dash


    【解决方案1】:

    您不需要新的初始化文件。主要问题在于媒体片段的时间戳。解决初始时间问题,需要在Manifest中添加presentationTimeOffset属性,加上要播放的第一段的开始时间。

    第二个问题是不连续性(在您的情况下是两个亮点之间的时间变化)应该按照 MPEG-DASH 标准的建议将它们分成新的时段来处理:

    如果出现不连续性,建议添加新的 Period 以重置 @presentationTimeOffset 的值。

    这两个东西可以组合起来,如下所示(为了简单起见,我跳过了音频 AdaptationSet)。在这种情况下,我使用了 SegmentTimeline。

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

    当然,播放器需要同时支持presentationTimeOffset 和多周期。我认为Bitmovin Player 应该可以工作,不确定其他人喜欢dash.js

    【讨论】:

      猜你喜欢
      • 2010-10-19
      • 2016-05-10
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 2013-12-09
      相关资源
      最近更新 更多