https://github.com/clarkzjw/mmsys24-starlink-livestreaming
Low-Latency Live Video Streaming over a Low-Earth-Orbit Satellite Network with DASH
Science Score: 36.0%
This score indicates how likely this project is to be science-related based on various indicators:
-
○CITATION.cff file
-
✓codemeta.json file
Found codemeta.json file -
○.zenodo.json file
-
✓DOI references
Found 5 DOI reference(s) in README -
✓Academic publication links
Links to: acm.org -
○Academic email domains
-
○Institutional organization owner
-
○JOSS paper metadata
-
○Scientific vocabulary similarity
Low similarity (7.3%) to scientific vocabulary
Repository
Low-Latency Live Video Streaming over a Low-Earth-Orbit Satellite Network with DASH
Basic Info
Statistics
- Stars: 2
- Watchers: 4
- Forks: 1
- Open Issues: 0
- Releases: 0
Metadata Files
README.md
MMSys'24 Artifact "Low-Latency Live Video Streaming over a Low-Earth-Orbit Satellite Network with DASH"
This repository contains the implementation and artifacts for the paper Low-Latency Live Video Streaming over a Low-Earth-Orbit Satellite Network with DASH published in ACM MMSys'24.
We received the DASH-IF Excellence in DASH Award Third Place at MMSys'24
Table of Contents
- Repository structure
- Prerequisites
- Re-generate paper results
- Emulation
- Real world experiments
- Extensions
- License
Repository structure
├── assets # figures for README.md
├── dash.js # git submodule for the modified dash.js player
├── docker-compose-emulation.yaml # docker compose file for network emulation
├── docker-compose-server.yaml # docker compose file for the media server in real world experiments
├── docker-compose.yaml # docker compose file for the streaming client in real world experiments
├── Dockerfile-dashjs # Dockerfile to build custom dash.js
├── Dockerfile-livesim2 # Dockerfile to build livesim2
├── Dockerfile-nginx # Dockerfile to build nginx
├── Dockerfile-nginx-emulation # Dockerfile to build nginx with traffic shaper in network emulation
├── Dockerfile-runner # Dockerfile to build experiment runner
├── etc # nginx config files
├── experiments # experiment config files
├── livesim2 # git submodule for livesim2
├── paper-data # git submodule for the data used to generate figures in the paper
├── poetry.lock
├── pyproject.toml
├── README.md
├── runner # experiment scheduler and runner
├── shaper # config files for the traffic shaper in network emulation
├── stats-server # backend server to store playback metrics
├── terraform # Terraform template to provision VM on GCP
└── webassembly # Dockerfile to build custom pyodide WebAssembly Python runtime
Prerequisites
Any system capable of running recent versions of Docker and Docker Compose should suffice. The results of this paper were produced on Debian 12.5 x86-64 with Docker version 25.0.3 and the Compose plugin version 2.24.5. However, the Compose standalone should also work.
To install Docker and Docker compose plugin on a recent Linux distribution, you can use the following automated installation script.
bash
curl -fsSL https://get.docker.com | sh
This repository features three distinct levels of reproducibilities.
Re-generate paper results
To re-generate the figures in the paper, you can either follow the following steps or directly use the code capsule on Code Ocean at DOI: 10.24433/CO.7355266.v1.
Clone this repository.
bash
git clone https://github.com/clarkzjw/mmsys24-starlink-livestreaming.git
git submodule update --init --recursive
In the root directory of this repository, run
bash
sudo docker run --rm -v ${PWD}/paper-data/data:/data -v ${PWD}/paper-figures:/app/src/figures -it clarkzjw/mmsys24-reproducibility
After the command finishes, the figures in the paper will be generated in the paper-figures folder.
Emulation
The topology for our network emulator is shown as follows.

To conduct video streaming using our purpose-built network emulator, please follow the following steps.
- Apply file watch limit adjustment on the Linux machine used to run emulations
bash
echo fs.inotify.max_user_watches= 131070 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
- Pull Docker images used in emulation.
bash
sudo docker compose -f docker-compose-emulation.yaml pull
The default experiments/batch-emulation.json file used for our emulation needs 13.3 hours to complete (
300seconds in each round x10rounds per setting x4latency targets x4algorithms). You can update the experiment parameters in the experiments/batch-emulation.json file accordingly by changing the values ofROUND_DURATIONandTOTAL_ROUNDS.Start video streaming emulation with Docker Compose.
bash
sudo docker compose -f docker-compose-emulation.yaml up -d
- A convenience container is available to display the video streaming browser output using noVNC. This can be accessed by navigating to
http://<host-ip>:7900/?autoconnect=1&resize=scale&password=secretin a web browser, where<host-ip>represents the IP address of the Linux machine on which the emulation takes place. The video streaming browser output is recorded for visual inspection.
You can disable the creation of this convenience container by setting the VIDEO environment variable to 0 in docker-compose-emulation.yaml.
- You can check the experiment running process and logs by
bash
sudo docker logs -f dashjs-runner
where the expected execuation time for the entire experiment set will be printed.
bash
[...]
2024-03-06 09:18:46.937 INFO batch_runner - <module>: Total experiment count: 160, duration: 48000 seconds (13.333333333333334 hours)
[...]
- When video streaming emulation finishes,
dashjs-runnercontainer will output the following log and exit.
bash
[...]
2024-03-06 08:54:46.489 INFO batch_runner - <module>: Video Streaming completed.
The raw data will be available in the figures-emulation folder.
- Then, you can use the similar command as in Re-generate paper results to generate the figures.
Note: The figure generation scripts in the clarkzjw/mmsys24-reproducibility Docker image only support three different experiment scenario names within the ${PWD}/figures directory, i.e., emulation, starlink and terrestrial. You can copy our results for starlink and terrestrial from paper-data/data to your figures directory and generate figures for evaluation and comparison.
bash
sudo docker run --rm -v ${PWD}/figures-emulation:/data -v ${PWD}/paper-figures:/app/src/figures -it clarkzjw/mmsys24-reproducibility
- After finishing the emulation, you can cleanup the resources by
bash
sudo docker compose -f docker-compose-emulation.yaml down
Real world experiments
The topology for our real world experiment is shown as follows.

