DEV Community

smail hachami
smail hachami

Posted on

How We Built a 72-Hour IPTV Stress Test Rig: A Developer's Deep Dive

The Problem

Every IPTV "review" you find online was written by someone who watched Netflix
for 20 minutes and called it a benchmark. We decided to do it properly.

Here's a complete walkthrough of how we built and ran a 72-hour automated
stress test rig for evaluating IPTV provider infrastructure.

The Rig

Our test environment consists of three layers:

Layer 1: Client Devices (3 simultaneous)

DEVICES = [
    {"name": "Firestick 4K Max", "resolution": "3840x2160", "player": "MX Player"},
    {"name": "Nvidia Shield Pro", "resolution": "3840x2160", "player": "TiviMate"},
    {"name": "Chrome Browser", "resolution": "1920x1080", "player": "HLS.js v1.5"},
]
Enter fullscreen mode Exit fullscreen mode

Layer 2: Network Measurement

# Packet capture on the reference interface
tcpdump -i eth0 -w capture_$(date +%H%M).pcap &
TCPDUMP_PID=$!

# Real-time bitrate calculation from capture
tshark -r capture_$(date +%H%M).pcap   -q -z io,stat,1   -Y "tcp.port == 443"   | python3 parse_bitrate.py --output metrics/bitrate.json
Enter fullscreen mode Exit fullscreen mode

Layer 3: Automated Channel Switching

import time, random, subprocess
from datetime import datetime

CHANNELS = ["ESPN", "SkySports1", "TSN1", "FoxLeague", "BeIn1"]

def automated_zap_test(duration_minutes=60, interval_seconds=90):
    results = []
    end_time = time.time() + (duration_minutes * 60)
    while time.time() < end_time:
        channel = random.choice(CHANNELS)
        start = time.time()
        switch_channel(channel)  # ADB command to player
        wait_for_playback()      # Poll player for stream-started event
        zap_ms = (time.time() - start) * 1000
        results.append({"channel": channel, "zap_ms": round(zap_ms)})
        time.sleep(interval_seconds)
    return results
Enter fullscreen mode Exit fullscreen mode

The Peak Load Windows

We specifically timed our 72 hours to overlap:

  1. NFL Sunday (US, 4–11 PM ET) — highest US concurrent viewer load
  2. Premier League Saturday (UK, 12:30–5:30 PM GMT) — highest UK load
  3. NHL Playoff Overtime — unpredictable duration, maximum CDN stress
  4. NRL Round (Australia, 7:30 PM AEST) — highest AU concurrent load

Key Finding

The metric that best predicted overall performance quality was CDN PoP
proximity
— the physical distance from the test location to the nearest
confirmed CDN edge node. Providers with edge nodes within 100km consistently
delivered < 0.3% frame drop rate. Those routing traffic transnationally
averaged 2.1% frame drop.

Full Results

All 20 providers, all 72 hours of data:

→ Read the Complete Benchmark Report

Takeaway for Developers

If you're building tooling around IPTV quality measurement:

  • Measure at the network interface, not the player
  • Use packet capture, not ISP speed tests
  • Always test during a live sports fixture — never off-peak

Tooling and methodology available on request.

Top comments (0)