前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Easy Tech:什么是MPEG-DASH协议

Easy Tech:什么是MPEG-DASH协议

作者头像
LiveVideoStack
发布2022-03-04 13:13:11
1.9K0
发布2022-03-04 13:13:11
举报
文章被收录于专栏:音视频技术

点击上方“LiveVideoStack”关注我们

翻译 | Alex 技术审校 | 赵军 本文来自OTTVerse,作者为Krishna Rao Vijayanagar。

MPEG-DASH

Easy Tech

#014#

MPEG-DASH是最流行的视频流协议之一,它广泛用于点播和直播,将媒体传输给各种终端设备,包括手机、平板、智能电视、游戏机等。MPEG-DASH是一种基于HTTP的流媒体传输协议,负责将视频从HTTP服务器传输给终端用户。在MPEG-DASH中,一个视频被分割成许多切片,这一信息被一个MPD记录。该MPD首先被传输给播放器,播放器基于当前网络条件和缓冲情况,基于MPD信息来请求合适码率&分辨率的视频切片。

本篇文章中,让我们一起来学习MPEG-DASH的基础知识、历史和它的重要特性等。

 首先,何谓ABR技术?

DASH是Dynamic Adaptive Streaming over HTTP的简称,是一种自适应码率流媒体技术。学习ABR技术很重要,因为它可以帮助我们更好地理解什么是DASH以及为什么使用DASH。

如果你已经很熟悉ABR,那么MPEG-DASH对你来说也就没有那么难了,因为它描述了ABR相关的机制。

ABR是Adaptive Bit-Rate streaming的简称,是指为确保视频在互联网上的流畅传输,而根据带宽条件自适应地调节视频码率和质量的过程。

使用ABR技术后,视频被转码为多种分辨率和码率的组合,这种组合被称为“rendition”,这些rendition的集合形成了码率阶梯(Bitrate Ladder)

下面就是一个码率阶梯:

1.   1080p 5.0 mbps2.   720p 4.0 mbps3.   640p 3.2 mbps4.   480p 2.0 mbps5.   270p 1 mbps

让我们假设视频已经按上述码率阶梯编码。当播放器开始播放视频时,它感知到的可用带宽假设是20mpbs。该带宽远大于码率阶梯中最高的5 mbps,所以播放器可以安全地以5mbps下载第一个视频切片(时长6s)。当播放器再次感知带宽变化,如果带宽依然很高,那么同样请求最高带宽的视频。

如果带宽突然下降到5mbps,播放器将有可能向服务器请求4mbps的切片(因为这时如果再请求5mbps的切片会很有风险)。收到4mbps的切片后,便开始播放这个视频切片。

整个视频都会持续这个过程。这就是码率和质量如何通过自适应带宽条件来不断变化的。在介绍了ABR之后,让我们来看看MPEG-DASH是如何助力ABR技术的。

 什么是MPEG-DASH?

正如我们在前文所述,ABR技术用于在视频传输时通过动态改变视频码率和质量来适应带宽变化和播放器的缓冲程度。

然而,如果一次性传输整个流媒体文件,将很难做到这一点,想象一下从Dropbox、S3或者 Google Drive下载视频文件。和其他类型的文件一样(如文本、数据),这个文件仅有一个,根本没有办法暂停下载并将其切换到一个不同的码率-分辨率组合(rendition),对吧?所以ABR技术并不适用于庞大而单一的文件

为了定期在文件之间动态切换,需要将文件处理并分解成小块。每一块都应该能够独立传输。除此之外,应该有一种机制来促进这种自适应的动态下载。

为了解决这些问题并为ABR视频流制定行业规范,2009年,MPEG组织为基于HTTP的视频流标准发布了CFP。在几家公司和行业组织的协作下,MPEG-DASH标准终于在 2012年4月被开发并发布出来。它在2019年被修订为MPEG-DASH ISO/IEC 23009-1:2019。

 MPEG-DASH如何工作?

从名字就可以看出,DASH(Dynamic Adaptive Streaming over HTTP)基于ABR工作原理,下图为DASH的工作原理:

  • 一组电影的编码(或码率-分辨率组合, 即rendition)由MPEG-DASH打包服务或软件去打包,打包的过程是将每个rendition分割成指定时间的小片或小块(例如,2秒或4秒长)。
  • 打包器还将其如何分割视频以及视频的交付顺序记录在一个称为MPD或清单(manifest)的文本文件中。
  • 打包过的视频和清单被存储在源站服务器,并等待被分发给播放器(通常使用CDN)。
  • 在另一端,有一个兼容了MPEG-DASH的播放器,其中内置了ABR引擎。
  • 当用户按下播放键,应用程序或者视频播放器请求视频的MPD文件,在收到MPD后,播放器对其进行解析然后理解如何播放视频。
  • 播放器开始按照预定义顺序请求视频切片,解码它们并将视频显示给用户。
  • 播放器持续监测带宽条件。根据可用带宽,播放器选择MPEG-DASH MPD中描述的码率之一,并请求CDN从该变体(Variant)中发送下一个视频块。

整个过程会一直持续,直到视频播放结束(电影结束或者用户停止观看)。

再来回顾一下MPEG-DASH的工作原理:

  • MPD文件描述了电影视频的切割、排序方式以及传输信息。
  • 打包过的视频被存储在服务器上并通过CDN发送。
  • 视频播放器首先下载MPD,然后需要理解视频传输机制,感知可用带宽,再开始播放。
  • 根据缓冲大小和可用带宽,视频播放器请求该电影某个码率组合的视频切片。
  • 通过不断感知带宽条件和缓冲水平,播放器自适应地传输内容,以提供良好的用户体验。

 如何创建MPEG-DASH视频流?

