Как стать автором
Обновить

Создаём простую, компактную и дешёвую интернет радиостанцию

Время на прочтение 10 мин
Количество просмотров 42K
Софтовой платформой будет Linux, для простоты лучше использовать что-то распространённое, с кучей информации в интернете, если вдруг что-то пойдёт не так. Железом для интернет радиостанции может быть что угодно, полноценный сервер с вашими проектами, какой-нибудь старый ноутбук, или нетбук, мы же хотим дёшево, а особой производительности от железа нам не требуется.

Если же под рукой ничего такого нет, или нам нужен совсем бесшумный сервер, почему бы не попробовать использовать мини компьютер?

Что-то типа Raspberry Pi 3?

Нет, мы же хотим дешевле, так что нам нужно что-то типа Orange Pi. У меня нашлась модель Orange Pi Pc Plus с 1GB DDR3 оперативной памяти и 8GB EMMC Flash.



UPD: Вчера все как-то слишком серьёзно восприняли статью, но на самом деле эксперимент был проведён ради фана, чтобы посмотреть получится или нет. Естественно ни о каком «промышленном» использовании речи не идёт, это всё равно что попытаться озвучить стадион обычным музыкальным центром.

Что нам может ещё понадобиться?

Я хочу попробовать настроить всё по простому, поэтому ещё понадобится витая пара до роутера и карта памяти Micro SD, так как на прямую на микро компьютер операционную систему установить не получится. Я нашёл у себя карту памяти на 8 гигабайт, этого объёма вполне хватит.

Итак, первым делом нужно записать образ операционной системы на карту памяти.
Для серверов я предпочитаю использовать проверенный временем Debian (да, более молодое поколение, вероятнее всего, предпочитает CentOS, но седобородые согласятся со мной, что Debian всё ещё очень хорош).

Вообще, для Orange Pi на www.orangepi.org/downloadresources существует огромное количество готовых образов, но я всё-таки схожу на www.armbian.com/download и скачаю с dl.armbian.com/orangepipcplus торрент файл с armbian (в моём случае Debian_stretch_next.7z).

У меня Orange Pi Pc Plus, у вас может быть любой другой мини компьютер, поэтому ищите соответствующий образ.

