Давайте поговорим немного про умную ретрансляцию mp3 потоков?
Возникла необходимость сделать качественный mp3 relay с четырех нестабильных источников (которые транслируют одно и то же), в основном для себя.
Возьмем, к примеру, KissFM. Есть 4 источника, которые периодически отваливаются (три потока звука одинаково хорошие и один похуже).
На данный момент реализация такая:
Недостатки, которые я вижу на данный момент:
Небольшая справка: «FIFO» (first in, first out) представляет собой специальный тип файла, который позволяет оперировать с ним двум независимым процессам. Один процесс открывает fifo-файл для записи, а другой для чтения, после чего данные «плывут» через него. В *nix системах создается командой mkfifo.
Возникла необходимость сделать качественный 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.