Церковное служение
August 23

Трансляция потока музыки в сеть Интернет и на видеохостинги

Принципиальная схема работы

Ниже опишу параметры для настройки трансляции без детального описания.
В целом, это всё можно запустить на одном ПК под управлением Astra Linux 1.7.5+, RedOS 7,3+, Ubuntu 18+, CentOS 8+, Mac OS X 10.13+ или на RaspberryPI 5.

Перед настройкой нужно установить пакеты Icecast2, ezstream и ffmpeg.

## Настройка ezstream

### Файл конфигурации для EZSTREAM /etc/ezstream/ezstream.xml

Список файлов для воспроизведения "/media/shuffled_broadcast_playlist.txt", описание стрима текстовое для отображения в Icecast2.
"ПАРОЛЬСТРИМА" - пароль для стрима в Icecast2.

<?xml version="1.0" encoding="UTF-8"?>

<ezstream>
  <servers>
    <server>
      <name>RaspberryPI</name>
      <protocol>HTTP</protocol>
      <hostname>127.0.0.1</hostname>
      <port>8000</port>
      <user>source</user>
      <password>ПАРОЛЬСТРИМА</password>
      <tls>May</tls>
      <tls_cipher_suite>HIGH:!RSA:!SHA:!DH:!aNULL:!eNULL:!TLSv1</tls_cipher_suite>
      <reconnect_attempts>20</reconnect_attempts>
    </server>
  </servers>

  <streams>
    <stream>
      <mountpoint>/broadcast.mp3</mountpoint>
      <intake>broadcast</intake>
      <server>RaspberryPI</server>
      <public>No</public>
      <format>MP3</format>
      <stream_name>SPBCHURCH BROADCAST STREAM</stream_name>
      <stream_url>https://station.spbchurch.ru</stream_url>
      <stream_genre>Various</stream_genre>
      <stream_description>Стрим для трансляций богослужения. Максимально близкое исполнение к традиционным гимнам.</stream_description>
      <stream_quality>1.5</stream_quality>
      <stream_bitrate>16</stream_bitrate>
      <stream_samplerate>48000</stream_samplerate>
      <stream_channels>2</stream_channels>
    </stream>
  </streams>

  <intakes>
    <intake>
      <name>broadcast</name>
      <type>playlist</type>
      <filename>/media/shuffled_broadcast_playlist.txt</filename>
      <shuffle>1</shuffle>
      <stream_once>No</stream_once>
    </intake>
  </intakes>

  <metadata>
    <format_str>@t@</format_str>
    <refresh_interval>5</refresh_interval>
    <normalize_strings>Yes</normalize_strings>
    <no_updates>No</no_updates>
  </metadata>

  <decoders>
    <decoder>
      <name>OggDec</name>
      <program>oggdec -R -b 16 -e 1 -s 1 -o - @T@</program>
      <file_ext>.ogg</file_ext>
      <file_ext>.oga</file_ext>
    </decoder>

    <decoder>
      <name>MadPlay</name>
      <program>madplay -b 16 -R 44100 -S -o raw:- @T@</program>
      <file_ext>.mp3</file_ext>
    </decoder>

    <decoder>
      <name>Flac</name>
      <program>flac -s -d --force-raw-format --sign=signed --endian=little -o - @T@</program>
      <file_ext>.flac</file_ext>
    </decoder>

    <decoder>
      <name>AAC</name>
      <program>faad -d -f 2 -w @T@</program>
      <file_ext>.m4a</file_ext>
    </decoder>
  </decoders>

  <encoders>
    <encoder>
      <name>OggEnc-Q1.5</name>
      <format>Ogg</format>
      <program>oggenc -r -B 16 -C 2 -R 44100 --raw-endianness 0 -q 1.5 -t @M@ -</program>
    </encoder>

    <encoder>
      <name>Opus-VBR96</name>
      <format>Ogg</format>
      <program>opusenc --vbr --bitrate 96 --title @t@ --artist @a@ --raw --raw-rate 44100 - -</program>
    </encoder>

    <encoder>
      <name>Lame-CBR128</name>
      <format>MP3</format>
      <program>lame --preset cbr 128 -r --add-id3v2 --bitwidth 16 - -</program>
    </encoder>
  </encoders>

  <!-- Log file path -->
  <logfile>/var/log/ezstream.log</logfile>

  <!-- Log level (0-4) -->
  <loglevel>3</loglevel>

</ezstream>

### Текст службы ezstream /etc/systemd/system/ezstream.service

[Unit]
Description=EZStream Streaming Media Server
After=network.target,icecast2.service

