Adaptive Streaming 学习笔记之一
有了时间就打算做点事情。打算在这里记录自己在学习多媒体信息系统方面的一些点滴,希望能够在将来能够对自己的这也生涯有所裨益。从今天开始,我准备介绍如何从零开始掌握主流的Adaptive Streaming技术的系列学习笔记。
首先给出几个有用的链接:
http://www.zhihu.com/question/20621558
http://www.garymcgath.com/streamingprotocols.html
http://www.streamingmedia.com/Articles/Editorial/What-Is-.../What-is-Adaptive-Streaming-75195.aspx
以上的链接对从各个时期的主流streaming协议进行了简要的介绍以及大致的比较,能够给大家一些比较核心的认识。streaming技术从发展的渊源来看主要分为两大流派:基于网络协议并需要对应的多媒体服务器支持的RTSP、微软的MMS以及Adobe的RTMP;基于HTTP的streaming方案诸如Apple的HLS、微软的MSS、Adobe新推出的HDS以及成为国际标准的MPEG DASH。虽然基于网络协议的方案(如RTMP)仍收到广泛的使用与支持,但是毫无疑问基于HTTP的steaming方案由于其得天独厚的优势是未来的发展趋势。当然,还注意到利用BitTorrent技术的P2P Streaming在某些场合也有其优势。
而我们的工作则希望在以上的理论知识之上,对现有的主流视频网站的streaming技术进行实际的探究。
1、Youtube
点播:比较特殊,使用的是HTTPS协议进行传输,因此最多只能通过浏览器调试的方式得到其get请求的包头信息。youtube使用了基于HTML5播放器的HTTP播放方式,对每个视频进行了几十MB级别的分段,然后在每个进行一个小的分片的get请求,每次请求的片段大小大概为1MB+的量级。
https://r3---sn-oguesnze.googlevideo.com/videoplayback?clen=29595934&gir=yes&keepalive=yes&mime=video%2Fmp4&key=yt6&itag=135&nh=IgpwcjAzLm5ydDE5KgkxMjcuMC4wLjE&lmt=1431925619201789&sver=3&initcwndbps=20271250&sparams=clen%2Cdur%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Ckeepalive%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cnh%2Cpl%2Crequiressl%2Csource%2Cupn%2Cexpire&ipbits=0&expire=1452461073&mm=31&pl=25&mn=sn-oguesnze&id=o-ACr7mVFk8xBLEY2goCTmHrQ6KQ52qVzb1aqsCMLA7QCW&dur=271.070&requiressl=yes&ip=45.32.14.175&mt=1452439318&mv=m&ms=au&fexp=9407155%2C9408503%2C9408940%2C9412859%2C9416126%2C9418401%2C9419444%2C9420452%2C9420718%2C9421906%2C9422341%2C9422596%2C9423662%2C9424629%2C9424753%2C9426047%2C9426718&source=youtube&signature=A26EA9B83133D04E506FBA26CFDC7801CA5F7376.67426DF786258D3AA7BF6C56E34F87282E35648E&upn=2nI73VtPabE&cpn=PGwsTojviTs1oReQ&alr=yes&ratebypass=yes&c=WEB&cver=html5&range=4273674-6235380&rn=30&rbuf=32999
https://r3---sn-oguesnze.googlevideo.com/videoplayback?clen=29595934&gir=yes&keepalive=yes&mime=video%2Fmp4&key=yt6&itag=135&nh=IgpwcjAzLm5ydDE5KgkxMjcuMC4wLjE&lmt=1431925619201789&sver=3&initcwndbps=20271250&sparams=clen%2Cdur%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Ckeepalive%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cnh%2Cpl%2Crequiressl%2Csource%2Cupn%2Cexpire&ipbits=0&expire=1452461073&mm=31&pl=25&mn=sn-oguesnze&id=o-ACr7mVFk8xBLEY2goCTmHrQ6KQ52qVzb1aqsCMLA7QCW&dur=271.070&requiressl=yes&ip=45.32.14.175&mt=1452439318&mv=m&ms=au&fexp=9407155%2C9408503%2C9408940%2C9412859%2C9416126%2C9418401%2C9419444%2C9420452%2C9420718%2C9421906%2C9422341%2C9422596%2C9423662%2C9424629%2C9424753%2C9426047%2C9426718&source=youtube&signature=A26EA9B83133D04E506FBA26CFDC7801CA5F7376.67426DF786258D3AA7BF6C56E34F87282E35648E&upn=2nI73VtPabE&cpn=PGwsTojviTs1oReQ&alr=yes&ratebypass=yes&c=WEB&cver=html5&range=6235381-7711377&rn=32&rbuf=43270
https://r3---sn-oguesnze.googlevideo.com/videoplayback?clen=29595934&gir=yes&keepalive=yes&mime=video%2Fmp4&key=yt6&itag=135&nh=IgpwcjAzLm5ydDE5KgkxMjcuMC4wLjE&lmt=1431925619201789&sver=3&initcwndbps=20271250&sparams=clen%2Cdur%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Ckeepalive%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cnh%2Cpl%2Crequiressl%2Csource%2Cupn%2Cexpire&ipbits=0&expire=1452461073&mm=31&pl=25&mn=sn-oguesnze&id=o-ACr7mVFk8xBLEY2goCTmHrQ6KQ52qVzb1aqsCMLA7QCW&dur=271.070&requiressl=yes&ip=45.32.14.175&mt=1452439318&mv=m&ms=au&fexp=9407155%2C9408503%2C9408940%2C9412859%2C9416126%2C9418401%2C9419444%2C9420452%2C9420718%2C9421906%2C9422341%2C9422596%2C9423662%2C9424629%2C9424753%2C9426047%2C9426718&source=youtube&signature=A26EA9B83133D04E506FBA26CFDC7801CA5F7376.67426DF786258D3AA7BF6C56E34F87282E35648E&upn=2nI73VtPabE&cpn=PGwsTojviTs1oReQ&alr=yes&ratebypass=yes&c=WEB&cver=html5&range=7711378-9099835&rn=33&rbuf=49449
直播:采用了DASH协议,典型的方式是将直播的视频流和音频流分割为1MB+和几十KB+的量级。通过首先get请求得到manifest文件得到play_list,然后再根据当前的网络状态或者用户需求实时选择对应码率的video和audio的片段。
https://manifest.googlevideo.com/api/manifest/dash/itag/0/hfr/1/pmbypass/yes/fexp/9407155%2C9408503%2C9408940%2C9412859%2C9416126%2C9418401%2C9419444%2C9420452%2C9420718%2C9421906%2C9422341%2C9422596%2C9423662%2C9424629%2C9424753%2C9426047%2C9426718/sver/3/source/yt_live_broadcast/upn/98VTQUg-5_g/gcr/jp/ipbits/0/as/fmp4_audio_clear%2Cfmp4_sd_hd_clear/sparams/gcr%2Chfr%2Cid%2Cip%2Cipbits%2Citag%2Cplaylist_type%2Cpmbypass%2Csource%2Cexpire/signature/4D3A6CE9B09129F5FEAF1B3F51CBD94042CDAB5E.6E333D90654565E7DC9B106D93A54A846D7D5828/playlist_type/DVR/expire/1452462185/key/yt6/ip/45.32.14.175/id/y60wDzZt8yg.1?cpn=awum5pVWpt0gFj7r&mpd_version=3&start_seq=2634917
https://r9---sn-oguesn7s.googlevideo.com/videoplayback?id=y60wDzZt8yg.1&itag=136&source=yt_live_broadcast&requiressl=yes&pmbypass=yes&gcr=jp&playlist_type=DVR&ratebypass=yes&cmbypass=yes&mime=video%2Fmp4&live=1&gir=yes&fexp=9407155,9408503,9408940,9412859,9416126,9418401,9419444,9420452,9420718,9421906,9422341,9422596,9423662,9424629,9424753,9426047,9426718&sver=3&upn=98VTQUg-5_g&signature=2693EEA04DCFCAA687547B92275C4D5B5A84C4E4.5C12F9A2C66F4D5F715944BD0A30AE38F30DC5E8&key=cms1&cpn=awum5pVWpt0gFj7r&mpd_version=3&ip=45.32.14.175&ipbits=0&expire=1452462185&sparams=cmbypass,expire,gcr,gir,id,ip,ipbits,itag,live,mime,mm,mn,ms,mv,nh,pl,playlist_type,pmbypass,ratebypass,requiressl,source&mm=32&mn=sn-oguesn7s&ms=lv&mt=1452440510&mv=u&nh=IgpwcjAzLm5ydDE5KgkxMjcuMC4wLjE&pl=25&alr=yes&keepalive=yes&c=WEB&cver=html5&sq=2634917&clen=1081219&lmt=1452440650952458&dur=5.0&rn=144&rbuf=9492
https://r9---sn-oguesn7s.googlevideo.com/videoplayback?id=y60wDzZt8yg.1&itag=140&source=yt_live_broadcast&requiressl=yes&pmbypass=yes&gcr=jp&playlist_type=DVR&ratebypass=yes&cmbypass=yes&mime=audio%2Fmp4&live=1&gir=yes&fexp=9407155,9408503,9408940,9412859,9416126,9418401,9419444,9420452,9420718,9421906,9422341,9422596,9423662,9424629,9424753,9426047,9426718&sver=3&upn=98VTQUg-5_g&signature=76E310685015414B7B9859DD3E963E1B21B8250E.786B6C6E1A779E932FD971116FA25C3157B8AFD8&key=cms1&cpn=awum5pVWpt0gFj7r&mpd_version=3&ip=45.32.14.175&ipbits=0&expire=1452462185&sparams=cmbypass,expire,gcr,gir,id,ip,ipbits,itag,live,mime,mm,mn,ms,mv,nh,pl,playlist_type,pmbypass,ratebypass,requiressl,source&mm=32&mn=sn-oguesn7s&ms=lv&mt=1452440510&mv=u&nh=IgpwcjAzLm5ydDE5KgkxMjcuMC4wLjE&pl=25&alr=yes&keepalive=yes&c=WEB&cver=html5&sq=2634917&clen=79580&lmt=1452440650952458&dur=5.0&rn=145&rbuf=9492
2、Youku、iQiYi等国内主流视频点播网站
点播:典型的方式是将一个大的视频会按照几十MB的水平划分为大片段。再通过HTTP协议,简单地通过get请求给出所需视频.flv文件的长度范围,与youtube不太相同的是每次请求的大小为10MB+左右,边下载该文件边播放直至该文件被播放完毕。以下是一个简单的请求过程:
http://112.29.146.4/videos/v0/20160110/ea/ee/57ae4676c08dc2540b6d8c774dc4b838.f4v?key=01bfa2a0b5d4d0d2debcb7e0f384ac3b1&src=iqiyi.com&qd_tvid=439500800&qd_vipres=0&qd_index=4&qd_aid=439500800&qd_stert=1080970&qd_scc=3040a4319737bb34a3f031ec53cb09f7&qd_sc=ba9bd8d9c15916c0dd71deeda26dfddf&qd_src=1702633101b340d8917a69cf8a4b8c7c&qd_ip=6f0a207b&qd_uid=0&qd_tm=1452425434000&qd_vip=0&ran=10900335&qyid=c828a7e5701c3bbabd54b174591a13c1&qypid=439500800_11&s=144756.3774431001&bt=175184&z=hefei_cmnet&la=CMNET|ChongQing-111.10.35.152&li=hefei_cmnet&lsp=141&lc=83&uuid=6f0a2398-56926b71-6f&range=0-10747903&qypid=439500800_01010011010000000000_1&ran=10900604
http://112.29.146.4/videos/v0/20160110/ea/ee/57ae4676c08dc2540b6d8c774dc4b838.f4v?key=01bfa2a0b5d4d0d2debcb7e0f384ac3b1&src=iqiyi.com&qd_tvid=439500800&qd_vipres=0&qd_index=4&qd_aid=439500800&qd_stert=1080970&qd_scc=3040a4319737bb34a3f031ec53cb09f7&qd_sc=ba9bd8d9c15916c0dd71deeda26dfddf&qd_src=1702633101b340d8917a69cf8a4b8c7c&qd_ip=6f0a207b&qd_uid=0&qd_tm=1452425434000&qd_vip=0&ran=10900335&qyid=c828a7e5701c3bbabd54b174591a13c1&qypid=439500800_11&s=144756.3774431001&bt=175184&z=hefei_cmnet&la=CMNET|ChongQing-111.10.35.152&li=hefei_cmnet&lsp=141&lc=83&uuid=6f0a2398-56926b71-6f&range=10747904-24379391&qypid=439500800_01010011010000000000_1&ran=10931290
http://112.29.146.4/videos/v0/20160110/ea/ee/57ae4676c08dc2540b6d8c774dc4b838.f4v?key=01bfa2a0b5d4d0d2debcb7e0f384ac3b1&src=iqiyi.com&qd_tvid=439500800&qd_vipres=0&qd_index=4&qd_aid=439500800&qd_stert=1080970&qd_scc=3040a4319737bb34a3f031ec53cb09f7&qd_sc=ba9bd8d9c15916c0dd71deeda26dfddf&qd_src=1702633101b340d8917a69cf8a4b8c7c&qd_ip=6f0a207b&qd_uid=0&qd_tm=1452425434000&qd_vip=0&ran=10900335&qyid=c828a7e5701c3bbabd54b174591a13c1&qypid=439500800_11&s=144756.3774431001&bt=175184&z=hefei_cmnet&la=CMNET|ChongQing-111.10.35.152&li=hefei_cmnet&lsp=141&lc=83&uuid=6f0a2398-56926b71-6f&range=24379392-38239153&qypid=439500800_01010011010000000000_1&ran=10998356
以上的例子中,该文件片段的长度为38,239,153字节,被分为成了三次get请求来完成下载。客户端基于的Flash技术,可以对接收到的部分文件进行实时解码实现边播放边下载,这是由Adobe公司的技术提供的保证。
3、PPTV、LeTV、直播秀场等国内视频直播网站
PPTV点播:众所周知,PPTV脱胎于PPLive,因此其基于P2P直播的技术路线与其他的主流的视频点播截然不同,而这也体现在其点播业务上。我们通过抓包发现,PPTV网站上的点播视频通常被划分为几十MB的片段,然后再通过HTTP请求每次花去大概1MB+的分片。而每次获取的过程与其他网站有所不同。初始化是一个如下的链接(返回的信息其实并没有具体的数据内容,只是关于该片段的基本信息):
http://122.72.99.58/1/0/1023/ece14c23db607048bfa27f8e682f00e1.mp4?fpp.ver=1.3.0.19&type=web.fpp&k=292f456fcf0c2ba9fe41ad897bfe0dba-6edb-1452498293&get_drm_header=true
然后再通过数十次的get请求,每次分别获取大概1MB多的分片,直至整个该片段都被下载完毕。
、
· · · · · · · · · · · · · · · · · · · · · · · ·
上述get请求的格式如下:
可以看出与仅仅为了获取视频片段信息的get请求的链接格式有所区别。值得一提的是,PPTV方案中的偏移地址的方式是在链接中的视频文件名之前,以三个斜线分割的数字来定义的:***/1/17040384/0/***。“1”表示片段的序号,“17040384”表示该片段中的起始偏移地址,而“0”表示直至结尾。通过抓包结果发现,该次请求服务器的响应并不一定是真的到结尾,而是传输了大概1MB多就会停止,随即开始下一次相似的get请求。
PPTV直播:直播的方式倒是较为简单,直接将直播stream编码之后划分为block(这里我猜想是否可能是TS流?可以进一步探究证实),并将其索引,每个get请求通过http方式接收5个block的内容,大小大概在几百KB的量级。
4、传统的监控视频探头
基本上都是通过传统的RTSP协议进行。大家只需上网搜索几个可用的RTSP流用VLC测试一下就能够发现。
5、iOS及Android移动端测试(APP和浏览器)
iOS系统下的点播测试:(以iQiYi为例)
【手机抓包方法:http://www.chinaz.com/web/2015/0326/393344.shtml】
这个问题还要分为两个方面来看,由于iOS系统的特殊性,分为APP端与Safari浏览器端。由于APP端的厂商的可控性较大,因此通过抓包我们发现,仍然采取了较为传统的flv容器格式,应该是在APP中通过结合FFMpeg等第三方的开源编解码库实现编解码。而对于Safari浏览器端,由于iOS只支持HTML5,根本无法使用flash控件,因此厂商往往采用了APPLE主导的HLS方案。抓取到的HTTP请求链接如下:
可以看到,链接中请求的视频文件是TS流,该TS流文件应该是一个大文件,同时结合链接给出的begin和end的所请求的视频片段起始地址,同时还给出了该片段的长度length,得到了相互间还略有重叠的TS流片段,从而得到流畅的播放。而使用TS流文件作为标准容器正是APPLE主导的HLS流媒体传输协议的主要特征之一。
而对于直播,其实也可以用类似的思路解决,因为HLS本来就是原生支持video streaming的协议。这一点也在其他的iOS设备上的APP中体现出来,比如cntv。在对其直播视频的抓包监控中,我们不仅发现了ts文件流,同时还发现了更多的细节,比如获取m3u8文件的过程。这更进一步说明了,在iOS设备上的HLS协议的统一性。
【M3U8文件解析:http://blog.sina.com.cn/s/blog_6cf7acdf0102v0xv.html】
Android系统下的点播测试:
利用Android模拟器,测试了Youku客户端在普通的视频点播场景下的流媒体传输方案。应该是结合APPLE的HLS技术,对视频服务器上整个完整的MP4文件进行分段的下载,具体通过抓包得到的get请求链接如下:
m=XkaE6@gpPkc_P@GET /youku/65715E50CF54A769BA46729B9/0300080901567A5A4EDA9D032DBBC702937495-D38B-B750-441B-51D88E5CCBAE.mp4 HTTP/1.1
Range: bytes=512001-1036289
User-Agent: Ikumobile/play/and/8.0.1.11120
Host: 112.17.4.24
m=XkaE6@gpPXP@7pGET /youku/65715E50CF54A769BA46729B9/0300080901567A5A4EDA9D032DBBC702937495-D38B-B750-441B-51D88E5CCBAE.mp4 HTTP/1.1
Range: bytes=1036290-1560578
User-Agent: Ikumobile/play/and/8.0.1.11120
Host: 112.17.4.24
m=XkaE6@ gpPm}6XP@GET /youku/65715E50CF54A769BA46729B9/0300080901567A5A4EDA9D032DBBC702937495-D38B-B750-441B-51D88E5CCBAE.mp4 HTTP/1.1
Range: bytes=1560579-2084867
User-Agent: Ikumobile/play/and/8.0.1.11120
Host: 112.17.4.24
m=XkaE/&@cgpOPQQ"tP@mGET /youku/6571A46054932746F86E86E41/0300080902567A5A4EDA9D032DBBC702937495-D38B-B750-441B-51D88E5CCBAE.mp4 HTTP/1.1
Range: bytes=16668673-17192961
User-Agent: Ikumobile/play/and/8.0.1.11120
Host: 112.17.4.79
m=XkaE/%@dgpOPQjP@TGET /youku/6571A46054932746F86E86E41/0300080902567A5A4EDA9D032DBBC702937495-D38B-B750-441B-51D88E5CCBAE.mp4 HTTP/1.1
Range: bytes=17192962-17717250
User-Agent: Ikumobile/play/and/8.0.1.11120
Host: 112.17.4.79
可以看出相邻的get请求中给出的MP4文件是相同的,而其中的range参数范围则是连续的。
6、总结
从上的分析中可以看出,所谓的流媒体传输从根本上分为两个方面:点播(VoD)和直播(Live)。而根据平台的不同,以及应用的特点,各个厂商采用的方案也是各有不同。总的来说,可以做出以下归纳:
桌面产品:(这里只测试了浏览器,有兴趣也可以试试桌面客户端)
国内的厂商还处于flash控件播放器的时代,因此匹配的视频格式通常是flv容器封装的方式完成视频点播的功能。当然对于少有的如PPTV等由于历史发展原因采用自有协议的网站,则是采用了MP4格式并搭配独有的协议完成的。而对于视频直播,则采用了
而已youtube为龙头的厂商则大胆的采用了html5技术,匹配的视频格式就是MP4分段下载解决点播问题。而直播问题则采用了业界更为新颖的MPEG DASH技术。
移动端产品:
国内的厂商在对于APP的处理上也尽显其顽固的本色,仍然如桌面的产品相似。但是对于不支持flash控件的移动端浏览器来说,众厂商只能无奈采用APPLE的HLS技术。
视频监控类产品:
通常都是采用rtsp协议,网上还能找到许多监控的测试流供使用。与此同时,发现少部分的如YY语音等秀场直播模式的软件可能也采用了rtsp协议,因为抓到的数据包视频流量全部都是udp,值得进一步深入研究。