背景
随着带宽提速和互联网发展,内容丰富、形式多样的视频正成为碎片化时代娱乐消费的新宠,短视频、视频直播、在线钢琴陪练、合唱直播一系列新玩法层出不穷,涉及电竞、社交、电商、教育等各个行业。网络视频快速发展对系统性能带来了巨大的考验。
流媒体业务场景
下面是用户与流媒体服务器的简化交互关系,主要分为推流和拉流2大类。
推流就是从外界采集数据后利用流媒体协议将文件推流至流媒体服务器端,拉流就是将文件从流媒体服务器拉取至本地播放的过程,流媒体的文件主要是由音频和视频2个部分组成,youtube、土豆、优酷等视频播放器播放一个互联网上的视频文件时,需要经过解协议、解封装、音视频解码、以及音视频同步这几个步骤。因此对流媒体的压力测试也需经历这些过程,所以先了解几种常见的流媒体协议:
HLS:HTTP Live Streaming(HTTP直播流技术),Apple的动态码率自适应技术,不同带宽的设备可以自动切换到最适合自己码率的视频播放。HLS基于http短连接,将整个流切分成一个个小的文件来下载,也就是ts切片文件,并更新m3u8的索引文件、存放ts文件配置信息和相关路径。m3u8由一系列的标签组成,ts文件为传输的流文件,视频编码主要格式h264/mpeg4,音频为acc/MP3。HLS的主要缺点就是时延性在10秒以上。
RTMP:Real Time Messaging Protocol(实时消息传输协议),该协议基于TCP ,使用端口1935,每个时刻的数据收到了即可转发,RTMP协议需要客户端和服务器通过“握手”来建立基于传输层链接之上的RTMP Connection链接,在这个连接上传输对应的控制信息和对应的Message,RTMP的实时性比HLS要好,往往时延在5S以下。并且RTMP有RTMPT,RTMPS等变种。
下面我们来了解下流媒体播放的主要流程,流媒体播放主要分为直播和点播2大类,区别在于直播是利用一些新兴或者传统的媒介实时的进行图像和声音的采集,如录像机,麦克风、手机等,将采集的数据进行处理和编码,利用上面提到了流媒体协议进行封装,之后将数据流推送到直播节点上,观众可以实时进行观看。点播的数据来源则是已存在的视频,或者是通过直播流录制转换后的视频,可以回放观看。之后流媒体服务器通过CDN分发网络,根据拉流端的码率实时转码,就近的将数据流发送至客户端,缩短请求响应时间。
观众端最终通过播放器解码、在不同的地点播放观看对应的直播视频和点播视频。然而不同的站点和播放器观众体验大相见庭,有的时候我们会说这个视频特别流畅,或者特别卡,从观众的角度具体有哪些直观的体验维度呢?
流媒体业务质量度量指标
下面是几个主要影响用户观看体验的指标:
• 播放是否成功,直接的功能性影响;
• 播放过程中是否出现了卡顿,需要等待,影响观众体验;
• 延迟是否很大,直播中的互动对延迟要求性高,延迟太大,影响与观众的互动;
• 首屏时间,视频是否秒开,即点击播放后到看到播放画面的时间,秒开时间越短,用户体验自然越好;
• 音质和画质是否同步,以及播放的时候是否出现了花屏、黑屏或者绿屏。
流媒体业务挑战
视频/短视频领域当前行业竞争十分激烈,服务质量往往会成为服务提供商生存的生命线,单在技术上主要面临着以下几个挑战:
• 海量并发场景常见
不同于普通应用和游戏,视频类应用的使用时间非常集中,大致在晚饭后至睡前22点-23点,在短短几小时内涌入大量用户,例如一个大V/流量明星直播可以引起百万级用户的登录。海量的并发用户常常造成视频卡顿、画面延时甚至应用崩溃,这已经成为企业不能承受之重。
• 用户对高延迟容忍度下降
随着互联网网速的变快,用户的耐心程度正不断下降,视频加载时间每长1秒,就会有约6%的人放弃观看。对直播来说即时性就显得尤为重要,如果主播端与观众端的互动无法同步时,给用户带来不好的体验。
• 用户交互频率高
视频应用与普通应用相比,涉及很多的用户交互频次高的场景,视频流服务器除了承担并发用户压力之外,还包括用户消息推送、礼物、聊天、红包雨等场景带来的数据交互压力。这些用户交互频次高的场景同时涉及大量外部API接口,时刻影响着用户体验。
视频/短视频公司为了快速抢占市场,必须快速的攻克这些挑战,利用当下的一些新兴的技术,提升服务器性能。像是通过GOP缓存,改写播放器逻辑,让播放器在拿到第一个关键帧后就直接显示而不是等待音视频同步后再进行播放;建立CDN内容分发网络,经过策略部署,负载均衡,降低服务器和带宽的压力;提前做好DNS解析,提高视频文件下载性能;以及对服务器进行压力测试,围绕客户播放行为识别性能瓶颈,进行优化。
流媒体压力测试:
流媒体的压测测试主要是通过模拟海量用户访问直播点播的场景,关注于服务器是否能够在高并发时间段稳定运行,在播放视频时不出现卡顿、花屏等问题影响用户观看体验,以及是否可以及时响应秒开视频等。
视频卡顿主要有2个大方面的因素:
1) 外因,客户端的设备配置太差,对应的硬件来不及处理数据,或者对应的软件版本太低,这样只能是升级硬件以及更新版本。另一个是网络太差,随着网络通信的快速发展,对数据传输的要求也随之增加,在数据来不及发送客户端出现了等待数据的情况,也会导致视频卡顿;
2) 内因,流本身出现了音视频时间戳不同步,流对应的参数不正确导致的视频卡顿。另外,通过视频首帧用时和首包用时可以客观的量化用户的观看体验,这些都是流媒体进行压力测试需要主要关注的问题。
视频出现花屏的主要可能:
1) 丢失了关键帧或者没有从关键帧开始解码。对于H.264码流来说,分为I、B、和P三中类型的帧,其中I帧为关键帧,可以独立的解码播放,B 帧是双向预测内插编码帧,丢失了I帧和后面的P帧,则会解码失败,P 帧是前向预测编码帧,丢失了前面的I、B、P帧也会导致解码失败。对于此类的解码失败一般就会出现花屏的现象。
2) 图像格式的转换不正确,例如横屏播放变成了竖屏播放,拉流端图像尺寸发生了变化需要重置对应的解码器,否则容易出现花屏。
3) 渲染出现了脏数据,主要就是还没有完成渲染的数据被送到了编码器编码,导致图像错位,或者撕裂等。
那么验证流媒体服务器的性能,保障流媒体的质量显的尤其重要。我们在网络上搜索流媒体压力测试时能看到基于srs-librtmp实现的srs-bench的开源工具,但是该工具在进行压力测试时看到的性能指标有限,只有数据包的时间长度和对应的大小和等待时间,这个无法客观的体现用户体验,并且该工具无法满足chunked的方式,测试场景受到很大的限制。
而华为云性能测试服务(CPTS)针对以上场景,针对以上测试场景的诉求,增强支持了可以兼容HLS和RTMP的流媒体压测能力,可进行端到端的压力测试,压测业务流量如下图所示:
CPTS利用执行机模拟大量并发用户的客户端向CDN或者源站发起请求,模拟拉流操作,CDN或者源站在收到请求后,会将响应报文返回至CPTS压测执行机,以HLS协议点播为例,CPTS压测执行机通过对CDN或者源站发起请求,得到m3u8索引文件,按序请求下载获取每一段ts数据流。解析对应的ts流,实时计算视频的帧率、码率、首包用时和首帧用时,之后还将利用异步线程模拟播放流媒体文件,识别视频是否出现卡顿和花屏,模拟CDN或者源站在高压力场景下,客户端收到视频流在实际播放过程中是否会产生的问题。
在视频场景上,支持点播和直播两种模式,并且大大丰富了针对视频播放的质量监控指标,可以动态获取视频压测时对应的视频首包用时、首帧用时、平均下载速度、码率、帧率、带宽等性能指标,下表为具体的流媒体性能测试指标,以及对应的参考值。
性能测试指标
实测效果:
下面我们利用CPTS对流媒体服务器进行压力测试,模拟200个用户同时观看直播对流媒体服务器带来的压力。
下图为对应的实时报告,首先查看是否存在错误信息,可以看到当200个用户对服务器进行并发访问时,存在12次的连接错误,说明服务端在当前压力下无法正常处理HLS直播链接,会导致这部分用户无法打开视频。
由上图可以看出该场景下,视频平均帧率为24fps,这是由于测试桩固定帧率为24fps,一般在视频的性能测试中,如果帧率小与24fps时用户能感知到视频卡顿;通过平均首包用时和平均首帧用时客观体现用户体验,如果平均首包用时小于1s,用户体验感较好;该测试结果为1.09s大于1s,用户体验一般;如果平均首帧用时小于1s时,用户体验感好,该测试结果为2.58s大于2.5秒,用户体验较差;因为码率的大小一定程度决定视频文件的清晰度、流畅度,码率越高,画质越好,所以测试报告中展现出码率的动态变化曲线;另外展示出上行带宽和下行带宽实时数据,查看网络状况。通过这些视频指标可快速对服务器能力进行评估。
通过CPTS能够快速的对流媒体进行压力测试,并将用户体验指标量化,直观的透过数据报告指标展示用户体验优劣。CPTS服务免去用户搭建环境的时间成本和人力成本,只需重点关注业务的开发及性能的提升,将性能测试化繁为简,畅享云端体验。