To conduct video streaming over real networks, please follow the following steps.
Note
The results for the "Starlink" and "Terrestrial" scenarios in the paper are generated with a media server VM provisioned at the Google Cloud Platform (GCP). A Terraform template is provided to provision VM on GCP. However, if you are using other cloud providers to provision VM as a media server or you are using local servers, you can manually install the required softwares by running the commands in cloud-config.yaml and jump to Media VM Setup.
Install Terraform
https://developer.hashicorp.com/terraform/install
Install gcloud CLI
https://cloud.google.com/sdk/docs/install
Run gcloud init to authenticate.
Provision VM on GCP with Terraform
Edit
terraform.tfvars, updategcp_project_idandssh_public_key.Run
terraform initto initialize Terraform, installing Terraform providers.Run
gcloud auth application-default loginto obtain the GCP credentials for Terraform.Finally, run
terraform planandterraform applyto provision VM on GCP, the public IP address for the VM will be printed on the terminal.SSH login to the new VM, wait until
/var/log/cloud-init-output.logis finished.
```bash [...]
Cloud-init v. 23.1.2-0ubuntu0~23.04.1 finished at Fri, 08 Dec 2023 23:20:04 +0000. Datasource DataSourceGCELocal. Up 1117.00 seconds ```
Media VM Setup
- Apply File Watch Limit adjustment
bash
echo fs.inotify.max_user_watches= 131070 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
- Apply UDP buffer size adjustments
https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes
bash
sudo sysctl -w net.core.rmem_max=2500000
sudo sysctl -w net.core.wmem_max=2500000
For real world experiments, deploy live video streaming media server on the VM by
bash
sudo docker compose -f docker-compose-server.yaml pull
sudo docker compose -f docker-compose-server.yaml up -d
- The MPD file will be retrieved at
https://<ip-or-domain-of-the-media-server>/livesim2/vectors/switching_sets/12.5_25_50/ss1/2023-04-28/stream.mpd
[Optional] If you want to check the MPD locally in your browser with dash.js example player, you might want to visit the URL once to acknowledge the insecure HTTPS warning, before putting the MPD URL in the
Manifest URL.Update
experiments/batch-experiment.jsonwith the new MPD_URL by replacing<ip-or-domain-of-the-media-server>.The following steps are similar to network emulation, but you need to replace
docker-compose-emulation.yamlwithdocker-compose.yamlin the command.
Extensions
Custom video dataset
To replace the default bitrate ladder and use custom video datasets, replace and update the following lines in Dockerfile-livesim2 accordingly,
```Dockerfile
RUN ./dashfetcher -a https://dash.akamaized.net/WAVE/vectors/switchingsets/12.525_50/ss1/2023-04-28/stream.mpd
COPY stream.mpd /livesim2/WAVE/vectors/switchingsets/12.525_50/ss1/2023-04-28/
RUN cd /livesim2/WAVE/vectors && mv cfhdsets chdfsets switchingsets/12.525_50/ss1/2023-04-28/
RUN wget https://starlink-dash-live.jinwei.me/WAVE.zip && unzip WAVE.zip && rm WAVE.zip ```
and rebuild the livesim2 Docker image and replace the image used by the livesim2 service in the corresponding docker-compose.yaml file.
License
The code in this repository is licensed under GPL-3.0.
Owner
- Name: Jinwei Zhao
- Login: clarkzjw
- Kind: user
- Location: Victoria, BC, Canada
- Company: University of Victoria
- Website: https://jinwei.me
- Repositories: 26
- Profile: https://github.com/clarkzjw
PGP: 0x7E1EB1851D017D3D
GitHub Events
Total
- Issues event: 3
- Watch event: 8
- Issue comment event: 5
Last Year
- Issues event: 3
- Watch event: 8
- Issue comment event: 5
Issues and Pull Requests
Last synced: 10 months ago
All Time
- Total issues: 2
- Total pull requests: 0
- Average time to close issues: 8 days
- Average time to close pull requests: N/A
- Total issue authors: 2
- Total pull request authors: 0
- Average comments per issue: 0.5
- Average comments per pull request: 0
- Merged pull requests: 0
- Bot issues: 0
- Bot pull requests: 0
Past Year
- Issues: 2
- Pull requests: 0
- Average time to close issues: 8 days
- Average time to close pull requests: N/A
- Issue authors: 2
- Pull request authors: 0
- Average comments per issue: 0.5
- Average comments per pull request: 0
- Merged pull requests: 0
- Bot issues: 0
- Bot pull requests: 0
Top Authors
Issue Authors
- wujingdanzeng (1)
Pull Request Authors
- clarkzjw (2)
Top Labels
Issue Labels
Pull Request Labels
Dependencies
- actions/checkout v3 composite
- docker/build-push-action v4 composite
- docker/login-action v2 composite
- docker/setup-buildx-action v2 composite
- docker/setup-qemu-action v2 composite
- python 3.11.4 build
- nginx alpine build
- python 3 build
- 115 dependencies
- jupyterlab ^4.0.9 develop
- docker ^7.0.0
- flask ^3.0.0
- matplotlib ^3.8.2
- numpy ^1.26.2
- pymongo ^4.6.1
- python ^3.11
- pytz ^2023.3.post1
- selenium ^4.16.0
- Flask ==2.3.2
- Flask-Cors ==4.0.0
- Flask-Login ==0.6.2
- Flask-Session ==0.5.0
- Flask-SocketIO ==5.3.4
- Jinja2 ==3.1.2
- MarkupSafe ==2.1.3
- Pillow ==10.0.0
- PySocks ==1.7.1
- Werkzeug ==2.3.6
- attrs ==23.1.0
- bidict ==0.22.1
- blinker ==1.6.2
- cachelib ==0.10.2
- certifi ==2023.5.7
- click ==8.1.3
- contourpy ==1.1.0
- cycler ==0.11.0
- dnspython ==2.3.0
- exceptiongroup ==1.1.1
- fonttools ==4.40.0
- h11 ==0.14.0
- idna ==3.4
- itsdangerous ==2.1.2
- kiwisolver ==1.4.4
- matplotlib ==3.7.1
- numpy ==1.25.0
- outcome ==1.2.0
- packaging ==23.1
- pymongo ==4.4.0
- pyparsing ==3.1.0
- python-dateutil ==2.8.2
- python-engineio ==4.4.1
- python-socketio ==5.8.0
- pytz ==2023.3
- schedule ==1.2.0
- selenium ==4.10.0
- six ==1.16.0
- sniffio ==1.3.0
- sortedcontainers ==2.4.0
- trio ==0.22.1
- trio-websocket ==0.10.3
- urllib3 ==2.0.3
- wsproto ==1.2.0