Axia Livewire - делаем Icecast вещание и запись потоков
Содержание
Вводные данные
Имеем сеть 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