Развертывание радиостанции на GNU/Linux. Часть I
Прежде всего, хочу сказать, что я читал на хабре много топиков о развертывании радио, но ни один не дал мне исчерпывающей информации.
Я решил все сделать сам. Это не какой-то проект или стартап, а просто 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 на роутер:
Почему на роутер? Конечно, компьютер ночью выключен, а планируется 24/7 режим.
Я буду использовать Icecast в песочнице, поэтому создам пользователя icecast.
Конфигурационный файл icecast имеет формат XML
По правде говоря, я вообще использовал kate (kio-sftp) для редактирования этого конфига, впрочем, это значения не имеет.
Конфиг хорошо отдокументирован. Для безопасности нам нужно установить chroot в единицу, а и changeowner в нашего пользователя. Так же обратите внимание, что paths (пути) в таком случае должны быть относительными от basedir, но со слешем в начале. А еще icecast очень не любит создавать пути сам.
В качестве примера, вот мой конфиг.
В моем случае нужно создать лог-файлы для пользователя icecast:
Веб-интерфейс доступен на 192.168.1.1:8000
Кстати, добавьте строку
icecast -b -c /usr/share/icecast/icecast.xml
в /etc/rc.local, дабы запускать icecast при загрузке роутера.
Я не смогу работать 24 часа в сутки, поэтому мне нужен fallback-поток, который будет замещать основной на том же URL, в случае оффлайна первого.
Окончательный вариант настройки fallback-потока вы найдете во второй части, а пока я буду использовать для этого MPD.
В настройке MPD для icecast нет ничего сложного, сейчас он у меня транслирует параллельно в ALSA и IceCast. Просто установите mpd и откройте
/.mpdconf, там уже будут настроены и ALSA, и Icecast, нужно только раскомментировать и подправить параметры под себя.
Допустим, наш основной поток называется /live, а fallback — /mpd.ogg
Тогда в icecast.xml следует добавить:
Перезапустите icecast (killall наше все), и попробуйте открыть адрес
192.168.1.1:8000/live в плеере. Работает? Поехали дальше.
III: Лезем в интернет
Пора настроить firewall для принятия соединений извне. Если у вас нет «белого» IP, воспользуйтесь dyndns.org и обратитесь к документации по openwrt.
В /etc/config/firewall внесите следующие строки:
и перезапустите файервол:
/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 добавьте:
и перелогиньтесь.
Также необходимо создать конфигурационный файл, например:
echo «/usr/bin/jackd -d -r 44100 -p 256» >
/.jackdrc
После этого запустите сервер JACK, используя в качестве back-end’а вашу звуковую систему (подо что вы конфиг создавали):
jackd -d
т.е. 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»
Затем в файл
и перелогиньтесь.
Кстати, перед любым запуском idjrc обязательно запустите JACK командой jackd -d alsa (подставив pulse, если нужно). Если вы любите графические интерфейсы, воспользуйтесь программой qjackctl.
В скайпе выберите устройство idjcvoip (это работает вообще для любой программы, можно использовать Ekiga или что угодно):
Чтобы пропустить звук из скайпа в эфир, нажмите на зеленый телефон, убрать — красный.
Источник
Автоматизация работы интернет-радио на Linux
В этом посте я расскажу тебе об одном из методов автоматизации интернет-вещания – не самом надежном, но самом бюджетном. Сразу предупреждаю, что эта система заточена на использование ее под Linux, хотя с помощью знакомого многим «столярного инструмента», можно и под Windows реализовать. Эта статья расчитана на начинающих IT-шников, поэтому многие моменты я постарался «разжевать». Как у меня это получилось, решать тебе, мой дорогой читатель, но если мне удалось заинтересовать тебя, прошу под кат.
Предисловие
Итак, сначала позволю себе описать цели, которые я перед собой поставил:
1. Вещание нон-стоп 24/7/365 (не считая отключений электричества в доме).
2. Вещание по расписанию. То есть в определенный временной промежуток дня в эфире должны звучать композиции определенного стиля/жанра.
3. Поддержка «горячего» подключения и отключения ведущего/диджея.
4. Требования к сайту:
4.a. Скромная реализация голосования за звучащие композиции и, соответственно, рейтинг TOP-20/30/сколько_угодно.
4.b. Информация о текущем треке, о текущем стиле/жанре и, если нужно, о количестве слушателей.
Теперь немного о том, что было у меня в «заначке» (точнее, в кладовке):
— домашний компьютер 2003 года, AMD Athlon 1,8 GHz, который уже давно работает как домашний сервер (кстати, я снизил тактовую частоту до 1,1 GHz для экономии электроэнергии);
— операционная система Gentoo Linux;
— доступ в глобальную сеть
10Mbit/s + выделенный IP;
Настройка сервера Icecast
Итак, поехали. Я не буду описывать установку программ, т.к. в большинстве дистрибутивов они доступны в репозитариях и устанавливаются/собираются одной командой.
В качестве сервера был выбран Icecast 2.3.2, в качетсве source-клиента для нон-стопа – ices (версию не помню).
После установки нужно настроить Icecast следующим образом.
Настройка ices
С настройкой ices все проще:
Итак, сервер Icecast настроен, и его уже можно запустить (обычно, /etc/init.d/icecast start).
Ices тоже настроен, однако его запускать пока рано, ибо нет плейлиста для нон-стопа.
Собственно это сейчас и исправим…
Формирование плейлистов
Небольшое предисловие. Эту радиостанцию я поднимал не один, а с товарищем, у которого на компьютере гораздо больший запас музыки, чем у меня. Ранее была сделана виртуальная частная сеть (VPN) между нашими компьютерами и сервером, посему мы благополучно могли обмениваться файлами. Было принято решение хранить все треки для нон-стопа в отдельном каталоге на сервере, который доступен в samba-шаре, и в который мой коллега может загружать треки (а может и удалять).
Структура каталога проста:
Т.е. в основном каталоге Music имеется несколько подкаталогов для различных стилей (помнишь, я говорил о расписании нон-стопа?). В каждом таком подкаталоге расположены mp3-файлы и один плейлист.
Итак, начнем с маленького BASH-скрипта для формирования плейлистов для всех стилей.
Файл music_find.sh (спасибо differentlocal за упрощение моего скрипта)
Примечание: для людей, далеких от электронной музыки, поясняю, что Breaks, Chill, Hardcore это как раз стили электронной музыки.
И так как мой коллега далек от Linux, и не может зайти по SSH и запустить этот скрипт после обновления содержимого каталога, было решено поручить эту миссию Великому Крону:
Теперь через каждые 30 минут скрипт будет запускаться и обновлять плейлисты.
Однако, если ты еще не забыл, в конфиге ices был указан «главный» плейлист, который в этом скрипте не формируется.
Тут нужно вспомнить о расписании. Идея проста до безобразия: в определенное время (согласно расписанию эфира) копировать с заменой нужный плейлист в корневой каталог музыки (в моем случае /home/PUBLIC/Music). Сначала я думал реализовать расписание полностью на BASH, но потом вспомнил, что добрый Крон всегда готов нам помочь и выполнить всю грязную работу за нас. Таким образом возник скрипт, реализующий изменение плейлиста согласно расписанию.
Однако, сначала лирическое отступление…
Помнишь, при конфигурировании ices я отключил функцию рандомизации? Тебя наверное интересует, зачем? Причин две:
1. Бог его знает, как ices выполняет рандомизацию. Я привык (уж извините) максимально контроллировать ситуацию. Поэтому лучше сделать рандомизацию так, как сам хочешь, чтобы душа таки успокоилась.
2. Если ты читаешь эту статью, тебе, наверное, знаком термин «джингл». Так вот, если предполагается вставка джинглов в эфир (например, через каждые три трека), тут ices бессилен, т.к. он не знает, что это такое. Эта еще одна причина для написания собственной программы рандомизации.
BASH, конечно, штука хорошая, но для данной задачи я выбрал язык C++. Ниже приведен исходный код программы на C++, которая просто считывает содержимое созданного ранее плейлист-файла (имя передается ей в качестве параметра), перемешивает, и записывает в тот же файл.
Исходный код программы рандомизации:
В этой программе я не стал реализовывать вставку джинглов, но я искренне надеюсь, что ты, мой дорогой читатель, при необходимости легко подстроишь этот код по свои нужды или, что еще лучше, сам напишешь свой.
Реализация расписания
Итак, лирическое отступление закончено, вернемся к расписанию:
Сначала скрипт выполняет копирование с заменой нужного плейлист-файла, затем запускает программу рандомизации, записывает в текстовый файл текущий жанр (зачем, узнаешь позже)
и посылает сигнал «перечитать плейлист» ices. Если ранее ices завершил работу, скрипт его снова запустит. При этом важно знать, что ices начнет проигрывать новый плейлист только, когда закончит проигрывать текущий трек. Поэтому расписание будет выглядеть не очень элегантно, зато его можно поручить нашему другу Крону.
Привожу пример со своими стилями:
Та-да-дам! Вот теперь строительство вещания по расписанию закончено. Когда нет диджея, играет по расписанию нон-стоп, когда появляется диджей — слушателей автоматически перенаправляет на его «эфир». Однако, если ты помнишь, еще остались нереализованные задачи, касающиеся сайта.
База данных музыкальных композиций
Ах да, совсем забыл. Для реализации системы голосования я использовал БД MySQL. Так что потрудись, друг мой, обзавестись таковым, если еще этого не сделал.
Итак, нам нужно хранить в БД информацию о всех треках, которые присутствуют в «корневом музыкальном каталоге». Нужно создать базу данных (в моем примере это radio), а в ней две таблицы следующей структуры:
Таблица songs
id INT(11) AUTO_INCREMENT PRIMARY_KEY
Genre VARCHAR(15)
Title VARCHAR(100)
Filename VARCHAR(200)
Rate INT(11)
Таблица votes
id INT(11)
ip VARCHAR(16)
Теперь о печальном. Во-первых, далеко не у всех mp3-файлов (даже у лицензионных) корректные ID3-теги, а у большинства их вообще нет. Во-вторых, я не смог найти скрипт для чтения ID3-тегов из файлов. Поэтому пришлось пойти на некоторые жертвы. А именно: с помощью программы TagScanner вручную править ID3-теги всех файлов, а затем с помощью этой же программы переименовывать файлы согласно их уже корректным ID3-тегам. Я выбрал следующий шаблон:
Я не буду описывать в этой статье работу с этой программой. Скажу лишь, что принципиально важно сохранять ВСЕ ID3-теги НЕ в UTF-8. В настройках программы есть соответствующая опция. кроме того, нужно заменить все символы ‘&’ на, например, “and”. Программа позволяет делать это сразу для всех файлов.
ОК, предположим, что у нас теперь есть корректные имена файлов, соответствующие шаблону, и база данных правильной структуры. Далее, собственно, еще один скрипт, но уже на PHP (так что не забудь на досуге установить и его).
Приведенный выше скрипт сначала удаляет из БД записи о треках, которых уже нет в соответствующем каталоге, а затем добавляет новые, если они есть.
Было бы логично запускать этот скрипт сразу после составления плейлистов, поэтому добавим одну строчку в файл music_find.sh (предварительно, заменив путь на свой):
Теперь при составлении плейлистов автоматически будет обновляться информация в БД.
Вторую таблицу (votes) оставлю на закуску.
Сбор информации о вещании
Тут не буду особо вдаваться в подробности. Вашему вниманию предлагается php-скрипт, записывающий название текущего трека, стиль и количество слушателей в текстовые файлы. Предполагается, что эти файлы находятся в корне нашего сайта, т.е. если у тебя, друг мой, не установлен вебсервер, то поспеши его установить.
Этот скрипт нужно запускать каждую минуту, причем он выполняется 12 раз с задержками по 5 секунд. Этот «велосипед» связан с тем, что наш друг Крон не подразумевает о существовании единиц измерения времени меньше, чем 1 минута. А нам нужно обновлять эту информацию хотя бы раз в 5 секунд.
Что же, попросим Крона (в последний раз) запускать этот скрипт каждую минуту:
ОК, теперь в корне нашего сайта лежат аж 5 замечательных файлов:
• now_playing.txt — исполнитель и название текущего трека;
• id.txt — уникальный номер в БД текущей композиции;
• genre.txt — стиль трека, если играет нон-стоп, или строка «DJ On-Air”, если в эфире диджей;
• listeners.txt — количество слушателей (с учетом HTML-форматирования: если больше 0, то зеленым цветом, если ноль — черным);
• rate.txt — рейтинг трека (тоже с учетом HTML-форматирования).
Ух ты, мы уже почти получили все, что хотели (или то, чего я хотел). Осталось реализовать голосование и, собственно, показ нужной информации на сайте.
Голосование за композиции
Первое, о чем я подумал, когда захотел реализовать голосование — а как блокировать повторные голосования за один трек? Обычно используют Cookies, но я с ними никогда не работал (да, такое тоже бывает), и решил блокировать по IP-адресу. Поэтому в таблице votes всего два поля: id и ip.
Файл vote.php (должен располагаться в корне сайта):
Этот скрипт принимает один параметр — вид голосования (за или против). Соответственно, вызов
добавит 1 рейтинга текущему треку, а
отнимет 1 рейтинга.
Показ информации на сайте
Итак, голосование — есть. Осталось, разве, что вывести на сайте всю необходимую информацию. Я не буду приводить конкретный HTML-код. Просто напомню, если вдруг ты забыл, о существовании замечательного фреймворка jQuery.
Пусть в нужных местах HTML-кода стоят элементы или с для названия трека, с для жанра и тд.
Тогда удобно встроить в следующий вызов (конечно, библиотеку jQuery нужно добавить в каталог сайта и подключить):
И тогда каждые 5 секунд информация на странице будет обновляться (причем, без перезагрузки страницы).
Помнишь, в начале статьи я заявил о показе рейтинга TOP20? Да, это было бы здорово.
Итак, последний скрипт, который выдает таблицу лучших (type=1) или худших (type=2) треков определенного стиля/жанра в следующем формате:
| Композиция | Рейтинг |
Файл top20.php (лучше допилить инструментом под свой сайт):
Вот и все. Далее нужно встроить этот скрипт в нужное место HTML-кода (можно использовать тот же jQuery, только без setInterval(‘show()’,5000). Но это я оставляю тебе, мой юный друг, в качестве домашнего задания.
Искренне надеюсь, что мой рассказ окажется тебе полезным или просто интересным.
Источник