【腾讯TMQ】如何从海量用户中轻松定位H5视频播放器问题?

2024-04-14 04:48

本文主要是介绍【腾讯TMQ】如何从海量用户中轻松定位H5视频播放器问题?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:赵六四

一、方案背景介绍

随着互联网技术的发展,用户使用QQ浏览器进行上网观看视频越来越多,最近统计目前使用QQ浏览器观看视频已经过亿。不同的用户由于不同的场景下播放不同的网站的视频源,可能会出现播放失败的情况,而这些失败的播放数据会通过数据上报系统上报至运营后台,将后台拉取数据并经过一定的分析,就能得到播放失败的网站、机型、时间、网络状态等信息,下图是最近后台统计的播放失败率最高的几个视频网站,如下图所示:

当然播放失败可能有多种原因而导致的,例如:浏览器对该种类型的网络视频不兼容、网络视频本身出现问题、用户网络环境的原因 等等。所以需要一种快捷准确的方案,能从成千上万用户的播放失败的源中找出是由于播放器或者是代码导致的问题。在这种情况下,引入了视频播放器问题定位方案。

二、实现总体框架

通过获取到一个用户的失败视频源后,验证是否播放器兼容的问题,目前主要有2种方式:

方案一:直接用播放失败的源在浏览器版本进行调试分析,这种方案是最准确,但是耗时比较大,主要因为播放失败并非是播放器的原因,例如:源的问题等。

方案二:先用我们自己产品验证一下,如果确实播放失败,再在第三方产品上也验证一下,如果第三方播放是正常的。很明显的这个应该是自己产品的存在问题。但是这种方案相对来说准确性没有方案一高(不排除第三方产品也有这个问题),相对于来说比较省时,有效。

基于上述2种方案的讨论,视频播放器问题定位方案的实现是基于方案二的基础上实现的,整个设计的总体框架如下:

对于整个框架的设计图,这里做一个简单的解释,当测试者启动测试脚本的以后,自动化脚本需要完成以下步骤:

    1. 从服务器上拉取用户播放失败的片源。
    1. 启动QQ浏览器监控,主要记录视频播放过程中的监控信息,包括日志、CPU、内存、截图等。
    1. 在QQ浏览器验证当前片源是否可以播放,然后关闭QQ浏览器监控。如果可以播放,跳过步
    1. 如果QQ浏览器播放失败,分别在UC浏览器和Chrome浏览器验证视频播放。
    1. 如果QQ浏览器播放正常,同步服务器更新验证QQ浏览器测试结果;如果QQ浏览器播放失败,而第三方APP播放正常,不仅要同步服务器更新验证结果,还要上传QQ浏览器播放过程中监控信息到服务器上。
    1. 测试者通过服务器预览真机验证的测试结果和获取监控信息。

三、HTML 5 视频介绍

前面介绍框架中涉及QQ浏览器、UC浏览器、Chrome浏览器视频播放验证的,为了更加清楚了解验证视频可播放性的原理,首先我们来认识一下HTML5视频(简称H5视频)的的HTML的一些特性,我们先看一个简单例子:
<video width="500" height="250" controls="controls" src="movie.ogg" />

从上面例子可以看出,H5视频就是在视频页面中增加一个video 元素和给这个video标签增加一些属性组成。简单介绍基本相关video标签的属性和H5的属性和方法:

部分属性:

部分属性和方法:

从这个例子中,我们可以看出以下几点:

  • 首先,如果视频页面没有HTML页面如果没提供VIDEO标签,肯定是不支持H5视频的播放,所以这种视频的URL是无效的,也是不可播放的。
  • 其次,在用户点击播放按钮后,video标签的src 属性,如果为空或者无效,说明当前播放视频片源有问题,这种视频也是播放失败的(注:现在部分视频网站点击播放后,video的src属性才能加载显示)。
  • 最后,当视频播放器被调起,从video标签的current和duration 属性中获取当前时长和总时长来判断视频是否播放成功。

