Развертывание радиостанции на GNU/Linux. Часть I

в 18:13, , рубрики: alsa, gentoo, jack, linux, Работа со звуком, метки: , , , ,

Прежде всего, хочу сказать, что я читал на хабре много топиков о развертывании радио, но ни один не дал мне исчерпывающей информации.
Я решил все сделать сам. Это не какой-то проект или стартап, а просто 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

#я забыл включить useradd в конфигурацию busybox, использую внешнюю:
opkg install shadow-useradd
useradd icecast -g nogroup
cp /etc/icecast.xml /usr/share/icecast #песочница
vi /usr/share/icecast/icecast.xml #можно установить nano

По правде говоря, я вообще использовал 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 внесите следующие строки:

#ICECAST
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 поддерживает множество профилей, мне хватило и одного. Главное окно выглядит так(все кликабельно):
image

Поддерживаются 2 параллельных плейлиста музыки, плавное переключение между ними (длинный ползунок внизу), внезапное появление ведущего в эфире (правая кнопка снизу), звонки в студию, (телефончики), а также:

  • Запись с 4 микрофонов
  • Вывод в 6 потоков Icecast/Shoutcast
  • Вывод в MP3 и OGG (потоки)
  • Запись в FLAC на жесткий диск

Кнопка настроек внизу слева. Preferences и Jingles я рассмотрю во второй части, а сейчас перейдем к Output:

image

Настройки не умещаются у меня на экране, внизу запись на диск, там ничего интересного.
Вверху можно отметить нужные стримы и подключиться к ним, или изменить шаблон вывода метаданных.

Ниже нажатая кнопка означает, что стрим идет на вкладке Format можно задать формат и битрейт и т.д, т.е. все настолько тривиально, что не вижу смысла выкладывать отдельные скриншоты.
Отмечу, что также можно транслировать названия песен в IRC.

V. Настройка Skype
Сначала установите skype ☻ и alsa-plugins. В Gentoo:
emerge alsa-plugins #с USE="jack"
Затем в файл ~/.asoundrc добавьте:

# VoIP plugin for the IDJC default profile.
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 или что угодно):

image

Спасибо за внимание, продолжение следует.

Автор: pashazz

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js