{"id":11571,"date":"2019-11-04T22:14:51","date_gmt":"2019-11-04T22:14:51","guid":{"rendered":"http:\/\/abstracta.us\/blog\/?p=11571"},"modified":"2025-05-05T21:23:10","modified_gmt":"2025-05-05T21:23:10","slug":"how-to-run-video-streaming-performance-tests-on-hls","status":"publish","type":"post","link":"https:\/\/abstracta.us\/blog\/software-testing\/how-to-run-video-streaming-performance-tests-on-hls\/","title":{"rendered":"How to Run Video Streaming Performance Tests with the HLS Plugin for JMeter"},"content":{"rendered":"<h1><span style=\"font-weight: 400;\">Using open source tools to stress test video streaming at scale<\/span><\/h1>\n<p><span style=\"font-weight: 400;\">In this post, I want to share something that we have been working on with <\/span><a href=\"https:\/\/www.blazemeter.com\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">BlazeMeter<\/span><\/a><span style=\"font-weight: 400;\"> for several years. In this project, we had the opportunity to contribute to the open source code of <\/span><a href=\"https:\/\/jmeter.apache.org\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">JMeter<\/span><\/a><span style=\"font-weight: 400;\">, making this load testing tool capable of simulating load in video transmission protocols and thus, be able to execute performance tests.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">As we have also been able to use this tool in some of our projects, we have some tips that will help you prepare and execute performance tests on HLS (the protocol that we\u2019re working on).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">I want to especially thank <\/span><a href=\"https:\/\/twitter.com\/rabelenda\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">Roger Abelenda<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><a href=\"https:\/\/twitter.com\/LAndresmartinez\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">Luis Mart\u00ednez<\/span><\/a><span style=\"font-weight: 400;\"> and <\/span><a href=\"https:\/\/www.linkedin.com\/in\/sebastianlorenzo88\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">Sebasti\u00e1n Lorenzo<\/span><\/a><span style=\"font-weight: 400;\"> from <\/span><a href=\"https:\/\/abstracta.us\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">Abstracta<\/span><\/a><span style=\"font-weight: 400;\"> for their contribution to this article. I hope this post can be useful, and serve as a guide for this practice.<\/span><\/p>\n<p><img decoding=\"async\" class=\"wp-image-11572 aligncenter\" src=\"http:\/\/abstracta.us\/wp-content\/uploads\/2019\/10\/Screen-Shot-2019-10-30-at-4.07.52-PM-min-1024x637.png\" alt=\"GOT Crash Meme\" width=\"600\" height=\"373\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Any type of system that will be used by multiple users, but in particular video streaming, needs to be tested to minimize any risk before launch. In the rest of the post, I will focus specifically on these tests.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">If you want to know more about when you should start performance testing, at what levels, with what load, etc, you can check out some of our other articles:\u00a0<\/span><\/p>\n<ul>\n<li><a href=\"https:\/\/abstracta.us\/blog\/performance-testing\/why-performance-testing-is-necessary\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">Why Performance Testing is Necessary<\/span><\/a><\/li>\n<li><a href=\"https:\/\/abstracta.us\/blog\/performance-testing\/best-time-start-performance-testing\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">When is the Best Time to Start Performance Testing?<\/span><\/a><\/li>\n<li><a href=\"https:\/\/abstracta.us\/blog\/performance-testing\/how-to-make-a-performance-test-plan\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">How to Make a Performance Test Plan<\/span><\/a><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Before beginning, remember that as in any performance test, we need to simulate the interaction between the client and the server, so in this case, we\u2019ll concentrate on the HLS (HTTP Live Streaming) protocol.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"How_does_the_HLS_protocol_work\"><\/span><strong><span style=\"color: #00b674;\">How does the HLS protocol work?<\/span><\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">You can find Apple&#8217;s explanation of the HLS protocol in <\/span><a href=\"https:\/\/developer.apple.com\/library\/archive\/referencelibrary\/GettingStarted\/AboutHTTPLiveStreaming\/about\/about.html\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">this article<\/span><\/a><span style=\"font-weight: 400;\">. Basically, the protocol has certain steps to follow, which I\u2019ll explain below. Although the protocol is designed for three variants,<\/span><b> On Demand<\/b><span style=\"font-weight: 400;\">, <\/span><b>Live<\/b><span style=\"font-weight: 400;\">, and <\/span><b>Event<\/b><span style=\"font-weight: 400;\">, I\u2019ll focus on the \u201cOn Demand\u201d example. Once you have understood one, it\u2019s very easy to understand the others.<\/span><\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-11573 aligncenter\" src=\"http:\/\/abstracta.us\/wp-content\/uploads\/2019\/10\/hls-protocol-1-min.png\" alt=\"the HLS protocol\" width=\"581\" height=\"651\" \/><\/p>\n<p>\u00a0<\/p>\n<h3><span class=\"ez-toc-section\" id=\"From_the_Server_Side_Encoder\"><\/span><strong><span style=\"color: #3056a2;\"><b>From the Server Side (Encoder)<\/b><\/span><\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">The audio or video that will be transmitted can be played at different levels of quality, bitrates and resolutions. Each version is called a &#8220;<\/span><b>variant<\/b><span style=\"font-weight: 400;\">.&#8221; So, on the server side we have different variants of the same video, with different resolutions. In the example seen in the image above, we have the same video in three variants, one in low resolution designed for a 3G connection (this is just an example to help understand the protocol better), another with better resolution for when the viewer is connected to WiFi, and a third variant with the highest resolution for when someone watches the video on an AppleTV (since this protocol was created by Apple, we will put this as the example).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The different variants are divided into small segments by the encoder (Media Segment Files). In other words, each video is going to be split into many pieces and saved in a \u201c.ts\u201d extension file.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The encoder creates a Media Playlist for each variant with the URLs of each segment. This would be like the index of the segment files, so that it\u2019s possible for the client to know how to assemble the video from all those segments.<\/span><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The encoder also creates a Master Playlist File with the URLs of each Media Playlist. This way, the client will know which variants are available (the available resolutions to download).<\/span><\/p>\n<h3><span class=\"ez-toc-section\" id=\"From_the_Client_Side_Video_or_Audio_Player\"><\/span><strong><span style=\"color: #3056a2;\"><b>From the\u00a0Client Side (Video or Audio Player)<\/b><\/span><\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">The Master Playlist is downloaded, and with it come the different Media Playlists with the variants (different video qualities, bitrates and resolutions), which contain the references to the segments and the corresponding videos.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The segments indicated by the Media Playlist are downloaded in real time and in the case of live video or event, the Media Playlist is downloaded periodically to check if there are new segments that have been added.<\/span><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Heres_the_Step-by-Step_Protocol\"><\/span><strong><span style=\"color: #3056a2;\"><b>Here&#8217;s the Step-by-Step Protocol<\/b><\/span><\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Below, you\u2019ll see how a message flow would be like, when playing a video from a browser. This is a simple example so you can see the step by step clearly and finally understand it.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">On the DemoBlaze site (<a href=\"https:\/\/www.demoblaze.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">www.demoblaze.com<\/a>), go to the \u00a8About us\u00a8 section, where you\u2019ll find a video. This is the URL: <\/span><a href=\"https:\/\/hls.demoblaze.com\/index.m3u8\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">https:\/\/hls.demoblaze.com\/index.m3u8<\/span><\/a><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">That is the Master Playlist. If you access that URL, an m3u8 extension file will be downloaded, whose content is as follows:<\/span><\/p>\n<blockquote>\n<p><span style=\"font-weight: 400;\">#EXTM3U<\/span><\/p>\n<p><span style=\"font-weight: 400;\">#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=8674000,RESOLUTION=1024&#215;576,CODECS=&#8221;avc1.4d001f,mp4a.40.2&#8243;<\/span><\/p>\n<p><span style=\"font-weight: 400;\">about_demo_hls_2M.m3u8<\/span><\/p>\n<p><span style=\"font-weight: 400;\">#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7633000,RESOLUTION=960&#215;540,CODECS=&#8221;avc1.4d001f,mp4a.40.2&#8243;<\/span><\/p>\n<p><span style=\"font-weight: 400;\">about_demo_hls_1-5M.m3u8<\/span><\/p>\n<p><span style=\"font-weight: 400;\">#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=3733000,RESOLUTION=640&#215;360,CODECS=&#8221;avc1.4d001f,mp4a.40.2&#8243;<\/span><\/p>\n<p><span style=\"font-weight: 400;\">about_demo_hls_1M.m3u8<\/span><\/p>\n<p><span style=\"font-weight: 400;\">#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2624000,RESOLUTION=480&#215;270,CODECS=&#8221;avc1.42001e,mp4a.40.2&#8243;<\/span><\/p>\n<p><span style=\"font-weight: 400;\">about_demo_hls_600k.m3u8<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-weight: 400;\">These are basically the descriptions of the variants. The player can automatically choose or give the user the possibility to indicate what type of variant he or she wants to download (a video in high resolution or one of low quality, which would be convenient if he or she has a bad internet connection). Imagine then that user chooses to download the lower quality option, which would be the last one (480 by 270 resolution). If you look at the Master Playlist file, the URL to the corresponding Media Playlist would be the following: <\/span><a href=\"https:\/\/hls.demoblaze.com\/about_demo_hls_600k.m3u8\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">https:\/\/hls.demoblaze.com\/about_demo_hls_600k.m3u8<\/span><\/a><span style=\"font-weight: 400;\"> and the content (trimmed) would be as follows:<\/span><\/p>\n<blockquote>\n<p><span style=\"font-weight: 400;\">#EXTM3U<\/span><\/p>\n<p><span style=\"font-weight: 400;\">#EXT-X-VERSION:3<\/span><\/p>\n<p><span style=\"font-weight: 400;\">#EXT-X-MEDIA-SEQUENCE:0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">#EXT-X-ALLOW-CACHE:YES<\/span><\/p>\n<p><span style=\"font-weight: 400;\">#EXT-X-TARGETDURATION:13<\/span><\/p>\n<p><span style=\"font-weight: 400;\">#EXTINF:12.046444,<\/span><\/p>\n<p><span style=\"font-weight: 400;\">about_demo_hls_600k00000.ts<\/span><\/p>\n<p><span style=\"font-weight: 400;\">#EXTINF:9.000000,<\/span><\/p>\n<p><span style=\"font-weight: 400;\">about_demo_hls_600k00001.ts<\/span><\/p>\n<p><span style=\"font-weight: 400;\">#EXTINF:9.000000,<\/span><\/p>\n<p><span style=\"font-weight: 400;\">about_demo_hls_600k00002.ts<\/span><\/p>\n<p><span style=\"font-weight: 400;\">#EXTINF:12.000000,<\/span><\/p>\n<p><span style=\"font-weight: 400;\">about_demo_hls_600k00003.ts<\/span><\/p>\n<p><span style=\"font-weight: 400;\">#EXTINF:9.000000,<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u2026<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u2026<\/span><\/p>\n<p><span style=\"font-weight: 400;\">&#8230;<\/span><\/p>\n<p><span style=\"font-weight: 400;\">about_demo_hls_600k00110.ts<\/span><\/p>\n<p><span style=\"font-weight: 400;\">#EXTINF:10.133333,<\/span><\/p>\n<p><span style=\"font-weight: 400;\">about_demo_hls_600k00111.ts<\/span><\/p>\n<p><span style=\"font-weight: 400;\">#EXT-X-ENDLIST<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-weight: 400;\">This contains the list of segments of a 13-second video. The client is the one who will ask for these segments one by one and will know what to do with them.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To see it, go to the \u201cAbout Us\u201d section of the Blazedemo site, then go to the Chrome developer tools (F12 key), and on the Network tab, filter with the following regular expression:<\/span><\/p>\n<blockquote>\n<p><span style=\"font-weight: 400;\">\/m3u8|\\.ts\/\u00a0<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-weight: 400;\">This way, you\u2019ll only see the requests to Master Playlists, Media Playlists (those ending in m3u8) and the segments (ts extensions).<\/span><\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-11574\" src=\"http:\/\/abstracta.us\/wp-content\/uploads\/2019\/10\/pngbase6419ecdf848beaf9aa-min-1024x732.png\" alt=\"demoblaze screencapture\" width=\"700\" height=\"501\" \/><\/p>\n<p>\u00a0<\/p>\n<h2><span class=\"ez-toc-section\" id=\"How_does_the_JMeter_Plugin_work\"><\/span><strong><span style=\"color: #00b674;\">How does the JMeter Plugin work?<\/span><\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">You can find a complete guide to HSL in the repository where the <\/span><a href=\"https:\/\/github.com\/Blazemeter\/HLSPlugin\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">plugin&#8217;s source code<\/span><\/a><span style=\"font-weight: 400;\"> is or in <\/span><a href=\"https:\/\/www.blazemeter.com\/blog\/the-new-hls-plugin-for-jmeter-the-complete-guide\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">this BlazeMeter blog post<\/span><\/a><span style=\"font-weight: 400;\"> written by Andres Favre, when he was part of our development team as a tester.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The plugin is very simple, there is only one request to the Master Playlist and then all the rest is automatic, just as a video player would be. It\u2019s not necessary to do all the requests separately or to parse the answers to see what requests should be made next. The protocol logic is encapsulated in a single JMeter Sampler.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">After installing the plugin, you just have to define the URL of the Master Playlist and then indicate some parameters to see which video you want to simulate its reproduction (the one that has the maximum quality, the minimum, a specific one, for how long, etc.).<\/span><\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-11575\" src=\"http:\/\/abstracta.us\/wp-content\/uploads\/2019\/10\/Screen-Shot-2019-09-05-at-10.05.04-AM-min.png\" alt=\"hls plugin screenshot\" width=\"700\" height=\"336\" \/><\/p>\n<p><span style=\"font-weight: 400;\">When running a test with this plugin, this is what the result would look like in JMeter:<\/span><\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-11578\" src=\"http:\/\/abstracta.us\/wp-content\/uploads\/2019\/10\/pasted-image-0-min-1024x580.png\" alt=\"pasted image 0-min\" width=\"700\" height=\"396\" \/><\/p>\n<p><span style=\"font-weight: 400;\">You can see that the first request is to the Master Playlist, the second to the Media Playlist (this depends on what we have configured in the sampler) and then the sequence of segments begins.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This is what the result would look like in BlazeMeter:<\/span><\/p>\n<h2><img decoding=\"async\" class=\"aligncenter wp-image-11577\" src=\"http:\/\/abstracta.us\/wp-content\/uploads\/2019\/10\/Screen-Shot-2019-09-05-at-11.10.05-AM-min-1024x473.png\" alt=\"Screen Shot 2019-09-05 at 11.10.05 AM-min\" width=\"700\" height=\"323\" \/><\/h2>\n<p><span style=\"font-weight: 400;\">Now that we covered how the HLS protocol and plugin work, here are some considerations to keep in mind when putting together and running our tests:<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"To_Keep_in_Mind_When_Defining_the_Script\"><\/span><strong><span style=\"color: #00b674;\">To Keep in Mind When Defining the Script<\/span><\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">You have to know what test you want to run and for that, it\u2019s important to think about the variables: how many concurrent users there will be, if there is a ramp-up, and if so, for how long, what flows over the system, different accesses, data that could vary, etc. It\u2019s also important to know what type of video you want to download, that is, an event, live or VOD (video on demand). In any case, you have the possibility to indicate the duration of the video you want to download, which will basically determine the duration of the test.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To assemble the script, you can follow a step-by-step sequence similar to the one I explained earlier in the Blazedemo example, although you can also use the Chrome extension to record scripts in JMeter and Taurus. Starting <\/span><a href=\"https:\/\/www.youtube.com\/watch?v=-KR1_eQmhQc&amp;feature=youtu.be&amp;t=673\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">11 minutes into this video<\/span><\/a><span style=\"font-weight: 400;\">, you can see how to use this extension.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">As always, it\u2019s essential to add assertions to these tests because it\u2019s not enough to check if the HTTP response code is correct (something that JMeter does automatically). It\u2019s better to add some validations to the answers to make sure you are getting what you expect. As there isn\u2019t much to do with the segments, since the content is binary, the content options that you can validate are only the content of the Master Playlist and Media Playlist.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Another thing that is extremely useful is using the HLS sampler within a transaction controller w<\/span><span style=\"font-weight: 400;\">hich allows you to obtain the response time of the entire execution and thus be able to compare the duration of the actual download and the video time that is requested to download.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Things_to_Remember_When_Defining_the_Scenario\"><\/span><strong><span style=\"color: #00b674;\">Things to Remember When Defining the Scenario<\/span><\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">If it\u2019s possible to access the video from different locations around the world, do the tests from different locations as well (Blazemeter allows you to easily configure the distribution of the tests from different places around the world).<\/span><\/li>\n<\/ul>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Try different scenarios, different user loads, peaks, and stress.<\/span><\/li>\n<\/ul>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Define if you want to simulate with or without HTTPS.<\/span><\/li>\n<\/ul>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Are there load balancers? Are <\/span><a href=\"http:\/\/abstracta.us\/blog\/performance-testing\/new-challenges-performance-engineers\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">CDNs<\/span><\/a><span style=\"font-weight: 400;\"> used? Our suggestion is to test with \u201cnothing in the middle\u201d and also test the entire infrastructure as it would be received by the user. For this, you probably need to leave the URL as a parameter in your script so that it\u2019s possible to configure from the execution in BlazeMeter which environment you want to stress.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">It\u2019s always important to calibrate the test. That is, to run several tests to determine how many VU (virtual users) it\u2019s possible to run from a single BlazeMeter engine, or from a single machine if you run the test locally. Typically JMeter can execute more than 500 threads from the same machine, but this depends a lot on the script, and of course, on the characteristics of the machine, so it\u2019s best to test it. It\u2019s also important to keep an eye on the health of the machines from where you run the test, since if they were to become saturated, the results wouldn\u2019t be reliable.\u00a0<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Important_Aspects_to_Consider_When_Viewing_and_Analyzing_the_Results\"><\/span><strong><span style=\"color: #00b674;\">Important Aspects to Consider When Viewing and Analyzing the Results<\/span><\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li><span style=\"font-weight: 400;\">If you set it to download 10 seconds of video, the total time of the sampler should be less than 10 seconds, otherwise<\/span><span style=\"font-weight: 400;\"> instances of cutting out could occur in the video when played by users. This is a simple way to verify if the video will have cut out or not.<\/span><\/li>\n<\/ul>\n<ul>\n<li><span style=\"font-weight: 400;\">It\u2019s important to control the response times of the segments and compare the results of different tests. If you run a test with few users, it will help you to see the response time of the segments in low load conditions and you\u2019ll be able to use those measures as a baseline.<\/span><\/li>\n<\/ul>\n<ul>\n<li><span style=\"font-weight: 400;\">Control the response times of the Media Playlists and Master Playlists.<\/span><\/li>\n<\/ul>\n<ul>\n<li><span style=\"font-weight: 400;\">While the test is playing, access the video as the real client (through the web or with a native app). If it\u2019s possible for several people to connect at the same time, more data will be obtained. There you will get the real user experience when the system is loading. We always use this strategy in performance tests, even in simpler cases, such as only accessing a web page. We usually call it the &#8220;witness user.&#8221; In video streaming applications, this strategy becomes much more important.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">At the end of <\/span><a href=\"https:\/\/www.blazemeter.com\/blog\/monitoring-ux-metrics-in-hls-load-testing-in-jmeter\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\">this post by Konstantine Firsanov<\/span><\/a><span style=\"font-weight: 400;\">, you\u2019ll find out how to add a post-processor to obtain certain metrics that will allow you to analyze the user experience when using the HLS Sampler.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Load_Testing_Streaming_Services_Just_Got_Easier\"><\/span><strong><span style=\"color: #00b674;\">Load Testing Streaming Services Just Got Easier\u00a0<\/span><\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">The HLS plugin for JMeter is an open source contribution we\u2019ve made thanks to the support of BlazeMeter. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Although our team continues to work on this project, all contributions are welcome! You can find this plugin and many more in BlazeMeter\u2019s<\/span><a href=\"https:\/\/github.com\/Blazemeter\/HLSPlugin\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400;\"> Github repository.<\/span><\/a><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Watch_this_HLS_Plugin_Webinar\"><\/span><strong><span style=\"color: #3056a2;\"><b>Watch this HLS Plugin Webinar<\/b><\/span><\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Our CTO, <\/span><span style=\"font-weight: 400;\"><a href=\"https:\/\/twitter.com\/rabelenda\">Roger Abelenda<\/a><\/span><span style=\"font-weight: 400;\">\u00a0(who helps work on our JMeter plugins development team), demonstrates the HLS plugin and shares some good practices to keep in mind when running performance tests on video streaming systems:<\/span><\/p>\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<iframe width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/SoEfwhkxJcU\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Recommended_for_You\"><\/span>Recommended for You<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><a href=\"https:\/\/abstracta.us\/why-us\/case-studies\/load-testing-video-streaming\">Case Study: Load Testing a Video Streaming Service for 85,000 Concurrent Viewers<\/a><br><a href=\"http:\/\/abstracta.us\/blog\/software-testing\/expert-roundup-software-testing-trends-2019\/\">Expert Roundup: Software Testing Trends 2019&nbsp;<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Using open source tools to stress test video streaming at scale In this post, I want to share something that we have been working on with BlazeMeter for several years. In this project, we had the opportunity to contribute to the open source code of&#8230;<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32,1],"tags":[87,50,111],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v14.0.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Run Video Streaming Performance Tests on HLS | Abstracta<\/title>\n<meta name=\"description\" content=\"Need to run video streaming performance tests at scale? Learn how to use the HLS plugin for JMeter to ensure a flawless viewer experience.\" \/>\n<meta name=\"robots\" content=\"index, follow\" \/>\n<meta name=\"googlebot\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta name=\"bingbot\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/abstracta.us\/blog\/performance-testing\/how-to-run-video-streaming-performance-tests-on-hls\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Run Video Streaming Performance Tests on HLS | Abstracta\" \/>\n<meta property=\"og:description\" content=\"Need to run video streaming performance tests at scale? Learn how to use the HLS plugin for JMeter to ensure a flawless viewer experience.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/abstracta.us\/blog\/performance-testing\/how-to-run-video-streaming-performance-tests-on-hls\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog about AI-powered quality engineering for teams building complex software | Abstracta\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/AbstractaQA\/\" \/>\n<meta property=\"article:published_time\" content=\"2019-11-04T22:14:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-05-05T21:23:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/abstracta.us\/wp-content\/uploads\/2019\/11\/video-streaming-1-min.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"560\" \/>\n\t<meta property=\"og:image:height\" content=\"315\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@fltoledo\" \/>\n<meta name=\"twitter:site\" content=\"@AbstractaUS\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/abstracta.us\/blog\/#website\",\"url\":\"https:\/\/abstracta.us\/blog\/\",\"name\":\"Blog about AI-powered quality engineering for teams building complex software | Abstracta\",\"description\":\"AI-powered quality engineering\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/abstracta.us\/blog\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/abstracta.us\/blog\/performance-testing\/how-to-run-video-streaming-performance-tests-on-hls\/#primaryimage\",\"inLanguage\":\"en-US\",\"url\":\"http:\/\/abstracta.us\/wp-content\/uploads\/2019\/10\/Screen-Shot-2019-10-30-at-4.07.52-PM-min-1024x637.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/abstracta.us\/blog\/performance-testing\/how-to-run-video-streaming-performance-tests-on-hls\/#webpage\",\"url\":\"https:\/\/abstracta.us\/blog\/performance-testing\/how-to-run-video-streaming-performance-tests-on-hls\/\",\"name\":\"How to Run Video Streaming Performance Tests on HLS | Abstracta\",\"isPartOf\":{\"@id\":\"https:\/\/abstracta.us\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/abstracta.us\/blog\/performance-testing\/how-to-run-video-streaming-performance-tests-on-hls\/#primaryimage\"},\"datePublished\":\"2019-11-04T22:14:51+00:00\",\"dateModified\":\"2025-05-05T21:23:10+00:00\",\"author\":{\"@id\":\"https:\/\/abstracta.us\/blog\/#\/schema\/person\/7421e539de0357d3adb0c69ed469a1c2\"},\"description\":\"Need to run video streaming performance tests at scale? Learn how to use the HLS plugin for JMeter to ensure a flawless viewer experience.\",\"breadcrumb\":{\"@id\":\"https:\/\/abstracta.us\/blog\/performance-testing\/how-to-run-video-streaming-performance-tests-on-hls\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/abstracta.us\/blog\/performance-testing\/how-to-run-video-streaming-performance-tests-on-hls\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/abstracta.us\/blog\/performance-testing\/how-to-run-video-streaming-performance-tests-on-hls\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/abstracta.us\/blog\/\",\"url\":\"https:\/\/abstracta.us\/blog\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/abstracta.us\/blog\/performance-testing\/\",\"url\":\"https:\/\/abstracta.us\/blog\/performance-testing\/\",\"name\":\"Performance Testing\"}},{\"@type\":\"ListItem\",\"position\":3,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/abstracta.us\/blog\/performance-testing\/how-to-run-video-streaming-performance-tests-on-hls\/\",\"url\":\"https:\/\/abstracta.us\/blog\/performance-testing\/how-to-run-video-streaming-performance-tests-on-hls\/\",\"name\":\"How to Run Video Streaming Performance Tests with the HLS Plugin for JMeter\"}}]},{\"@type\":[\"Person\"],\"@id\":\"https:\/\/abstracta.us\/blog\/#\/schema\/person\/7421e539de0357d3adb0c69ed469a1c2\",\"name\":\"Federico Toledo, Chief Quality Officer at Abstracta\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/abstracta.us\/blog\/#personlogo\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6de7ec6536c4028b5c02ad4ec1b9af0d?s=96&d=blank&r=g\",\"caption\":\"Federico Toledo, Chief Quality Officer at Abstracta\"},\"description\":\"Co-founder and COO of Abstracta\",\"sameAs\":[\"https:\/\/twitter.com\/fltoledo\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/posts\/11571"}],"collection":[{"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/comments?post=11571"}],"version-history":[{"count":27,"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/posts\/11571\/revisions"}],"predecessor-version":[{"id":13328,"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/posts\/11571\/revisions\/13328"}],"wp:attachment":[{"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/media?parent=11571"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/categories?post=11571"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/abstracta.us\/blog\/wp-json\/wp\/v2\/tags?post=11571"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}