Pull to refresh

Умная ретрансляция [wget > fifo > ices0 > icecast]

Reading time2 min
Views4.6K
Давайте поговорим немного про умную ретрансляцию mp3 потоков?
Возникла необходимость сделать качественный mp3 relay с четырех нестабильных источников (которые транслируют одно и то же), в основном для себя.
Возьмем, к примеру, KissFM. Есть 4 источника, которые периодически отваливаются (три потока звука одинаково хорошие и один похуже).

На данный момент реализация такая:
#!/bin/sh

#убиваем активные процессы, если есть. kisswget это symlink wget, чтоб не убить лишнего в случае чего
pkill ices
pkill kisswget

#убиваем fifo (в общем-то можно и не убивать, но я решил перестраховаться)
rm /home/random2/ices/kiss

#создаем fifo
mkfifo /home/random2/ices/kiss
#запускаем ices, у которого источником стоит /home/random2/ices/kiss, он же отдает stream серверу icecast
ices -c /home/random2/ices/ices.conf

#самая интересная и спорная часть: тащим поток с помощью wget (kisswget) в /home/random2/ices/kiss
#этот способ позволяет "переключить" исходный поток в случае обрыва связи, или ответа 403/404, например

while :
do
/home/random2/ices/kisswget httр://195.138.217.65:8000/kissfm -O /home/random2/ices/kiss
/home/random2/ices/kisswget httр://media.wnet.ua:8000/kissfm -O /home/random2/ices/kiss
/home/random2/ices/kisswget httр://217.20.164.164:8000/kissfm -O /home/random2/ices/kiss
done


Недостатки, которые я вижу на данный момент:
  • wget
  • тут нет четвертого потока (тот, что похуже качеством). Хочется чтобы в случае если первые три потока не доступны и играет четвертый, при «появлении» одного из первых трех wget автоматически переключался на него. При этом не хочется сложных велосипедов.
  • не прикручен current song title, в данной реализации вижу только отдельный скрипт для него, который будет брать откуда-то инфу и подсовывать её icecast как metadata

Небольшая справка: «FIFO» (first in, first out) представляет собой специальный тип файла, который позволяет оперировать с ним двум независимым процессам. Один процесс открывает fifo-файл для записи, а другой для чтения, после чего данные «плывут» через него. В *nix системах создается командой mkfifo.
Tags:
Hubs:
Total votes 22: ↑20 and ↓2+18
Comments28

Articles