如何使 MPEG-DASH 流式传输基于时间片的不同质量
Posted
技术标签:
【中文标题】如何使 MPEG-DASH 流式传输基于时间片的不同质量【英文标题】:How to make MPEG-DASH to stream different qualities based on time slices 【发布时间】:2021-11-18 08:58:15 【问题描述】:我正在探索用于视频改编的 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" frameRate="24000/1001" sar="10:9" band>
<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" frameRate="24000/1001" sar="1:1" band>
<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 及以后..
需要关于如何根据时间片实现适应以流式传输不同质量的指导。
【问题讨论】:
【参考方案1】:MPEG DASH 是一种请求和响应流式传输协议 - 客户端请求每个段,流式传输服务器以适当的段响应。
客户端决定从清单中可用的带宽中请求哪些带宽,通常基于其对当时网络状况的看法、基于缓冲等以及设备功能。
大多数客户端还允许您从可用的比特率中手动选择比特率。
如果您想修改客户端以在给定时间段使用一种比特率,然后在不同时间段使用另一种比特率,那么您可能需要修改客户端中选择请求比特率的算法.
开源播放器有时允许您指定自定义函数来执行此操作 - 一些示例:
exoplayer - 更多信息在这里:https://medium.com/google-exoplayer/exoplayer-2-x-track-selection-2b62ff712cc9 Dash.js - 更多信息在这里:https://***.com/a/47225096/334402如果您不想更改客户端上的任何内容并想让服务器决定使用的流,最简单的方法是在第一个时间段只提供一个比特率,然后只提供另一个比特下一个周期的利率。
MPEG DASH 不能支持多个周期 - 请参阅 DASH 概述论文中的下图(撰写本文时的链接:https://www.nctatechnicalpapers.com/Paper/2012/2012-mpeg-dash-a-technical-deep-dive-and-look-at-what-s-next)
您可以看到,如果您有一个具有单个自适应集且具有单一比特率或表示的周期,然后下一个周期也具有单一比特率或表示,您也可以实现您想要的。然而,我认为公平地说,这不是使用 DASH 的典型方式。
【讨论】:
感谢@Mick 的详细解释。就我而言,我认为我应该去多个时期,根据我的要求,每个时期都有不同的时间片。你能给我举个例子,多个句点用于不同的分辨率吗? @MuhammadJawad 以这种方式定期使用 DASH 不是我见过的,但您可以尝试查看 DASH 样本:reference.dashif.org/dash.js/latest/samples。当广告的比特率与主视频不同时,广告插入用例中也可能发生大致相似的情况,尽管这通常不是设计使然。以上是关于如何使 MPEG-DASH 流式传输基于时间片的不同质量的主要内容,如果未能解决你的问题,请参考以下文章
通过 HTTP (MPEG-DASH) 进行流式传输有啥意义?
如何使用 MPEG DASH 流式传输和捕获 MP4 文件?