#!/bin/bash # === Налаштування === STREAM_KEY="YOUR_STREAM_KEY" # Встав свій ключ YouTube RESOLUTION="1080p" # Варіанти: 720p, 1080p, 1440p, 2160p FPS=60 # Кадри на секунду VIDEO_DIR="./videos" # Папка з відео LOOP=true # true - нескінченний цикл, false - одноразово BACKGROUND=true # true - запуск у фоновому режимі PID_FILE="./youtube_stream.pid" # PID-файл для легкого зупинення LOG_FILE="./youtube_stream.log" # Лог файл # === Функція для вибору параметрів під роздільність === set_ffmpeg_params() { case $RESOLUTION in 720p) BV=3000k; MAXRATE=3500k; BUFSIZE=6000k; G=$((FPS*2)); BA=128k ;; 1080p) if [ "$FPS" -eq 60 ]; then BV=9000k; MAXRATE=10000k; BUFSIZE=18000k; G=120; BA=192k else BV=6000k; MAXRATE=7000k; BUFSIZE=12000k; G=60; BA=160k fi ;; 1440p) if [ "$FPS" -eq 60 ]; then BV=18000k; MAXRATE=21000k; BUFSIZE=36000k; G=120; BA=256k else BV=12000k; MAXRATE=14000k; BUFSIZE=24000k; G=60; BA=192k fi ;; 2160p) if [ "$FPS" -eq 60 ]; then BV=45000k; MAXRATE=51000k; BUFSIZE=100000k; G=120; BA=320k else BV=30000k; MAXRATE=35000k; BUFSIZE=60000k; G=60; BA=320k fi ;; *) echo "Невідома роздільність"; exit 1 ;; esac } # === Функція трансляції одного відео === stream_video() { local FILE="$1" echo "📺 Трансляція: $FILE" | tee -a "$LOG_FILE" ffmpeg -re -i "$FILE" \ -c:v libx264 -preset veryfast -b:v $BV -maxrate $MAXRATE -bufsize $BUFSIZE \ -pix_fmt yuv420p -g $G \ -c:a aac -b:a $BA -ar 48000 \ -f flv rtmp://a.rtmp.youtube.com/live2/$STREAM_KEY >> "$LOG_FILE" 2>&1 if [ $? -eq 0 ]; then echo "✅ Трансляція завершена: $FILE" | tee -a "$LOG_FILE" else echo "⚠️ Сталася помилка при трансляції: $FILE. Пропускаємо..." | tee -a "$LOG_FILE" fi } # === Основний цикл === set_ffmpeg_params do_stream() { while true; do for FILE in "$VIDEO_DIR"/*.{mp4,mkv,avi,mov}; do [ -e "$FILE" ] || continue stream_video "$FILE" done [ "$LOOP" = true ] || break done echo "Всі відео транслювано." | tee -a "$LOG_FILE" } # === Функції для запуску / зупинки === start_stream() { if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then echo "Стрім вже запущено (PID: $(cat "$PID_FILE"))" exit 1 fi if [ "$BACKGROUND" = true ]; then nohup bash -c do_stream > "$LOG_FILE" 2>&1 & echo $! > "$PID_FILE" echo "🟢 Трансляція запущена у фоні (PID: $(cat "$PID_FILE"), лог: $LOG_FILE)" else do_stream fi } stop_stream() { if [ -f "$PID_FILE" ]; then PID=$(cat "$PID_FILE") echo "🛑 Зупинка стріму (PID: $PID)..." kill $PID 2>/dev/null sleep 1 kill -9 $PID 2>/dev/null rm -f "$PID_FILE" echo "Стрім зупинено." else echo "Стрім не запущено." fi } # === Аргументи скрипта === case "$1" in start) start_stream ;; stop) stop_stream ;; restart) stop_stream sleep 1 start_stream ;; *) echo "Використання: $0 {start|stop|restart}" exit 1 ;; esac