[Service]
User=icecast2
Group=icecast

ExecStartPre=/bin/sleep 30
ExecStart=/usr/bin/ezstream -c /etc/ezstream/ezstream.xml -v
Restart=always

[Install]
WantedBy=multi-user.target

### Скрипт создания списка файлов для воспроизведения
Скрипт нужен, если будете добавлять mp3-файлы в каталог уже после запуска службы.

#!/bin/bash
ls /media/mp3/*.mp3 > /media/playlist.txt
shuf /media/playlist.txt > /media/shuffled_playlist.txt
chmod -R 755 /media/mp3
# Посылаем сигнал ezstream на обновление списка воспроизведения
killall -HUP ezstream
# Посылаем сигнал ezstream для переключения на следующий трек (закомментировано, но работает исправно, если это необходимо после обновления списка)
# killall -SIGUSR1 ezstream

## Настройка Icecast2

### Файл конфигурации для Icecast2 /etc/icecast2/icecast.xml


"ПАРОЛЬСТРИМА" – паролья для подключения плеера ezstream
"ПАРОЛЬРЕЛЕЯ" – пароль для перенаправления потока (в моем случае не используется, но оставлен)
"ПАРОЛЬАДМИНА" – паролья от консоли администратора Icecast2

<icecast>
    <location>Saint-Petersburg, Russia</location>
    <admin>[email protected]</admin>
    <limits>
        <clients>100</clients>
        <sources>3</sources>
        <queue-size>524288</queue-size>
        <client-timeout>30</client-timeout>
        <header-timeout>15</header-timeout>
        <source-timeout>10</source-timeout>
        <burst-on-connect>1</burst-on-connect>
        <burst-size>65535</burst-size>
    </limits>

    <authentication>
    <source-password>ПАРОЛЬСТРИМА</source-password>
    <relay-password>ПАРОЛЬРЕЛЕЯ</relay-password>
    <admin-user>admin</admin-user>
    <admin-password>ПАРОЛЬАДМИНА</admin-password>
    </authentication>

    <directory>
        <yp-url-timeout>15</yp-url-timeout>
        <yp-url>http://dir.xiph.org/cgi-bin/yp-cgi</yp-url>
    </directory>

    <hostname>station.spbchurch.ru</hostname>

    <listen-socket>
        <port>8000</port>
    </listen-socket>
    <http-headers>
        <header name="Access-Control-Allow-Origin" value="*" />
    </http-headers>

    <fileserve>1</fileserve>

    <paths>
        <basedir>/usr/share/icecast2</basedir>
        <logdir>/var/log/icecast2</logdir>
        <webroot>/usr/share/icecast2/web</webroot>
        <adminroot>/usr/share/icecast2/admin</adminroot>
        <alias source="/" destination="/status.xsl"/>
    </paths>

    <logging>
        <accesslog>access.log</accesslog>
        <errorlog>error.log</errorlog>
<!--        <playlistlog>playlist.log</playlistlog> -->
        <loglevel>3</loglevel> <!-- 4 Debug, 3 Info, 2 Warn, 1 Error -->
        <logsize>10000</logsize> <!-- Max size of a logfile -->
<!--        <logarchive>1</logarchive> -->
    </logging>

    <mount>
        <mount-name>/radio.mp3</mount-name>
        <charset>UTF-8</charset>
    </mount>
    <mount>
        <mount-name>/broadcast.mp3</mount-name>
        <charset>UTF-8</charset>
    </mount>
    <security>
        <chroot>0</chroot>
        <!--
        <changeowner>
            <user>nobody</user>
            <group>nogroup</group>
        </changeowner>
        -->
    </security>
</icecast>

## Настройка Ffmpeg

Скрипт для запуска потока на видеохостинг

#!/bin/bash
VIDEO="vkradio.mp4"
BROADCAST="http://10.0.1.13:8000/broadcast.mp3"
RESOLUTION="640x480"
BITRATE="1500k"
FRAMERATE="5"
# URL для подключения к видеохостингу, ниже пример для Youtube
URL="rtmp://a.rtmp.youtube.com/live2/xxxx-xxxx-xxxx-xxxx-xxxx"

/usr/bin/ffmpeg  -re -stream_loop -1 -i "$VIDEO" -i "$BROADCAST" -c:a aac -s "$RESOLUTION" -ab 128k -b:v "$BITRATE" -threads 2 -crf 22 -preset fast -vcodec libx264 -pix_fmt yuv420p -maxrate 2048k -bufsize 2048k -framerate $FRAMERATE -g 2 -strict experimental -f flv "$URL"