#!/bin/bash [[ -z "$RTMP_URL" ]] && echo "RTMP_URL is required" >&2 && exit 1 [[ -z "$STREAM_KEY" ]] && echo "STREAM_KEY is required" >&2 && exit 1 HISTORY_SIZE=5 RETRY_DELAY=1 MAX_RETRY_DELAY=30 pick_video() { local all_videos=() for f in *.ts; do [[ -f "$f" ]] || continue all_videos+=("$f") done [[ ${#all_videos[@]} -eq 0 ]] && return 1 local available=() for v in "${all_videos[@]}"; do local in_history=0 for h in "${history[@]}"; do [[ "$v" == "$h" ]] && in_history=1 && break done [[ $in_history -eq 0 ]] && available+=("$v") done [[ ${#available[@]} -eq 0 ]] && available=("${all_videos[@]}") echo "${available[$((RANDOM % ${#available[@]}))]}" } # Outer loop: reconnect on disconnect while true; do echo "Connecting to $RTMP_URL..." >&2 declare -a history=() # Inner loop: pick and stream videos, piped into ffmpeg while true; do video=$(pick_video) if [[ -z "$video" ]]; then echo "No .ts files found, waiting..." >&2 sleep 5 continue fi history+=("$video") (( ${#history[@]} > HISTORY_SIZE )) && history=("${history[@]:1}") echo "Playing: $video" >&2 cat "$video" done | ffmpeg -loglevel error -re -fflags +genpts -i pipe:0 -c copy -f flv "$RTMP_URL/$STREAM_KEY" echo "Stream disconnected, reconnecting in ${RETRY_DELAY}s..." >&2 sleep "$RETRY_DELAY" RETRY_DELAY=$(( RETRY_DELAY * 2 )) (( RETRY_DELAY > MAX_RETRY_DELAY )) && RETRY_DELAY=$MAX_RETRY_DELAY done