当前位置: 首页 > 知识库问答 >
问题:

MP4 Box-初始化段、Base-URL和独立MPD

锺离飞鸣
2023-03-14

我有一段原始视频,以几种分辨率编码,并带有相关的比特率:

CanalMetroLivinglab3DTV-HD-Musica_384x216.mp4
CanalMetroLivinglab3DTV-HD-Musica_640x360.mp4
CanalMetroLivinglab3DTV-HD-Musica_720x406.mp4
CanalMetroLivinglab3DTV-HD-Musica_1280x720.mp4 
CanalMetroLivinglab3DTV-HD-Musica_1920x1080.mp4

我使用GPAC MP4 Box将这些内容分为几个部分,并创建MPD文件,如下所示:

MP4Box -dash 1000 -rap -segment-name %s_ -out CanalMetroLivinglab3DTV-HD-Musica.mpd ..\..\Dem3DTV\CanalMetroLivinglab3DTV-HD-Musica\CanalMetroLivinglab3DTV-HD-Musica_384x216.mp4 ..\..\Dem3DTV\CanalMetroLivinglab3DTV-HD-Musica\CanalMetroLivinglab3DTV-HD-Musica_640x360.mp4 ..\..\Dem3DTV\CanalMetroLivinglab3DTV-HD-Musica\CanalMetroLivinglab3DTV-HD-Musica_720x406.mp4 ..\..\Dem3DTV\CanalMetroLivinglab3DTV-HD-Musica\CanalMetroLivinglab3DTV-HD-Musica_1280x720.mp4 ..\..\Dem3DTV\CanalMetroLivinglab3DTV-HD-Musica\CanalMetroLivinglab3DTV-HD-Musica_1920x1080.mp4 

我获得了以下清单文件:(它不完整)

    <MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H0M45.02S" profiles="urn:mpeg:dash:profile:full:2011">
<ProgramInformation moreInformationURL="http://gpac.sourceforge.net">
<Title>
CanalMetroLivinglab3DTV-HD-Musica.mpd generated by GPAC
</Title>
</ProgramInformation>
<Period duration="PT0H0M45.02S">
<AdaptationSet segmentAlignment="true" bitstreamSwitching="true" maxWidth="1920" maxHeight="1080" maxFrameRate="25" par="16:9" lang="eng">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
<ContentComponent id="1" contentType="video"/>
<ContentComponent id="2" contentType="audio"/>
<SegmentList>
<Initialization sourceURL="CanalMetroLivinglab3DTV-HD-Musica_init.mp4"/>
</SegmentList>
<Representation id="1" mimeType="video/mp4" codecs="avc3.640028,mp4a.40.2" width="384" height="216" frameRate="25" sar="1:1" audioSamplingRate="44100" startWithSAP="1" bandwidth="479651">...</Representation>
<Representation id="2" mimeType="video/mp4" codecs="avc3.640028,mp4a.40.2" width="640" height="360" frameRate="25" sar="1:1" audioSamplingRate="44100" startWithSAP="1" bandwidth="930072">...</Representation>
<Representation id="3" mimeType="video/mp4" codecs="avc3.640028,mp4a.40.2" width="720" height="408" frameRate="25" sar="1:1" audioSamplingRate="44100" startWithSAP="1" bandwidth="1123428">...</Representation>
<Representation id="4" mimeType="video/mp4" codecs="avc3.640028,mp4a.40.2" width="1280" height="720" frameRate="25" sar="1:1" audioSamplingRate="44100" startWithSAP="1" bandwidth="2470344">...</Representation>
<Representation id="5" mimeType="video/mp4" codecs="avc3.640028,mp4a.40.2" width="1920" height="1080" frameRate="25" sar="1:1" audioSamplingRate="44100" startWithSAP="1" bandwidth="4327645">
<SegmentList timescale="1000" duration="1001">
<SegmentURL media="CanalMetroLivinglab3DTV-HD-Musica_1920x1080_1.m4s"/>
<SegmentURL media="CanalMetroLivinglab3DTV-HD-Musica_1920x1080_2.m4s"/>
<SegmentURL media="CanalMetroLivinglab3DTV-HD-Musica_1920x1080_3.m4s"/>
<SegmentURL media="CanalMetroLivinglab3DTV-HD-Musica_1920x1080_4.m4s"/>
    ...
<SegmentURL media="CanalMetroLivinglab3DTV-HD-Musica_1920x1080_42.m4s"/>
<SegmentURL media="CanalMetroLivinglab3DTV-HD-Musica_1920x1080_43.m4s"/>
<SegmentURL media="CanalMetroLivinglab3DTV-HD-Musica_1920x1080_44.m4s"/>
<SegmentURL media="CanalMetroLivinglab3DTV-HD-Musica_1920x1080_45.m4s"/>
</SegmentList>
</Representation>
</AdaptationSet>
</Period>
</MPD>

