Оглавление

В этой статье я расскажу, как с помощью Docker, FFmpeg и минимального набора команд развернуть трансляцию M3U8 потока в RTMP. Мы также добавим возможность включать и отключать эквалайзер, а вся настройка будет производиться через командную строку. Для примера возьмём поток, который будет отправляться на сервер Telegram.

Что понадобится:

  1. Docker для изоляции и упрощения развертывания.
  2. FFmpeg — инструмент для обработки и трансляции аудио и видео.
  3. Поток в формате M3U8.
  4. RTMP-сервер для передачи потока (в данном примере Telegram).

Шаг 1: Установка Docker

Для начала нужно установить Docker. Если он у вас ещё не установлен, выполните команду:

sudo apt update
sudo apt install docker.io

Шаг 2: Скрипт для трансляции

Ниже представлен наш основной скрипт для трансляции. Он использует FFmpeg для перепаковки потока, добавляет эквалайзер и передаёт поток на RTMP-сервер.

#!/bin/bash

# Проверка наличия необходимых аргументов
if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ] || [ -z "$4" ]; then
  echo "Usage: $0 <M3U8_URL> <RTMP_URL> <RTMP_KEY> <eqon/eqoff>"
  exit 1
fi

M3U8_URL=$1
RTMP_URL=$2
RTMP_KEY=$3
EQ_STATUS=$4
FULL_RTMP_URL="$RTMP_URL/$RTMP_KEY"

# Условие для включения или отключения эквалайзера
if [ "$EQ_STATUS" == "eqon" ]; then
    EQ_FILTER="[0:a]showwaves=s=1280x720:mode=line:colors=blue,format=yuv420p[v]"
    MAP_FILTER="-map '[v]' -map 0:a"
else
    EQ_FILTER=""
    MAP_FILTER="-map 0:a"
fi

# Команда для трансляции с опциональным эквалайзером и минимальной перекодировкой
ffmpeg -re -i "$M3U8_URL" \
    -filter_complex "$EQ_FILTER" \
    $MAP_FILTER \
    -c:v libx264 -preset veryfast -tune zerolatency -c:a aac -ar 44100 -b:a 128k \
    -f flv "$FULL_RTMP_URL"

Шаг 3: Параметры FFmpeg

Теперь разберём ключи, используемые в FFmpeg для трансляции:

  • -re: Эта опция заставляет FFmpeg читать входной файл в реальном времени. Это полезно при трансляции живых потоков.
  • -i "$M3U8_URL": Задаём ссылку на M3U8 поток как входной источник.
  • -filter_complex: Эта опция добавляет эквалайзер, если включён параметр eqon. В данном случае фильтр showwaves отображает звуковую волну в виде линии.
  • s=1280x720: Устанавливаем размер окна эквалайзера.
  • mode=line: Эквалайзер в виде линии.
  • colors=blue: Цвет линий эквалайзера (можно менять на любые цвета).
  • -map "[v]" -map 0:a: Если эквалайзер включён, отображаем видео- и аудиопоток. Если эквалайзер выключен, отображаем только аудио.
  • -c:v libx264: Используем кодек libx264 для кодирования видео.
  • -preset veryfast: Пресет кодирования для быстрой передачи.
  • -tune zerolatency: Опция для уменьшения задержек, полезно для живых трансляций.
  • -c:a aac -ar 44100 -b:a 128k: Настройка аудиопотока. Используем кодек AAC, частота дискретизации 44100 Гц и битрейт 128 кбит/с.
  • -f flv "$FULL_RTMP_URL": Передаём поток в формате FLV на RTMP-сервер. Полный URL для RTMP формируется из RTMP-сервера и ключа трансляции.

Шаг 4: Dockerfile

Вот как выглядит Dockerfile для создания контейнера:

FROM jrottenberg/ffmpeg:4.4-ubuntu

# Копируем наш скрипт в контейнер
COPY stream.sh /usr/local/bin/stream.sh
RUN chmod +x /usr/local/bin/stream.sh

# Точка входа
ENTRYPOINT ["/usr/local/bin/stream.sh"]

Шаг 5: Сборка и запуск Docker-контейнера

Для сборки Docker-образа используем команду:

docker build -t m3u8-to-rtmp-eq .

Теперь запустим контейнер:

docker run m3u8-to-rtmp-eq <M3U8_URL> <RTMP_URL> <RTMP_KEY> eqon

Где:

  • <M3U8_URL> — ссылка на ваш M3U8 поток.
  • <RTMP_URL> — полный адрес вашего RTMP-сервера.
  • <RTMP_KEY> — ключ трансляции.
  • eqon или eqoff — включить или выключить эквалайзер.

Шаг 6: Автозапуск и восстановление

Чтобы контейнер автоматически запускался при загрузке и перезапускался в случае ошибок, добавим параметр:

docker run --restart unless-stopped m3u8-to-rtmp-eq <M3U8_URL> <RTMP_URL> <RTMP_KEY> eqon

Итоги

Мы создали Docker-контейнер для трансляции потоков M3U8 в RTMP с возможностью включения и отключения эквалайзера. Контейнер легко настраивается через командную строку, а FFmpeg обеспечивает эффективную обработку и передачу медиа.

Теперь вы можете легко настроить подобный поток на своих серверах и наслаждаться высококачественной трансляцией с минимальными задержками.

Код выложил на гитхаб https://github.com/A-Krivoshen/alekseykrivoshein-m3u8totelegram

Собраный докер https://hub.docker.com/r/alekseykrivoshein/m3u8totelegram

Сейчас транслирует онлайн в телеграмм канал https://t.me/drslon_channel