В этой статье я расскажу, как с помощью Docker, FFmpeg и минимального набора команд развернуть трансляцию M3U8 потока в RTMP. Мы также добавим возможность включать и отключать эквалайзер, а вся настройка будет производиться через командную строку. Для примера возьмём поток, который будет отправляться на сервер Telegram.
Что понадобится:
- Docker для изоляции и упрощения развертывания.
- FFmpeg — инструмент для обработки и трансляции аудио и видео.
- Поток в формате M3U8.
- 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