热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

如何针对海外不同地区进行音视频自动化测试?丨DevforDev专栏

如何,针对,海外,不同,地区,进行,音,视频,自动化,测试,丨,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

在海外,以印度新德里为例,使用当地的 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 开发者社区共同发起的开发者互动创新实践活动。

透过工程师视角的技术分享、交流碰撞、项目共建等多种形式,汇聚开发者的力量,挖掘和传递最具价值的技术内容和项目,全面释放技术的创造力。


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
author-avatar
Aaron Chen
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有