然而,我有几个问题:

>

  • 首先,我认为每个表示都应该有一个初始化段,它会列在SegmentList的第一个位置。我该怎么做?

    其次,在我的例子中,所有段(. m4s)、初始化段(. mp4)和清单文件(. mpd)都存储在服务器的同一位置。据此,不是必须使用Base-URL元素吗?

    在我看到的其他DASH序列中,每个表示的所有段都存储在一个独立的文件夹中,与其关联的初始化段和该表示的清单文件一起存储。然后,有一个全局MPD。我必须使用MP4 Box的哪些参数才能以这种方式完成它?

    非常感谢。

  • 共有1个答案

    岳景明
    2023-03-14

    第一个问题:GPAC似乎只使用一个包含所有表示的所有初始化信息的初始化段。因此,AdaptationSet元素中存在一个带有初始化元素的SegmentList元素。根据MPEG-DASH标准,这种技术用于表达默认值,表示元素内部的所有SegmentList元素都将继承来自更高级别SegmentList的属性和元素。基本上,这意味着表示级别上的每个SegmentList都包含一个初始化段。

    第二个问题:如果MPD级别不存在BaseUrl元素,那么所有请求都将相对于MPD位置。因此,如果MPD位于同一台服务器上,则无需使用BaseUrl。当您将内容从一个文件夹移动到另一个文件夹时,它也会更舒适,因为您不需要修改MPD,即更改BaseUrl。

    第三个问题:这是可能的,其他服务正在以这种方式构建内容,并使用SegmentTemplate,同时为所有单独的表示提供MPD。这样可以更容易地删除或添加表达。使用MP4Box,您可以使用-segment name标志,并为每个表示启用一个子目录,例如,$RepresentationID$/CanalMetroLivinglab3DTV-HD-Musica_$Number$。m4s。无论如何,没有必要这样做。我强烈建议使用SegmentTemplate,因为它使MPD更加紧凑(减少字节数,减少启动延迟)。可以使用MP4Box和-url模板标志。顺便说一句,至少从MPEG-DASH MPD的角度来看,用MP4Box生成的内容似乎是有效的。您可以随时使用克拉根福大学的MPD验证器检查您的MPD是否有效。

     类似资料:
    • 我有一个由一个活动和几个片段组成的应用程序,由谷歌重新指挥。其他细节在这里。我想保持一个菜单静止和切换我的碎片在容器在中心。 当我启动该活动时,它会初始化一个变量,如代码所示。 但是,当我在fragment onCreate中使用这个变量()时,活动中的绑定行会因,如下面的logcat所示 下面是完整的logcat,我们可以看到第二个sout丢失了,但在这一点上没有抛出错误。

    • 我使用FFMPEG-segment对桌面上的视频捕获进行分段,并通过网络发送它们,以便提供给客户,并使用dash.js播放。问题是播放器正在搜索初始化段,而我似乎不知道如何创建它。 我使用以下ffmpeg命令创建段: 我为流创建的清单如下所示: 播放机调试模式打印以下内容: 如何为生成的段创建初始化段?我似乎无法让它起作用。

    • 问题内容: 我在Go中有一个函数,如下所示: 我想用参数(“ Bob”,“ New York”,“ Builder”,30、1000)调用此函数,但我想在调用函数时使用字段名称。但是,以下技术均无效(它们会引发“未解决的参考错误”): 应该如何正确完成?我在初始化结构时使用字段名称没有问题,但是对于函数来说,似乎缺少了一些东西。 问题答案: 该规范不允许你调用函数时指定参数名称。您只能列出希望作为

    • 我希望转换之间的HLS和MPEG破折号。我不能访问原始的完全串联的视频文件,只有个别的HLS段。 在进行到MPEG破折号的转换时,我需要为破折号manifest.mpd文件提供一个初始化段。 我的问题是: null 非常感谢。 更新:使用原始hls段的流代码段。视频一直在播放,但只是黑色的。

    • Initialization 初始化 Although it doesn’t look superficially very different from initialization in C or C++, initialization in Go is more powerful. Complex structures can be built during initialization a

    • 初始化是为类、结构体或者枚举准备实例的过程。这个过需要给实例里的每一个存储属性设置一个初始值并且在新实例可以使用之前执行任何其他所必须的配置或初始化。 你通过定义初始化器来实现这个初始化过程,它更像是一个用来创建特定类型新实例的特殊的方法。不同于 Objective-C 的初始化器,Swift 初始化器不返回值。这些初始化器主要的角色就是确保在第一次使用之前某类型的新实例能够正确初始化。 类类型的