Axia Livewire - делаем Icecast вещание и запись потоков

Материал из rrv-wiki
Перейти к навигации Перейти к поиску


Вводные данные

Имеем сеть Axia Livewire на основе аналоговых нод, на которой устроена передача сигнала из студий до передатчиков.

Задача

Сделать интернет вещание всех радиостанций и их запись (контроль выходного сигнала из студий)

Решение

Взять бытовой компьютер, поставить на него Ubuntu server. Поднять Icecast и передавать на него Livewire поток с помощью vlc

Сервер

Для удобства возьмем сервер с двумя сетевыми картами, одна для связи с внешним миром (enp3s2), вторая в сеть Livewire (enp1s0)

Сеть

/etc/network/interfaces

source /etc/network/interfaces.d/*
 
auto lo
iface lo inet loopback

iface enp1s0 inet static
address 192.168.4.51
netmask 255.255.255.0
#gateway 192.168.4.1
up ip route add 224.0.0.0/4 dev enp1s0 #Указываем маршрут до multicast

auto enp1s0

iface enp3s2 inet static address 192.168.0.51
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameservers 192.168.0.1 8.8.8.8
auto enp3s2

Icecast2

Установим:

sudo apt install icecast2

настроим, стандартная настройка, важные элементы файла /etc/icecast2/icecast.xml:

    <limits>
       <clients>100</clients>
       <sources>10</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>pass123</source-password>
       <relay-password>relay-pass123</relay-password>
       <admin-user>admin</admin-user>
       <admin-password>adm-pass123</admin-password>
   </authentication>
   <hostname>192.168.0.51</hostname>
   <listen-socket>
       <port>8000</port>
   </listen-socket>

Только поставьте нормальные пароли.

VLC

Установим консольный vlc:

sudo apt install vlc-nox

SPD

Теперь создадим SPD файл (Надо создать отдельно для каждого потока) читать тут. /home/air/test.sdp:

v=0
o=Node 1 1 IN IP4 192.168.4.42
s=Test
t=0 0
a=type:multicast
c=IN IP4 239.192.16.108
m=audio 5004 RTP/AVP 96
a=rtpmap:96 L24/48000/2

Здесь:

  • 192.168.4.42 - это ip адрес Livewire ноды
  • 239.192.16.108 - это multicast ip-адрес потока Livewire.

Определяется так: 239.192. - это база 16*256+108=4204, 4204-это канал нашего потока (смотрим на Livewire ноде, у вас будет свой)

Тестируем

Пользователь под которым будет запущен vlc должен быть не root (у меня air).

Запускаем vlc

/usr/bin/cvlc -v /home/air/test.sdp --sout-mux-caching 5000 --no-sout-video \
--sout '#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=44100}:duplicate{dst=std{access=shout{mp3},mux=raw,dst=source:pass123@192.168.0.51:8000/test}}' --sout-keep

тут:

  • 5000 - кэшь 5000мс (5с)
  • acodec=mp3 - кодируем в mp3 поток
  • ab=128 - битрейт
  • channels=2 - стерео
  • samplerate=44100 - частота дискретизации
  • pass123 - пароль для Icecast2
  • 192.168.0.51 - ip Icecast2 сервера (можно посылать на внешний сервер)

Слушаем поток, на Icecast2 сервере на http://192.168.0.51:8000

Все ок! Нет не все, радио на этом потоке (на передатчике) начало раз в несколько секунд щелкать. В логах пусто. Тестировали на разных компах (Linux, Windows, MacOS), как только запускаем vlc, начинает щелкать...

tcpdump показало:

# tcpdump -p -n -i enp1s0 src 192.168.4.51
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp1s0, link-type EN10MB (Ethernet), capture size 262144 bytes
12:18:51.479850 IP 192.168.4.51.5005 > 239.192.16.108.5005: UDP, length 1456
12:18:56.941643 IP 192.168.4.51.5005 > 239.192.16.108.5005: UDP, length 1456
12:19:01.903280 IP 192.168.4.51.5005 > 239.192.16.108.5005: UDP, length 1456
12:19:04.280703 IP 192.168.4.51.5005 > 239.192.16.108.5005: UDP, length 1456
12:19:08.172920 IP 192.168.4.51.5005 > 239.192.16.108.5005: UDP, length 1456

vlc шлет какие то UDP пакеты....

В интернете: "5005 UDP - используется для приема информации о потере пакетов от клиентов и предоставление информации о синхронизации для клиентов, потоковое с помощью RTSPU". Он и сбивает Livewire ноду (которая рядом с передатчиком).

Разбираться с vlc лень, запретим UDP!

iptables

sudo iptables -A OUTPUT -p udp -m udp --dport 5005 -j DROP

Сохраняем правила файрвола.

sudo iptables-save > /etc/iptables.rules

Восстанавливаем правила.

sudo iptables-restore < /etc/iptables.rules

Просмотр правил

sudo iptables -L -n -v


Что бы после перезагрузки правила сохранились ставим пакет iptables-persistent

sudo apt install iptables-persistent

после установки он предложит запомнить правила iptables.

В дальнейшем после изменения правил запоминаем так:

sudo netfilter-persistent save

Работает плохо, заикается

Тестируем идеи:

Включаем поддержку igmp

sysctl net.ipv4.conf.enp1s0.force_igmp_version=2
  • enp1s0 - сетевая карта

не помогло :(

Пробуем поставить Low latency ядро

sudo apt install linux-lowlatency linux-headers-lowlatency