MP4 Box - 初始化段、Base-URL 和独立 MPD
MP4 Box - Initialization segments, Base-URL and independent MPDs
我有一个以多种分辨率编码的原始视频及其相关比特率:
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>
但是,我有几个问题:
首先,我认为每个representation应该有一个初始化segment,它会被列在SegmentList的第一个位置。
我该怎么做?
其次,在我的例子中,所有段 (.m4s)、初始化段 (.mp4) 和清单文件 (.mpd) 都存储在服务器中的相同位置。据此,是不是需要Base-URL元素?
在我看到的其他 DASH 序列中,每个表示的所有段与其关联的初始化段和该表示的清单文件一起存储在一个独立的文件夹中。然后,有一个全局 MPD。 MP4 Box需要用到什么参数才能实现?
谢谢!
第一个问题: GPAC 似乎只使用一个初始化段,其中包含所有表示的所有初始化信息。因此,具有 Initialization 元素的 SegmentList 元素出现在 AdaptationSet 元素中。根据 MPEG-DASH 标准,该技术用于表示默认值,Representation 元素内的所有 SegmentList 元素将继承更高级别 SegmentList 的属性和元素。基本上这意味着 Representation 级别上的每个 SegmentList 都包含一个初始化段。
第二个问题:如果 MPD 级别上不存在 BaseUrl 元素,则所有请求都将与 MPD 位置相关。因此,如果 MPD 位于同一台服务器上,则无需使用 BaseUrl。当您将内容从一个文件夹移动到另一个文件夹时,它也变得更加舒适,因为您不需要修改 MPD,即更改 BaseUrl。
第三个问题:这是可能的,其他服务正在以这种方式构建内容并使用 SegmentTemplate,同时为所有单独的表示提供 MPD。这使得删除或添加表示更容易。使用 MP4Box,您可以使用 -segment-name 标志并为每个 Representation 启用一个子目录,例如 $RepresentationID$/CanalMetroLivinglab3DTV-HD-Musica_$Number$.m4s。无论如何,没有必要那样做。我强烈建议使用 SegmentTemplate,因为它使您的 MPD 更紧凑(更少的字节,减少启动延迟)。可能与 MP4Box 和 -url-template 标志。顺便提一句。您使用 MP4Box 生成的内容似乎是有效的,至少从 MPEG-DASH MPD 的角度来看是这样。您可以随时使用克拉根福大学的 MPD-Validator 检查您的 MPD 是否有效。
我有一个以多种分辨率编码的原始视频及其相关比特率:
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>
但是,我有几个问题:
首先,我认为每个representation应该有一个初始化segment,它会被列在SegmentList的第一个位置。 我该怎么做?
其次,在我的例子中,所有段 (.m4s)、初始化段 (.mp4) 和清单文件 (.mpd) 都存储在服务器中的相同位置。据此,是不是需要Base-URL元素?
在我看到的其他 DASH 序列中,每个表示的所有段与其关联的初始化段和该表示的清单文件一起存储在一个独立的文件夹中。然后,有一个全局 MPD。 MP4 Box需要用到什么参数才能实现?
谢谢!
第一个问题: GPAC 似乎只使用一个初始化段,其中包含所有表示的所有初始化信息。因此,具有 Initialization 元素的 SegmentList 元素出现在 AdaptationSet 元素中。根据 MPEG-DASH 标准,该技术用于表示默认值,Representation 元素内的所有 SegmentList 元素将继承更高级别 SegmentList 的属性和元素。基本上这意味着 Representation 级别上的每个 SegmentList 都包含一个初始化段。
第二个问题:如果 MPD 级别上不存在 BaseUrl 元素,则所有请求都将与 MPD 位置相关。因此,如果 MPD 位于同一台服务器上,则无需使用 BaseUrl。当您将内容从一个文件夹移动到另一个文件夹时,它也变得更加舒适,因为您不需要修改 MPD,即更改 BaseUrl。
第三个问题:这是可能的,其他服务正在以这种方式构建内容并使用 SegmentTemplate,同时为所有单独的表示提供 MPD。这使得删除或添加表示更容易。使用 MP4Box,您可以使用 -segment-name 标志并为每个 Representation 启用一个子目录,例如 $RepresentationID$/CanalMetroLivinglab3DTV-HD-Musica_$Number$.m4s。无论如何,没有必要那样做。我强烈建议使用 SegmentTemplate,因为它使您的 MPD 更紧凑(更少的字节,减少启动延迟)。可能与 MP4Box 和 -url-template 标志。顺便提一句。您使用 MP4Box 生成的内容似乎是有效的,至少从 MPEG-DASH MPD 的角度来看是这样。您可以随时使用克拉根福大学的 MPD-Validator 检查您的 MPD 是否有效。