如果你拥有一个单一的视频或者同一视频的几个码率-分辨率组合(rendition),你就可以创建与MPEG-DASH兼容的视频流。这个过程被称为打包,由专业的软件打包器完成。

目前市面上有多种打包器,其中最有名的包括:

  • FFmpeg
  • 谷歌的Shaka Packager
  • GPAC的mp4box
  • Bento4的mp4dash

它们都是由命令行驱动,最基本的操作就是在视频文件中指定打包器,并确认DASH参数(直播、点播、切片列表和切片时间线等),打包器将生成DASH兼容的视频流和DASH MPD文件。

 MPEG-DASH的清单(MPD)示例

下面是一个简单的MPEG-DASH清单(MPD)示例,通过DASH协议可以向DASH兼容的播放器传输视频。

代码语言:javascript
复制
<!--  MPD file Generated with GPAC version 0.5.1-DEV-rev5379  on 2014-09-10T13:23:18Z --><MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H9M56.46S" profiles="urn:mpeg:dash:profile:isoff-live:2011"><ProgramInformation moreInformationURL="http://gpac.sourceforge.net"><Title>dashed/BigBuckBunny_2s_simple_2014_05_09.mpd generated by GPAC</Title></ProgramInformation><Period duration="PT0H9M56.46S"><AdaptationSet segmentAlignment="true" group="1" maxWidth="480" maxHeight="360" maxFrameRate="24" par="4:3"><SegmentTemplate timescale="96" media="bunny_$Bandwidth$bps/BigBuckBunny_2s$Number$.m4s" startNumber="1" duration="192" initialization="bunny_$Bandwidth$bps/BigBuckBunny_2s_init.mp4"/><Representation id="854x480 595.0kbps" mimeType="video/mp4" codecs="avc1.42c01e" width="854" height="480" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="595491"/><Representation id="1280x720 1.5Mbps" mimeType="video/mp4" codecs="avc1.42c01f" width="1280" height="720" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="1546902"/><Representation id="1920x1080 2.1Mbps" mimeType="video/mp4" codecs="avc1.42c032" width="1920" height="1080" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="2133691"/></AdaptationSet></Period></MPD>

更多DASH MPD的详尽列表,可在OTTVerse上查看:https://ottverse.com/free-mpeg-dash-mpd-manifest-example-test-urls/。

 MPEG-DASH特性

MPEG-DASH拥有很多特性,这些特性对于视频服务提供商充满吸引力。让我们来看下这些特性:

  • MPEG-DASH获得了播放器公司的广泛支持,并由国际社区积极发展。持续的Bug修复、改进以及各种特性使得MPEG-DASH成为视频服务的最佳选择。
  • MPEG-DASH同时支持点播和直播。
  • 获得了Android生态的支持,这对于在Android手机、电视以及其他设备上观看视频尤为重要。考虑到世界上很多人无法负担IPhone和Apple TV昂贵的价格,所以MPEG-DASH会是HLS很好的替代。
  • MPEG-DASH对编解码器没有要求,可以很好地与 H.264/AVC、AV1 或其他Codec一起使用。
  • MPEG-DASH同时支持MPEG-TS和fMP4容器格式。(审校者注:MPEG DASH最新版本和Fragmented MP4 关联更紧密一些,它确实也在老版本的标准中支持了 MPEG-TS。)
  • MPEG-DASH支持广告插入(包括客户端和服务器端的广告插入)。

 哪些播放器支持MPEG-DASH?

很多播放器支持MPEG-DASH且服务于各种应用和设备。一些播放器可以通过原生应用或者浏览器在Web上、Android Exoplayer、Roku、智能电视上播放MPEG-DASH视频。

MPEG-DASH兼容播放器包括:

  • DASH.js
  • 带有MPEG-插件的VideoJS 或带有native DASH 播放的VideoJS7
  • Bitmovin
  • THEOPlayer
  • CastLabs
  • JWPlayer
  • NexPlayer
  • Radiant Media Player
  • Android Exoplayer
  • Roku

Roku可以播放MPEG-DASH视频流

下面是一个免费、开源的MPEG-DASH兼容Web播放器。

DASH.js Reference Player[1]

DASH.js reference player 是最佳MPEG-DASH在线播放器之一,它可以免费播放MPD文件。在我看来,它拥有非常易于使用的界面,并可以提供大量便捷且重要的信息来调试视频流。

这些便捷的信息包括缓冲水平,可以告诉你正在使用的是哪个rendition,以及所有数据的时间线等等。它由开源 dash.js 播放器提供支持,并不断更新到最新版本,以便用户始终可以使用最新版本来调试MPD视频流。

 小       结

我希望这篇文章可以帮助你更好地理解MPEG-DASH。本篇文章中,我们介绍了ABR技术的基础知识、MPEG-DASH的历史及其工作原理、MPD文件示例、DASH兼容的视频播放器等等。在未来的文章中,我们会介绍更多MPD的基础知识,以及如何使用打包器(如Shaka、mp4box等等)打包MPEG-DASH。

我们下次见!祝大家观影愉快!


注释[1] https://reference.dashif.org/dash.js/latest/samples/dash-if-reference-player/index.html

致谢本文已获得作者Krishna Rao Vijayanagar授权翻译和发布,特此感谢。

原文链接:

https://ottverse.com/mpeg-dash-video-streaming-the-complete-guide/


扫描图中二维码或点击阅读原文了解大会更多信息

喜欢我们的内容就点个“在看”吧!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 LiveVideoStack 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云点播
面向音视频、图片等媒体,提供制作上传、存储、转码、媒体处理、媒体 AI、加速分发播放、版权保护等一体化的高品质媒体服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档