После закачки распаковываем архив и видим образ в формате img. Кто чем хочет, тем и заливает образ, лично я предпочитаю Etcher (https://etcher.io). Вставили карту памяти, выбрали её, если у вас подключено несколько носителей, нажали кнопку шить, ввели пароль если у вас на десктопе или ноутбуке тоже стоит линукс.



Карта с образом готова, можно начинать всё подключать.
Что же нам нужно, чтобы запустить и начать настраивать наш сервер?
Сам мини компьютер, интернет по Ethernet проводу и блок питания.
И всё.

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

Итак, приступим, втыкаем кабель Ethernet, карту Micro SD с образом Armbian.
Осталось только подать питание на мини компьютер.

А вот с питанием на Orange Pi всё очень печально. Что есть на нормальном мини копьютере? Правильно, Micro-USB, а как можно запитать Orange Pi? Только 5V через штырьковый разьём, который покупается отдельно.

Адаптер питания с подходящим разьёмом стоит дороже, чем просто провод со стандартным USB на конце, поэтому можно взять его.

Если нет свободного блока питания с USB (а нам надо не абы какой, а на 2 ампера), то роемся в своём ящике с проводами, адаптерами и платами для компьютеров (у вас же есть такой ящик, правда?) и находим подходящий адаптер от какого-нибудь старого, давно разбитого ребёнком планшета, перепаиваем кабель и питание для нашего сервера готово.

Ну или просто берём зарядник от старого дискового mp3 плеера iRiver (он всего 4,7 вольта и 1,2 ампера но тоже работает).

Подаём питание и мы готовы перейти, собственно говоря, к тому, ради чего всё и затевалось, к созданию интернет радиостанции.

Если вы, так же как и я, намереваетесь обойтись минимумом периферии, то нам нужно узнать какой IP адрес получил наш мини компьютер. Самым простым способом узнать его, это зайти на свой роутер и посмотреть какой IP адрес роутер дал нашему серверу (ваш роутер же умеет DHCP, правда?).

Теперь можно заходить по SSH на наш сервер. Кому какой SSH клиент удобен, тот тем и пользуется (мало ли у вас виндовс, а как там с SSH клиентами я вот вообще не в курсе).
В моём случае я просто забиваю в консоль ssh root@192.168.0.88, соглашаюсь на добавление ключа ECDSA, пароль по умолчанию для root установлен «1234», авторизовавшись мы оказываемся в консоли микрокомпьютера, который сразу же предлагает сменить пароль root.



После этого предлагается создать аккаунт непривилегированного пользователя, создаём.
По сравнению с предыдущими версиями ОС, текущая версия несколько упрощена в плане настроек и много чего уже настраивается автоматически.

У Armbian есть очень удобный инструмент настройки: armbian-config копируем команду в консоль и смотрим что нам может пригодиться.



Настройки системы нам пока что не нужны, но они могут понадобится позже, например для переноса настроенной системы с Micro SD на встроенную 8GB EMMC Flash память мини компьютера.

Нам будет полезен раздел Network, всё-таки неплохо бы иметь серверу статический IP адрес. Нашу интернет радиостанцию можно подключить к сети даже по Wi-Fi. Уровень извращённости каждый устанавливает себе сам, но если вы строите интернет радио чисто для себя и не планируется более 10 слушателей одновременно, то почему бы наш сервер и не подцепить всё-таки по Wi-Fi? В крайнем случае, воткнуть кабель Ethernet можно в любой момент.

Итак, мы определились с типом подключения, теперь нам нужно настроить статический IP адрес, для этого мы идём в настройки IP и выбираем нужный интерфейс сети, после чего мы говорим, что хотим статичный адрес, заводим его и сохраняем настройки. Менять маску и шлюз нет необходимости, так как они получены от вашего роутера по DHCP.



После того, как вы введёте новый IP адрес и нажмёте Enter, ваша SSH сессия тут же зависнет, так как сразу же у устройства появится новый IP адрес. Поэтому просто закрываем окно с терминалом и заходим на наш мини компьютер по SSH используя новый IP адрес.

Кстати, раз все функции у нас будут иметь административный характер, чтобы не писать постоянно перед каждой командой sudo, я просто авторизуюсь на мини компьютере под пользователем root.

Запустив armbian-config снова мы можем посмотреть что можно настроить ещё интересного? В разделе Personal мы можем настроить временную зону, локаль и имя хоста. Я добавил локаль ru_RU.UTF-8 UTF-8, вдруг пригодится.

Чтобы применились настройки нужно выйти из утилиты настройки, разлогиниться и зайти снова, или перезагрузить сервер командой reboot.

Я использовал команду reboot, чтобы убедиться, что настройки сохранились и сервер с ними успешно стартует.

Базовая настройка сервера произведена и почему бы не установить работающую с MicroSD ОС на внутреннюю EMMC Flash память? Конечно, если ваш мини компьютер имеет на борту эту самую память.

Для этого заходим в armbian-config — System — Install, выбираем доступный накопитель, жмём Enter, получаем привет из прошлого, соглашаемся и выбираем тип файловой системы ext4.



Теперь мы можем откинуться на спинку кресла и дожидаться пока OS перенесётся на внутренний накопитель мини компьютера.



После завершения копирования, выбираем отключить питание. Ждём пару секунд пока не погаснет светодиод на мини компьютере, выдёргиваем питание, вынимаем MicroSD карту, втыкаем питание обратно и включаем компьютер.

Да, если у вас нет внутренней памяти и вы не перенесли на неё операционную систему, вытащить MicroSD, вероятнее всего, будет не очень хорошей идеей.

После входа на наш мини компьютер по SSH и убедившись, что всё работает, можно начинать настраивать саму радиостанцию.

Первым делом обновляем информацию о пакетах, вбив apt update в консоль сервера.

Да, я люблю комфорт, поэтому устанавливаю mc командой apt install mc.
Я люблю всё делать из под mc, а если мне нужно увидеть консоль, я просто нажимаю ctrl+o.

Первым делом устанавливаем сам музыкальный плеер-демон: apt install mpd.
Вместе с ним установится куча зависимостей.

Перейдем к настройке. За конфигурацию демона отвечает файл /etc/mpd.conf, открываем его командой nano /etc/mpd.conf.

Имя моего пользователя без привилегий hzs, и мой конфигурационный файл выглядит примерно так:

music_directory         "/home/hzs/music"
playlist_directory      "/home/hzs/.mpd/playlists"
db_file                 "/home/hzs/.mpd/tag_cache"
log_file                "/home/hzs/.mpd.log"
pid_file                "/home/hzs/.mpd/pid"
state_file              "/home/hzs/.mpd/state"
sticker_file            "/var/lib/mpd/sticker.sql"

user                    "hzs"
bind_to_address         "localhost"
restore_paused "yes"

metadata_to_use "artist,title"
auto_update             "yes"

audio_output {
        type            "httpd"
        name            "My New Internet Radio Station!!!"
        encoder         "lame"                  # optional, vorbis or lame
        port            "8000"
        bind_to_address "0.0.0.0"               # optional, IPv4 or IPv6
        bitrate         "256"                   # do not define if quality is defined
        format          "44100:16:2"
}

volume_normalization    "yes"
filesystem_charset      "UTF-8"
id3v1_encoding          "UTF-8"

Тут всё понятно и без особых комментариев.

Для работы нужно создать структуру директорий из верхней части настроек. Обратите внимание, хозяином для этих директорий должен быть непривилегированный пользователь, от которого будет всё работать, в моём случае hzs.

Из под root выполняем следующие команды:

chown -cR hzs:hzs /home/hzs/music
chown -cR hzs:hzs /home/hzs/.mpd

Пора заливать музыку, у нас на сервере есть SSH, так что мы можем законнектиться любимым FTP клиентом к нашему серверу.

IP адрес нам известен, порт 22, имя пользователя и пароль те, что вы задали при создании непривилегированного пользователя, тип соединения SSH. Заливаем немного музыки для теста в директорию для музыки, указанную в конфиге.



Сейчас проигрыватель запущен с неправильным конфигом, поэтому останавливаем демона и запускаем его снова:

service mpd stop
service mpd start

Для простейшего управления демоном мы поставим консольную утилиту mpc командой apt install mpc.

После установки немного сконфигурируем проигрыватель:

mpc random on
mpc repeat on

Сейчас нужно добавить треки а плейлист, в консоли это несколько гиморройно, но ничего не поделать.

Смотрим доступные нам файлы, которые мы можем добавить в плей лист:

mpc ls

Чтобы добавить файл в плейлист, в команде mpc add мы должны указать полное имя добавляемого файла, выбор по маске не работает:

mpc add "01 Lost in Your Eyes.mp3"

Смотрим получившийся плейлист:

mpc playlist

Пора запускать нашу радиостанцию:

mpc play



Попробуем послушать, для этого в любом аудиоплеере открываем аудио поток нашей радиостанции. Для этого вводим адрес потока http://ip:port, у меня это http://192.168.0.90:8000.

Audacious играл с перебоями, была проблема с кешированием, а вот SMPlayer и VLC проблем не ощутили.







В принципе, на данном этапе наша интернет радиостанция уже работает, нужно добавить в плейлист музыки и пробросить порты на роутере, чтобы наша интернет радиостанция стала всё-таки интернет радиостанцией, а не радио в локальной сети.

У меня есть несколько доменов, так что первым делом я в настройках DNS создаю «A» запись с testradio и статическим внешним IP адресом моего роутера дома. Вам этого делать необязательно.

Далее на своём роутере я настраиваю port forwarding.

Так как у меня уже есть своя радиостанция на большом сервере, я указываю внешний исходный порт 9000, а внутренний локальный 8000, таким образом из вне радиостанция будет вещать по http://внешний_ip:9000.



Всё, теперь у нас получилась «настоящая» интернет радиостанция.

Если не хочется останавливаться на достигнутом, едем дальше.

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

Существует куча консолей управления, некоторые можно посмотреть тут, но я буду использовать Pitchfork MPD Client.

Это полноценная web морда, и да, мы будем стрелять пушкой по воробьям и поднимем полноценный http сервер на мини компьютере с нашей радиостанцией:

apt install apache2

Так же нам понадобится PHP:

apt-get install php

Ещё понадобятся

apt install php7.0-xml

и

apt install php-pear

Создаём в домашней папке директорию /home/hzs/wwwroot/pf и распаковываем в неё предварительно загруженный по SSH Pitchfork MPD Client.



В конфигурационном файле веб сервера apache2 /etc/apache2/sites-available/000-default.conf
nano /etc/apache2/sites-available/000-default.conf
всё выкашиваем и пишем (не забывая поменять «hzs» на имя своего пользователя):

<VirtualHost *:80>
    ServerName localhost
    ServerAdmin webmaster@localhost
    DocumentRoot /home/hzs/wwwroot
    <Directory /home/hzs/wwwroot/>
        Options All
        AllowOverride All
        DirectoryIndex index.php index.html index.htm
        Order Allow,Deny
        Allow from All
        Require all granted
    </Directory>
</VirtualHost>

После чего перезагружаем http сервер

service apache2 restart

Зайдя по адресу своего сервера IP/pf (в моём случае: http://192.168.0.90/pf)

Мы увидим пульт управления:



Всё достаточно просто и интуитивно понятно.

Далее нажимем на иконку папки справа и вкладку Filesystem.

Для обновления списка файлов нажимам кнопку Update DB, после чего выбираем оставшиеся файлы, которые у нас до сих пор отсутствуют в плейлисте и нажимаем кнопку Add чуть ниже.

Обновляем страницу и видим, что все файлы у нас добавились в плейлист:



Если нужно спрятать управление проигрывателем под пароль, то можно отредактировать конфигурационный файл:

nano /home/hzs/wwwroot/pf/config/config.xml

Там вполне понятная структура настроек.

Итак, у нас получился полноценный сервер интернет радиостанции размером 10*7*3 сантиметра. Конечно, используемый маломощный сервер не потянет сотни слушателей, но он как минимум не оставит вас без любимой музыки где бы вы ни были, если рядом найдётся интернет.

В принципе, можно не продолжать читать, но для особо упорных продолжаем дальше.
У нас же есть полноценный веб сервер, почему бы…
Ну вы уже поняли.

Создаём в корне нашего веб сервера директорию testradio, создаём в ней файл "index.php":

<!DOCTYPE html>
<html xmlns="https://www.w3.org/1999/xhtml" xml:lang="ru-ru" lang="ru-ru" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>My Test Radio</title>
<script src="jquery-3.3.1.min.js"></script>
</head>
<body>

	<h1>My Test Radio</h1>
	<div id="song">
		now playing:<br>
		<div id="title">now playing</div>
		<br>
		<div>
			<span id="play" type="button">Play</span>
			<span id="pause" type="button">Pause</span>
		</div>
		<br>
		<div>
			vol:<br>
			 <input id="volume" type="range" min="0" max="10" value="5" />
		 </div>
		<span id="duration"></span>
		<br>
		<div>256 kbps</div>
	</div>

<script language="JavaScript">
	var audio = new Audio('http://testradio.nisel.ru:9000');
	var play = document.getElementById('play');
	play.addEventListener('click', function() {
		audio.play();
	}, false);
	var pause = document.getElementById('pause');
	pause.addEventListener('click', function() {
	     audio.pause();
	}, false);
	var volume = document.getElementById('volume');
	volume.addEventListener('change', function(){
	    audio.volume = parseFloat(this.value / 10);
	}, false);
	audio.addEventListener("timeupdate", function() {
	    var duration = document.getElementById('duration');
	    var s = parseInt(audio.currentTime % 60);
	    var m = parseInt((audio.currentTime / 60) % 60);
	    var h = parseInt((audio.currentTime / 3600) % 60);
	    if (s < 10) s = '0' + s;
	    if (m < 10) m = '0' + m;
	    if (h < 10) h = '0' + h;
	    duration.innerHTML = h + ':' + m + ':' + s;
	}, false);
</script>

<script  language="JavaScript">  
    function show()  
    {  
        $.ajax({  
            url: "trackname.php",  
            cache: false,  
            success: function(html){  
                $("#title").html(html);  
            }  
        });  
    }
    $(document).ready(function(){  
        show();  
        setInterval('show()',5000);  
    });  
</script>
</body>
</html>

Это простейший пример создания плеера для сайта, так же он умеет выводить название текущей композиции, обновляемое с помощью ajax каждые 5 секунд.

Внешний вид можно допилить по вкусу с помощью css.

В коде видно, что аудио поток уже идёт по адресу, указанному в DNS моего домена.
Не забываем закинуть в директорию файл jquery (в моём случае jquery-3.3.1.min.js). Вообще, конечно, jquery тут перебор и можно было бы сделать ajax запрос без него, но думать оказалось совсем лень и я использовал готовый кусок кода.

Далее создаём файл "trackname.php":

<?php echo file_get_contents('http://192.168.0.90/mpc');?>

Так же в корне веб сервера создаём директорию «mpc» а в ней файл "index.php":

<?php echo exec('mpc current');?>

Зачем такие костыли могут спросить некоторые, дело в том, что в моей боевой радиостанции сервер плеера находится на одном сервере, а веб морда сайта, находится на физически другом веб сервере.



Так как опрашивать проигрываемый трек нужно непосредственно на сервере с проигрывателем, то директория веб сервера mpc должна быть на нём, а файл "trackname.php" находится на веб сервере самого сайта и подгружает файл с описанием трека с другого сервера по его IP адресу.

Сам плеер и сайт радиостанции могут находиться очень далеко друг от друга и общаться как по внешним IP адресам, так и по адресам, забитым в DNS. Чтобы всё работало, нужно всего лишь правильно пробросить порты.

Дорабатывать проект можно по своему вкусу, ну я а приятно провёл субботнюю половину дня.
Всем удачных экспериментов!

UPD2: Недельный эксперимент подошёл к своему логическому завершению и я отключаю свой мини сервер с радиостанцией.
Теги:
Хабы:
+25
Комментарии 57
Комментарии Комментарии 57

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн