Setting up HLS streaming using ffmpeg utility on Docker
install Docker Engine - Community and Docker Compose as described here
create the /etc/docker/hls/docker-compose.yml file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | version: '3.8' networks: default: ipam: config: - subnet: 192.168.199.0/24 services: hls: build: context: . container_name: hls volumes: - /var/lib/video:/video tmpfs: - /usr/local/apache2/htdocs networks: - default ports: - 80:80 environment: - URL_PREFIX=http://hls.domain.lan - PLAYLIST_NAME=playlist - SEGMENT_LENGTH=10 - SEGMENT_COUNT=30 restart: always |
create the /etc/docker/hls/dockerfile file
1 2 3 4 5 6 7 8 9 10 11 | FROM httpd:bullseye RUN \ apt-get update && \ apt-get install ffmpeg supervisor -y && \ rm -R /usr/local/apache2/htdocs/* COPY stream-udp stream-hls /usr/local/sbin/ COPY supervisor-httpd.conf supervisor-stream-udp.conf supervisor-stream-hls.conf /etc/supervisor/conf.d/ ENTRYPOINT /usr/bin/supervisord -n |
create the /etc/docker/hls/stream-udp file
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/bin/bash while true do IFS=$ '\n' files=($( find /video -maxdepth 1 - type f)) if [ "${#files[@]}" -gt "0" ]; then index=$(shuf -i 0-$((${ #files[@]}-1)) -n 1) ffmpeg -re -i "${files[$index]}" -vcodec copy -acodec copy -f mpegts udp: //127 .0.0.1:51386 else sleep 60s fi done |
create the /etc/docker/hls/stream-hls file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/bin/bash format = "%${#SEGMENT_COUNT}d" destination= /usr/local/apache2/htdocs ffmpeg \ -i udp: //127 .0.0.1:51386 \ -vcodec copy \ -acodec copy \ -f ssegment \ -segment_list_flags +live \ -segment_time $SEGMENT_LENGTH \ -segment_list_entry_prefix $URL_PREFIX/ \ -segment_list_size $SEGMENT_COUNT \ -segment_wrap $SEGMENT_COUNT \ -segment_list "$destination/$PLAYLIST_NAME.m3u8" "$destination/$PLAYLIST_NAME$format.ts" |
create the /etc/docker/hls/supervisor-httpd.conf file
1 2 3 4 5 6 | [program:httpd] command=httpd-foreground autostart=true autorestart=true stdout_logfile=/var/log/supervisor-httpd.out stderr_logfile=/var/log/supervisor-httpd.err |
create the /etc/docker/hls/supervisor-stream-udp.conf file
1 2 3 4 5 6 | [program:stream-udp] command=/usr/local/sbin/stream-udp autostart=true autorestart=true stdout_logfile=none stderr_logfile=none |
create the /etc/docker/hls/supervisor-stream-hls.conf file
1 2 3 4 5 6 | [program:stream-hls] command=/usr/local/sbin/stream-hls autostart=true autorestart=true stdout_logfile=none stderr_logfile=none |
build the image, create and start the container
docker-compose -f /etc/docker/hls/docker-compose.yml up -d
open the http://hls.domain.lan/playlist.m3u8 link in a media player (e.g. SMPlayer)