Прежде всего, хочу сказать, что я читал на хабре много топиков о
развертывании радио, но ни один не дал мне исчерпывающей информации.
Я решил все сделать сам. Это не какой-то проект или стартап, а просто just4fun. Возможно, это покажется полезным для вас.
Итак, я использовал только свободное ПО в развертывании радио-стрима,
так что пользователи window$ и ma o$ могут дальше не читать ;). Хотя
нет, все же прочитайте, возможно это откроет вам GNU/Linux с новой
стороны.
Что мне нужно от потока вещания:
- проигрывание музыки
- прямой эфир (голос)
- вышеперечисленное вместе
- всякие штуки вроде заставок, смеха и пр.
- замещающий поток, работающий 24/7 (желательно)
Стартовые позиции
- Роутер Dlink DIR-320 (я
нищеброд тот еще эконом) - ПК с Gentoo Linux
- Микрофон обычный за 50 рублей, 1 шт
Микрофон студийный, 1 шт
Накопитель USB 64 Мб
Первым делом была снесена стоковая прошивка роутера, и на ее место встал
OpenWRT из транка. Я не буду рассказывать о том, как накатить OpenWRT,
это можно прочесть, например,
здесь.
Скажу лишь, что
необходимо перенести корень ФС роутера на внешнюю
флешку с помощью block-extroot, ведь встроенной памяти всего 4
мегабайта, а так же включить в параметрах сборки busybox программу
useradd.
Итак, прошивка установлена, интернет работает, SSH тоже, заходим по SSH на наш роутер и начинаем разбираться.
I. Icecast
Вопроса, 'а что же использовать в качестве стрим-сервера?' у меня не возникало. К тому же, он достаточно стабилен и легковесен.
Устанавливаем icecast на роутер:
opkg update
opkg install icecast
Почему на роутер? Конечно, компьютер ночью выключен, а планируется 24/7 режим.
Я буду использовать Icecast в песочнице, поэтому создам пользователя icecast.
Конфигурационный файл icecast имеет формат XML
opkg install shadow-useradd
useradd icecast -g nogroup
cp /etc/icecast.xml /usr/share/icecast
vi /usr/share/icecast/icecast.xml
По правде говоря, я вообще использовал kate (kio-sftp) для редактирования этого конфига, впрочем, это значения не имеет.
Конфиг хорошо отдокументирован. Для безопасности нам нужно установить
chroot в единицу, а и changeowner в нашего пользователя. Так же обратите
внимание, что paths (пути) в таком случае должны быть относительными от
basedir, но со слешем в начале. А еще icecast очень не любит создавать
пути сам.
В качестве примера,
вот мой конфиг.
В моем случае нужно создать лог-файлы для пользователя icecast:
cd /usr/share/icecast
mkdir log
cd log
touch {error,access}.log
cd -
chown -R icecast log
icecast -b -c icecast.xml
Веб-интерфейс доступен на
192.168.1.1:8000
Кстати, добавьте строку
icecast -b -c /usr/share/icecast/icecast.xml
в /etc/rc.local, дабы запускать icecast при загрузке роутера.
II: Fallback-поток
Я не смогу работать 24 часа в сутки, поэтому мне нужен fallback-поток,
который будет замещать основной на том же URL, в случае оффлайна
первого.
Окончательный вариант настройки fallback-потока вы найдете во второй части, а пока я буду использовать для этого MPD.
В настройке MPD для icecast нет ничего сложного, сейчас он у меня
транслирует параллельно в ALSA и IceCast. Просто установите mpd и
откройте ~/.mpdconf, там уже будут настроены и ALSA, и Icecast, нужно
только раскомментировать и подправить параметры под себя.
Допустим, наш основной поток называется /live, а fallback — /mpd.ogg
Тогда в icecast.xml следует добавить:
<mount>
<mount-name>/live</mount-name>
<fallback-mount>/mpd.ogg</fallback-mount>
<fallback-override>1</fallback-override>
<fallback-when-full>1</fallback-when-full>
</mount>
Перезапустите icecast (killall наше все), и попробуйте открыть адрес
192.168.1.1:8000/live в плеере. Работает? Поехали дальше.
III: Лезем в интернет
Пора настроить firewall для принятия соединений извне. Если у вас нет
«белого» IP, воспользуйтесь dyndns.org и обратитесь к документации по
openwrt.
В /etc/config/firewall внесите следующие строки:
config rule
option src wan
option dest_port 8000
option target ACCEPT
option proto tcp
и перезапустите файервол:
/etc/init.d/firewall restart
Кстати, по мне, лучший способ проверки — не isup.me, а мобильник :). В общем, поехали дальше
IV: Настройка клиента
Клиентская машина, т.е. десктоп — тоже линукс, как я сказал в начале поста.
Для управления радио будем использовать бесплатную открытую, и что главное, непортабельную (Linux only ☻) программу
idjc. Позволю себе процитировать отзыв с SourceForge:
In the past, I have streamed on Windows XP with both SAM and
ShoutCast. After trying Internet DJ Console on Ubuntu Studio, I must
say that it was the best streaming experience in my life. Over six hours
connected to my server, and it preformed flawlessly. Kudos to those who
put this together.
В портежах Gentoo её не оказалось, а, например, в Ubuntu она
есть.
Я собрал программу из исходников. Также мне понадобилось добавить
USE-флаг «jack» в /etc/make.conf для установки оного и интеграции с
alsa.
Для работы программа требует звуковой сервер JACK (когда меня
спрашивают, что из выдающихся программ есть в Linux, но нет в m$, я
отвечаю:
Rosegarden, Cinelerra, JACK, Ardour, MythTV! Ну и idjc).
Другие зависимости: GTK+, pygtk и наличие звуковой карточки с наушниками и микрофоном.
IV.1 Настройка Jack
JACK работает в realtime-режиме, так что ему нужно дать где развенуться.
Добавьте себя в группу audio, затем в /etc/security.conf добавьте:
@audio - rtprio 99
@audio - memlock unlimited
@audio - nice -10
и перелогиньтесь.
Также необходимо создать конфигурационный файл, например:
echo "/usr/bin/jackd -d <backend> -r 44100 -p 256" > ~/.jackdrc
После этого запустите сервер JACK, используя в качестве back-end'а вашу звуковую систему (подо что вы конфиг создавали):
jackd -d <backend>
т.е. alsa или pulse
IV.2 Настройка и использование idjc
idjc поддерживает множество профилей, мне хватило и одного. Главное окно выглядит так(все кликабельно):
Поддерживаются 2 параллельных плейлиста музыки, плавное переключение
между ними (длинный ползунок внизу), внезапное появление ведущего в
эфире (правая кнопка снизу), звонки в студию, (телефончики), а также:
- Запись с 4 микрофонов
- Вывод в 6 потоков Icecast/Shoutcast
- Вывод в MP3 и OGG (потоки)
- Запись в FLAC на жесткий диск
Кнопка настроек внизу слева. Preferences и Jingles я рассмотрю во второй части, а сейчас перейдем к Output:
Настройки не умещаются у меня на экране, внизу запись на диск, там ничего интересного.
Вверху можно отметить нужные стримы и подключиться к ним, или изменить шаблон вывода метаданных.
Ниже нажатая кнопка означает, что стрим идет на вкладке Format можно
задать формат и битрейт и т.д, т.е. все настолько тривиально, что не
вижу смысла выкладывать отдельные скриншоты.
Отмечу, что также можно транслировать названия песен в IRC.
V. Настройка Skype
Сначала установите skype ☻ и alsa-plugins. В Gentoo:
emerge alsa-plugins #с USE="jack"
Затем в файл ~/.asoundrc добавьте:
pcm.idjcvoip {
type plug
slave.pcm {
type jack
playback_ports {
0 idjc-mx_default:voip_in_l
1 idjc-mx_default:voip_in_r
}
capture_ports {
0 idjc-mx_default:voip_out_l
1 idjc-mx_default:voip_out_r
}
}
}
и перелогиньтесь.
Кстати, перед любым запуском idjrc обязательно запустите JACK командой
jackd -d alsa (подставив pulse, если нужно). Если вы любите графические
интерфейсы, воспользуйтесь программой qjackctl.
В скайпе выберите устройство idjcvoip (это работает вообще для любой программы, можно использовать Ekiga или что угодно):
Чтобы пропустить звук из скайпа в эфир, нажмите на зеленый телефон, убрать — красный.
Спасибо за внимание, продолжение следует.
Кстати для MPD и клиентов полно, включая приложения для iPhone/Android и еще какие угодно.