如何针对海外不同地区进行音视频自动化测试?丨Dev for Dev 专栏
近年来由于全球性的新冠疫情,世界各地对实时音视频的需求猛增。不同国家和地区由于经济发展、国家政策等原因,网络环境有很大不同,如果要做好音视频体验,就需要分地域进行音视频指标测试。但是不论是外包,还是云测,都无法满足我们对质量的要求。
本文将介绍在当前新冠疫情下,声网是如何对海外不同地区进行音视频自动化测试,并获得可靠的指标结果。
本文为「Dev for Dev 专栏」系列内容,作者为声网音视频实验室 Android 开发工程师 胡大化。
01 传统音视频测试方法已不适用
以测视频延时为例,以前我们通常的做法是:首先找一个网络时钟,然后让发送端、接收端两台手机进行视频通话,并且用发送端手机拍摄这个时钟,然后接收端就看到网络时钟的画面。我们将网络时钟的时间,减去接收端手机显示的时钟时间,就是这一帧视频的延时。如图 1.1 所示:
■图1.1 当前帧延时为315ms
这种测试方法需要测试人员到现场去布置测试设备。然而在当前疫情环境下,很难派员工去海外出差进行实地场测。
02 为何不外包给海外测试团队?
你可能会想到既然不能派员工去海外出差,可不可找当地人帮忙,或者外包给当地专业的测试团队?
这种策略我们也考虑过。但音视频测试不同于一般的软件黑盒测试,在测试过程中实测用例很多,每个用例都要调不同的参数,外部测试团队很难达到我们平时测试时关注细节的程度,另外他们也不具备测试音视频所需要的专业知识。无法保证测试结果准确可靠。再者不同国家和地区由于语言时区等原因,协调的成本极高。
03 借助云测进行自动化测试
我们尝试使用云测供应商在海外不同地区部署的手机做测试,在这些手机安装测试程序,在国内通过远程桌面或自动化脚本控制手机进行音视频通话。
大的云测厂商如 Headspin 在国外几十个国家地区都有部署云测手机,但云测手机与真机不同,有很多限制:比如摄像头被遮住,就无法使用那些通过摄像头采集进行视频传输的测试用例了。因此我们需要设计一套不使用摄像头测音视频指标的方案。我们想到了通过自采集 YUV 视频的方式测试视频指标。
采用自采集 YUV 的方式,实现了两个云测手机之间视频传输,那怎么才能得到视频传输的性能指标呢?如延时、卡顿、码率、帧率等。使用 YUV 自采集的方式,没有独立的时钟源可以参考,测延时必须要解决两个手机对时问题。我们尝试通过 NTP 服务器或局域网对时两种方案。如果两个手机都在一个局域网下,通过局域网对时会非常精准,我们在本地实测两个手机之间交换数据包往返延时 rtt<10ms,而且在同一个局域网内上行和下行链路速度一样,那么实际对时偏差应该<2ms。这符合我们对精度的要求。
但是有的云测供应商两个手机之间无法通过局域网通信,比如 Headspin 就不可以。这时我们考虑用 NTP 方式对时。NTP 对时误差在几十毫秒,相比局域网大很多,如果超过 50ms,就会对我们测延时影响很大,我们希望对时偏差<50ms。如何做到这一点?通过查阅 NTP 官方文档得知,只要对时时 rtt 足够小,就可以实现。rtt 与对时偏差的关系如下图 1.2 所示(来源于 NTP 官网):
■图1.2 NTP 对时中 rtt 与对时偏差的关系
从上面可以看出,只要往返延时 rtt 控制 100ms 以内,对时偏差-10ms<offset<10ms,这样两个手机的对时偏差不会超过 20ms,符合我们的要求。实际环境下能否做到 rtt<100ms 呢?通过实测我们发现完全可以做到。在上海通过阿里云的 NT P服务器(ntp.aliyun.com)对时,rtt 在 30ms 左右,很少超过 60ms。
在海外,以印度新德里为例,使用当地的 NTP 服务器(time.nplindia.org)rtt 也容易在 30ms 以下。因此我们只要使用当地或距离比较近的 NTP 服务器对时,精度都可以满足要求。在程序实现时我们可以多次对时,取 rtt<100ms 时的最小值。
解决了对时问题后,需要知道视频帧的发送时间和接收到的时间。我们可以在发送端把发送时间画在视频帧上,接收端把当前时间以浮窗形式盖在接收到的视频帧上,对接收端录屏,录像后的每一帧都有发送时间和接收时间,通过AI识别出来后,就可以计算出这一帧的延时。如图 1.3 所示:
■图1.3 打上时间戳的视频传输
除了延时外,接下来要计算帧率、码率和卡顿率。
帧率的计算比较简单,对接收端录屏后的视频取每一帧,如果这一帧上的数字相比上一帧有变化,我们就认为是不同帧,计算出帧数除以时间就是帧率,码率的计算我们可以通过抓包使用 Wireshark 分析,在音视频通话中视频数据都是以 UDP 协议传输,通过 Wireshark 可以很明显的区分出来。
卡顿率与时间相关,通常我们计算 200ms、300ms、600ms 这几种情况下的卡顿率,计算也比较简单,以 200ms 为例,只要前后不同帧的间隔超过了 200ms,就认为是卡顿,卡顿数除以总帧数就是卡顿率。
04 其他测试方法
相比云测,是否有更简单的测试方案呢? 我们想到了想到借助 SDK 自身的统计信息,RTC 方案提供商都会在给外部使用的 SDK 中集成详细且全面的统计信息,我们可以通过回调形式拿到。例如,通过声网的onRtcStats(IRtcEngineEventHandler.RtcStats stats)回调可以实现获取当前通话的音视频指标信息,更详细信息,可访问声网文档中心(docs.agora.io/cn)搜索了解。当然这种方式在别的方案不可用时不失为一种参考。
以上仅是一家之言,音视频测试有很多种方案,说不定你已有更加准确高效的方法。欢迎在声网开发者社区 rtcdeveloper.agora.io 分享出来,我们一起交流,共同进步!
关于 Dev for Dev
Dev for Dev 专栏全称为 Developer for Developer,该专栏是声网与 RTC 开发者社区共同发起的开发者互动创新实践活动。
透过工程师视角的技术分享、交流碰撞、项目共建等多种形式,汇聚开发者的力量,挖掘和传递最具价值的技术内容和项目,全面释放技术的创造力。
如何针对海外不同地区进行音视频自动化测试?丨Dev for Dev 专栏的更多相关文章
- Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载
☞ ░ 前往老猿Python博文目录 ░ 一.简介 MoviePy是一个用于视频编辑的Python模块,可用于进行视频的基本操作(如剪切.拼接.标题插入).视频合成(也称非线性编辑).视频处理或创建高 ...
- 实时音视频互动系列(上):又拍云UTUN网络详解
如何定义实时音视频互动, 延迟 400ms 内才能无异步感 实时音视频互动如果存在1秒左右的延时会给交流者带来异步感,必须将视频播放延迟限制在400ms以内,才能给用户较好的交互体验. 当延迟控制在4 ...
- 融云携新版实时音视频亮相 LiveVideoStack 2019
4 月 19 日,LiveVideoStack 2019 音视频大会在上海隆重开幕,全球多媒体创新专家.音视频技术工程师.产品负责人.高端行业用户等共襄盛会,聚焦音频.视频.图像.AI 等技术的最新探 ...
- ZEGO音视频服务的高可用架构设计与运营
前言: ZEGO 即构科技作为一家实时音视频的提供商,系统稳定性直接影响用户的主观体验,如何保障服务高可用且用户体验最优是行业面临的挑战,本文结合实际业务场景进行思考,介绍 ZEGO 即构在高可用架构 ...
- Android IOS WebRTC 音视频开发总结(八十六)-- WebRTC中RTP/RTCP协议实现分析
本文主要介绍WebRTC中的RTP/RTCP协议,作者:weizhenwei ,文章最早发表在编风网,微信ID:befoio 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID ...
- Android IOS WebRTC 音视频开发总结(八十一)-- WebRTC靠谱吗?有没有适合的SDK推荐?
作者:blaker,最早发表在我们的微信公众和[编风网],详见[这里] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam 或 webrtcorgcn) ...
- android音视频点/直播模块开发
音视频 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能,那么作为开发一个小白, ...
- Android IOS WebRTC 音视频开发总结(七十)-- 移动端音视频技术优化的七个方向
最近直播很火,很多朋友对背后的技术比较感兴趣,所以今天我们整理一篇关于移动端视频优化的文章,这篇文章是我朋友在一个技术大会上分享过的,更多内容请关注我们的微信公众号:rtcblacker 视频直播为什 ...
- Android Audio控制和MediaButton远程控制(音视频控制配合)
使用过Android系统的朋友应该都知道,Android里面声音是区分好几种情况,每种情况下的音频大小是独立的.也就是说你调节了电话铃声大小不会影响多媒体播放的声音大小.这个涉及了AudioStrea ...
- Android IOS WebRTC 音视频开发总结(六五)-- 给韩国电信巨头做咨询
本文主要总结咨询过程中的一些问题,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam 韩国电信巨头sk想了解国内移动互联网rtc现状,所以上周请我过去给他们的相关人员 ...
随机推荐
- Linux非正式学习随笔(1)
11.5进linux学的第一件事,找个中文输入法.Linux是一套免费的类unix操作系统GPL:gnu通用公共许可证.托马斯斯托曼提出gnu计划,自由软件思想的一个协议.Linux诞生1991年10 ...
- ZSTUOJ刷题⑥:Problem 3535.--模拟简单计算器
3535: 模拟简单计算器 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 4634 Solved: 1652 Description 程序模拟简单运算器 ...
- Leetcode本地阅读器开发--01界面设计三
这篇文章主要写一下怎样实现定类别查找. 1 void Widget::on_comboBox_currentIndexChanged(int index) 2 { 3 QString sortname ...
- .netcore 跨域问题
CORS(跨域资源共享)是一种W3C标准,允许服务器放宽同源策略.使用CORS,服务器可以在显式允许某些跨域请求时拒绝其他跨域请求.CORS是相比其他跨域技术(比如JSONP)更安全.更灵活. ASP ...
- org.apache.catalina.LifecycleException: Error in resourceStart()
ssh项目,tomcat7,又一个月没运行这个项目,再次运行就给我报tomcat7无法启动错误.看了其他博客基本分为三类: 1.情work目录的,https://blog.csdn.net/iteye ...
- PHP Redis - 事务
Redis 事务可以一次执行多个命令, 并有两个重要的保证: ① 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. ② ...
- 在开启hadoop时候报错:localhost: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
此时 ssh localhost也会失败 原因是秘钥没有给自己, 运行ssh-copy-id -i ~/.ssh/id_rsa.pub root@localhost 即可解决.
- 【loguru】Python简单的日志管理模块
简介 在部署一些定时运行或者长期运行的任务时,为了留存一些导致程序出现异常或错误的信息,通常会才用日志的方式来进行记录这些信息. 在 Python 中用到日志记录,那就不可避免地会用到内置的 logg ...
- Callable、Future、FutureTash详解
Callable.Future.FutureTash详解 Callable与Future是在JAVA的后续版本中引入进来的,Callable类似于Runnable接口,实现Callable接 口的类与 ...
- vue创建项目的命令
一.首先下载node环境 二.全局安装vue-cli cnpm i -g @vue/cli 这里一定要注意是vue/cli,而不是vue-cli 三.新建文件夹,打开cmd命令 1.vue creat ...