四、实现基本原理

基于前面基本设计框架和H5视频的相关知识,这里分别讨论一下自动化测试脚本对于QQ浏览器、UC浏览器、Chrome浏览器如何实现可播放性的验证?具体如下:

1. QQ浏览器可播放性验证

QQ浏览器是我们自己的产品,获取浏览器内核只用通过浏览器代码一个静态函数就可以搞定,再结合Android 的robertium自动化框架,注入视频相关的javascript脚本(下简称JS脚本),可以实现浏览器的播放视频验证操作,具体流程实现如下:

2. UC浏览器可播放性验证

UC作为我们的商友,但是我们没有UC源码,实现自动化播放视频难度比较高。不过我们通过阅读UC浏览器官网发现,UC为了外部开发者方便用UC浏览器调试网页,官网上提供了一个UC浏览器开发者版本,具体请参考:http://plus.uc.cn/document/webapp/doc5.html仔细阅读UC文档,PC的Chrome浏览器连接手机的UC浏览器开发版调试发现,他们主要通过javascript的Websocket协议通讯来实现的。为了能在手机端通过脚本控制UC浏览器,这里在脚本中模拟PC端websocket协议完成和UC浏览器的通讯,主要的关键点如下:

1)初始化websocket

前面提到PC端的chrome浏览器和UC浏览器交互通过Websocket协议实现,在它们通讯之前,需要完成Websocket相关初始化,按照下列步骤可以实现java代码模拟webscoket初始化。

步骤1:在PC的Chrome浏览器打开UC动态调试页面,然后在Inspector.js 中websocket初始化增加一个断点,如图所示:

步骤2:刷新一下chrome 页面连接UC浏览器调试页面后,websocket创建断点将被触发,然后观察websocket初始化的参数,如图所示:

步骤3:从步骤2图片中可以看出,在websocket初始化中是“ws://localhost:9998/devtools/page/0”,其中0 代表打开页面的num数。为了方便在脚本中完成websocket协议初始化工作,需要借助于开源库xlightweb(实现websocket协议库)完成websocket初始化,具体代码实现如下:

2)发送websocket消息

在chrome浏览器调试UC浏览器页面时, 涉及到Chrome浏览器操作都是通过websocket协议传递UC浏览器,然后UC浏览器根据相应消息参数来处理相关的操作。通过调试JS代码,再按照下列的步骤可以实现java脚本模拟websoket发送消息,具体步骤如下:

步骤1:首先了解在chrome浏览器页面操作给UC浏览器发送的消息,同理在Chrome浏览器的inspectorBackend.js中发送给手机消息端下一个断点,如图:

步骤2:为了观察消息的发送传递参数,先在Chrome的控制台中向手机UC浏览器发送一个javscript脚本(例如:alert(1)) 断点将被触发,发送给UC的消息参数如下:

图中可以看出发送的消息参数是一个json数据,数据格式如下:
{"method":"Runtime.evaluate","params":{"expression":"alert(1)","objectGroup":"console","includeCommandLineAPI":true,"doNotPauseOnExceptions":false,"frameId":"0.1","returnByValue":false},"id":26}
其中expression的值就是我们从chrome的发送的JS脚本。

步骤3:在脚本利用开源xlightweb库模拟websocket发送的消息,代码实现如下:

这里TextMessage是xlightweb库定义Websocket发送消息的一个Message,然后通过writemessage方法把消息发送出去。

3)接受Websocket消息

当UC浏览器处理了chrome浏览器的消息后,对处理的结果需要返回给Chrome浏览器,具体的消息接受也可以通过断点的方式进行调试。但是这个部分对于xlightweb库来说已经帮实现好了,只要重载IwebsoketHandle接口的onMessage方法就可以了,具体的代码实现如下:

代码逻辑很简单,获取消息只要通过创建的websocket 连接的readTextMessage就可以实现,但是注意的读取的Message也是一个json的数据,需要通过解析才能获取获取UC浏览器的处理结果。

