如何使 MPEG-DASH 流式传输基于时间片的不同质量

How to make MPEG-DASH to stream different qualities based on time slices

我正在探索用于视频改编的 MPEG-DASH 技术。作为测试用例,我有两个版本的同一视频,分辨率分别为 400x250(1.mp4) 和 640x360(2.mp4),并希望通过 MPEG DASH 进行流式传输。使用 GPAC - MP4Box 我使用以下命令生成了 mpd:

MP4Box -dash 1000 -rap -bs-switching no -profile live -out manifest.mpd 1.mp4 2.mp4

生成的MPD如下:

<?xml version="1.0"?> 
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500S" type="static" mediaPresentationDuration="PT0H4M57.088S" maxSegmentDuration="PT0H0M10.428S" profiles="urn:mpeg:dash:profile:full:2011">
<ProgramInformation moreInformationURL="http://gpac.io">
  <Title>manifest.mpd generated by GPAC</Title>
 </ProgramInformation>
<Period duration="PT0H4M57.088S">
  <AdaptationSet maxWidth="640" maxHeight="360" maxFrameRate="24000/1001" par="16:9" lang="und" startWithSAP="1">
   <Representation id="1" mimeType="video/mp4" codecs="avc1.640015" width="400" height="250" frameRate="24000/1001" sar="10:9" bandwidth="80722">
<SegmentTemplate media="1_dash$Number$.m4s" initialization="1_dashinit.mp4" timescale="24000" startNumber="1" duration="24000"/>
   </Representation>
   <Representation id="2" mimeType="video/mp4" codecs="avc1.64001E" width="640" height="360" frameRate="24000/1001" sar="1:1" bandwidth="137371">
<SegmentTemplate media="2_dash$Number$.m4s" initialization="2_dashinit.mp4" timescale="24000" startNumber="1" duration="24000"/>
   </Representation>
  </AdaptationSet>
 </Period>

我真正想要的是采用基于时间片的视频,即前 5 秒,应该流式传输 1.mp4,接下来的 15 秒,应该流式传输 2.mp4 并向前..

需要有关如何根据流式传输不同质量的时间片实现自适应的指导。

MPEG DASH 是一种请求和响应流媒体协议 - 客户端请求每个片段,流媒体服务器以适当的片段响应。

客户端决定从清单中的可用带宽中请求哪些带宽,通常基于其对当时网络状况的看法、基于缓冲等以及设备功能。

大多数客户端还允许您手动 select 可用的比特率。

如果您想要修改客户端以在给定时间段内使用一种比特率,然后在不同的时间段内使用另一种比特率,那么您可能需要修改客户端中选择比特率的算法请求。

开源播放器有时允许您指定自定义函数来执行此操作 - 一些示例:

如果您不想更改客户端上的任何内容并想让服务器决定使用的流,最简单的方法是只在第一个时间段提供一个比特率,然后只提供下一周期的其他比特率。

MPEG DASH cann support multiple periods - 请参阅 DASH 概述论文中的下图(link 在撰写本文时:https://www.nctatechnicalpapers.com/Paper/2012/2012-mpeg-dash-a-technical-deep-dive-and-look-at-what-s-next

你可以看到,如果你有一个周期使用单一比特率或表示的单一自适应集,然后下一个周期也使用单一比特率或表示,你也可以实现你想要的。然而,我认为可以公平地说,这不是使用 DASH 的典型方式。