性能工具之 Jmeter 使用 HTTP 请求编写 HLS 脚本
前言
在上篇文章我们简要介绍了 HLS 协议的基础知识,接下来我们详细介绍一种使用 Jmeter 编写压测 HLS 协议脚本的方法。
编写脚本
由于 HLS 基于HTTP,因此 JMeter 可以轻松模拟拉流,这意味着我们很容易创建测试计划。正如上篇文章提到的那样,HLS 的工作原理是将媒体源拆分为小文件(ts),然后将其分发为播放列表格式(m3u8)。因此,基本上在获取播放列表后,可以循环播放内容并下载所有文件(拉流)。
这里演示主播放列表地址为:
- http://wowzaec2demo.streamlock.net/vod/definst/smil:streaming_tutorial/streaming_tutorial.smil/playlist.m3u8
获取一级索引文件
由于整个流被分成小段,这意味着,为了保留主播放列表文件(m3u8),我们必须首先完成初始 HTTP 请求(一个执行 GET 的简单 HTTP 采样器)。请注意,每个流可以有多个播放列表(即不同的视频分辨率)。
由于主播放列表的响应提供了一个块列表(即较小的二级播放列表),因此我们将使用正则表达式后处理器将它们全部收集到一个数组中:
获取二级索引文件
现在我们有了“块”数组,我们需要添加一个 If Controller
非空判断:
下一步主要为获取的媒体(ts文件)列表,以便我们的“浏览器”能够进一步接收媒体内容(拉流)。这需要创建另一个 HTTP 采样器:
由于二级播放列表的响应提供了一个块列表(即所有 ts 文件列表),因此我们将使用正则表达式后处理器将它们全部收集到一个数组中:
注意:
“Match No.’”中的“ -1” 值,表示 JMeter 能够找到与特定正则表达式匹配的所有字符串。
拉流
现在我们有了 ts 文件列表“块”数组,我们需要添加一个 foreach-controller
:
该控制器了解变量“块”是字符串列表。因此,它将每次迭代的当前值放入“块”变量中。
下一步涉及获取实际的流部分,以便我们的“浏览器”能够接收媒体内容。这需要创建另一个 HTTP 采样器:
这里为了达到顺序拉流的,使用了循环计算器来做标记:
整体测试计划
注意这里使用 ${__P(tokenSetOnCommandLine,something)}
硬编码全局变量赋值:
测试结果
执行的测试结果如下:
压测 HLS 视频流的逻辑其实非常简单,先下载一级索引,它里面记录了二级索引文件的地址,然后模拟浏览器再去下载二级索引文件,二级索引文件中又记录了 TS 文件的下载地址,这样模拟浏览器就可以按顺序下载 TS 流媒体文件并连续播放,俗称“拉流”。
小结
由于 HLS 依赖 HTTP 协议,因此它以与其他任何协议数据流几乎相同的方式流传输视频流。它提供了极大的灵活性,因为它允许我们使用基于原生的 HTTP 的工具来测试,开发和操作在线视频。阅读此文章后,希望你现在也可以看到使用 JMete 压测 HLS 其实并不复杂。
示例脚本:
- 点赞
- 收藏
- 关注作者
评论(0)