4)总结

前面通过chrome浏览器调试和结合开源xlightweb库实现和UC浏览器的websocket的初始化、发送消息、接受消息,然后讲解了脚本中具体的代码实现原理。随后可以利用websocket和UC浏览器连接发送消息方式,注入我们自定义关于视频播放的相关脚本,通过脚本中自定义的HTML5的相关函数就可以控制UC内核播放视频。具体流程图如下:

3. Chrome浏览器可播放性验证

Chrome是一个由Google(谷歌)公司开发的网页浏览器。该浏览器是基于其他开源软件所撰写,包括WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面,而且在Chrome浏览器地址栏中输入JS脚本,浏览器内核也可以执行这段脚本,下面是在浏览器地址栏输入一段JS脚本,测试浏览器的执行效果,如图所示:

通过上图可以发现,只要通过Chrome地址栏同样也可以完成JS脚本注入来控制浏览器的内核,为了完成Chrome浏览器可播放性的验证,这里还需要google的开源UIAutomator自动化框架来帮助实现,具体实现步骤如下:

步骤1: 利用Andorid 开源UIAutomator获取的Chrome的地址栏的控件,如图:

步骤2:获取到地址栏后,再通过UIAutomator加载自定义关于视频播放的相关JS脚本代码实现如下:

步骤3:成功注入自定义JS代码后,同样在地址栏中调用自定义JS脚本的相关视频函数可以实现视频的播放和获取播放时间,具体chrome浏览器验证视频播放流程如下:

五、测试结果与展望

目前脚本开发完成也有一个多月时间了。自动化脚本上线后,也有一定收益。下面是最近一段时间通过运行这套方案取得的成果:

问题1:播放过程中出现硬解切换软解的问题

根本原因:当前硬解切换软解后,需要reset中清除了updatesurfaceListener而导致的。

解决方案:切换时,不清除updatesurfaceListener。

问题2:文件句柄泄漏的问题

根本原因:下载模块公共问题,当启动下载模块后,downloadmanager启动下载句柄,当下载任务完成后,该句柄不能释放而导致内存泄漏,当达到1024 句柄后,浏览器会Crash.

解决方案:下载任务完成后,downloadmanager释放文件句柄。

问题3:ku6网站少量片源m3u8视频源不规范的问题。

根本原因: 获取的视频裸地址是.m3u8格式的,播放解析的m3u8文件后,里面文件不是ts类型,而是mp4类型。

解决方案:量比较少,而且不符合m3u8规范,目前未解决。

但是目前从每天自动化结果看,能够检测到少量片源仍然在QQ浏览器播放失败,但是在第三方浏览器播放成功的情况。这些都是概率性非常低问题,导致这样问题可能有多方面因素引起的,所以更需要这样的工具来反复验证定位,同时工具记录了播放视频失败源的详细监控信息,结合这些监控的信息再商讨如何解决这类问题。所以后面计划中,需要和开发深度合作,在这三个大方向进行深度优化,以提高工具的实用性:

  • a.)后台上报的失败视频源分类更详细,

  • b.)测试浏览器版本的log上级别更高,

  • c).脚本对于记录失败的场景更加详细和准确,

有些了此类强大的工具以及更加丰富、更有价值的信息,相信会有非常不错的收益。

本章完~~

本文连接:[http://tmq.qq.com/2016/07/it-is-necessary-to-know-the-background-performance-test/](http://tmq.qq.com/2016/07/it-is-necessary-to-know-the-background-performance-test/)


TMQ(腾讯移动品质中心)是腾讯最早专注在移动APP测试的团队
我们专注于移动测试技术精华,饱含腾讯多款亿级APP的品质秘密,文章皆独家原创,我们不谈虚的,只谈干货!

扫码关注我们

扫一扫 关注TMQ
精彩分享不断

这篇关于【腾讯TMQ】如何从海量用户中轻松定位H5视频播放器问题?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/902103

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)