Skip to main content

Трансляція відео на YouTube з Linux сервера

Стрім буде виконуватись за допомогою утиліти ffmpeg.
Для її встановлення необхідно виконати команду:
Ubuntu/Debian: apt -y install ffmpeg
RHEL/Centos/Almalinux: yum -y install ffmpeg або dnf -y install ffmpeg 

Далі для запуску треба завантажити відео та запустити команду:

ffmpeg -re -i video.mp4 \
  -c:v libx264 -preset veryfast -b:v 6M -maxrate 7M -bufsize 12M \
  -pix_fmt yuv420p -g 60 \
  -c:a aac -b:a 160k -ar 44100 \
  -f flv rtmp://a.rtmp.youtube.com/live2/YOUR_STREAM_KEY

де video.mp4 - це шлях до відео, а YOUR_STREAM_KEY - ключ трансляції.

Також, якщо треба транслювати багато файлів, можна використати наступний скрипт.
У ньому вам потрібно додати ключ, Та за необхідності можна змінити інші параметри. 
Для керування використовуйте команди:
./youtube_stream.sh start    # запуск 
./youtube_stream.sh stop     # зупинка 
./youtube_stream.sh restart  # перезапуск

#!/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