По просьбе друга пытался сделать онлайн-радио. И вроде все бы ничего, но возникла необходимость транслировать и управлять многими потоками независимо друг от друга…
Для этого я выбрал следующий путь…
Пойдем по порядку.
В качестве серверной системы использую Ubuntu Server 12.10.
Первым делом ставим Icecast2:
sudo apt-get install icecast2
Далее ставим mpd:
sudo apt-get install mpd
Создадим директорию radio в корне файловой системы.
Создадим 3 файла в этой директории
- icecast.xml.default
- mpd.conf.default
- script.sh
И скопируем 2 директории из каталога /etc/icecast2/
- web
- admin
Далее необходимо отредактировать файлы настроек Icecast2 и mpd.
Файл icecast.xml.default:
<icecast>
<limits>
<clients>50</clients>
<sources>2</sources>
<threadpool>5</threadpool>
<queue-size>524288</queue-size>
<client-timeout>30</client-timeout>
<header-timeout>15</header-timeout>
<source-timeout>10</source-timeout>
<burst-on-connect>1</burst-on-connect>
<burst-size>65535</burst-size>
</limits>
<authentication>
<source-password>#2</source-password>
<relay-password>#2_relay</relay-password>
<admin-user>admin</admin-user>
<admin-password>admin_#2</admin-password>
</authentication>
<hostname>127.0.0.1</hostname>
<listen-socket>
<port>#3</port>
</listen-socket>
<mount>
<mount-name>/#1</mount-name>
</mount>
<paths>
<basedir>#0/#1/icecast2</basedir>
<logdir>#0/#1/icecast2/log</logdir>
<webroot>#0/#1/icecast2/web</webroot>
<adminroot>#0/#1/icecast2/admin</adminroot>
<pidfile>#0/#1/icecast2/icecast.pid</pidfile>
<alias source="/" dest="/status.xsl"/>
</paths>
<logging>
<accesslog>access.log</accesslog>
<errorlog>error.log</errorlog>
<loglevel>4</loglevel>
<logsize>10000</logsize>
</logging>
<security>
<chroot>0</chroot>
<changeowner>
<user>icecast</user>
<group>icecast</group>
</changeowner>
</security>
</icecast>
Разберем что значат параметры:
#0 — путь до директории пользователя
#1 — имя пользователя
#2 — пароль пользователя
#3 — порт на котором будет запущен Icecast2
Теперь отредактируем mpd.conf.default:
music_directory "#1/#2/music"
playlist_directory "#1/#2/playlists"
db_file "#1/#2/lib/tag_cache"
log_file "#1/#2/log/mpd.log"
pid_file "#1/#2/pid"
state_file "#1/#2/state"
user "mpd"
bind_to_address "127.0.0.1"
port "#5"
auto_update "yes"
audio_output {
type "shout"
name "#2 radio"
encoding "mp3"
host "localhost"
port "#4"
mount "/#2"
password "#3"
bitrate "192"
format "44100:16:2"
}
audio_output {
type "alsa"
name "fake out"
driver "null"
}
volume_normalization "yes"
filesystem_charset "UTF-8"
id3v1_encoding "UTF-8"
metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc"
Параметры mpd:
#1 — путь до директории пользователя
#2 — имя пользователя
#3 — пароль пользователя для Icecast2
#4 — порт на котором запущен Icecast2
#5 — порт для управления mpd
И последний файл — скрипт настройки:
#!/bin/bash
MAIN_DIR=/userAlias
FROM=/radio
if [ $# -lt 4 ]; then
echo "==== Не заданы параметры ===="
echo "Формат ./script.sh 'userName' 'userPassword' 'port' 'mpdPort'"
exit 1
fi
echo "<===> Начало работы скрипта <===>"
if [ ! -d "$MAIN_DIR" ]; then
mkdir $MAIN_DIR
echo " Создана главная папка для пользователей"
fi
mkdir $MAIN_DIR'/'$1
echo " Создана папка пользователя " $1
echo ""
echo "<===> Настройка icecast <===>"
cp $FROM/icecast.xml.default $MAIN_DIR'/'$1'/'icecast.xml
replace '#0' $MAIN_DIR -- $MAIN_DIR'/'$1'/'icecast.xml
replace '#1' $1 -- $MAIN_DIR'/'$1'/'icecast.xml
replace '#2' $2 -- $MAIN_DIR'/'$1'/'icecast.xml
replace '#3' $3 -- $MAIN_DIR'/'$1'/'icecast.xml
mkdir $MAIN_DIR'/'$1'/icecast2'
mkdir $MAIN_DIR'/'$1'/icecast2/log'
mkdir $MAIN_DIR'/'$1'/icecast2/web'
mkdir $MAIN_DIR'/'$1'/icecast2/admin'
cp $FROM/icecastDirs/admin/* $MAIN_DIR'/'$1'/icecast2/admin'
cp $FROM/icecastDirs/web/* $MAIN_DIR'/'$1'/icecast2/web'
touch $MAIN_DIR/$1/icecast2/log/error.log
touch $MAIN_DIR/$1/icecast2/log/access.log
chown icecast:icecast $MAIN_DIR/$1/icecast.xml
chown icecast:icecast $MAIN_DIR/$1/icecast2/log/*
echo "<===> Настройка icecast завершена <===>"
echo ""
echo "<===> Настройка mpd <===>"
cp $FROM/mpd.conf.default $MAIN_DIR'/'$1'/'mpd.conf
replace '#1' $MAIN_DIR -- $MAIN_DIR'/'$1'/'mpd.conf
replace '#2' $1 -- $MAIN_DIR'/'$1'/'mpd.conf
replace '#3' $2 -- $MAIN_DIR'/'$1'/'mpd.conf
replace '#4' $3 -- $MAIN_DIR'/'$1'/'mpd.conf
replace '#5' $4 -- $MAIN_DIR'/'$1'/'mpd.conf
mkdir $MAIN_DIR'/'$1'/music'
mkdir $MAIN_DIR'/'$1'/playlists'
mkdir $MAIN_DIR'/'$1'/lib'
mkdir $MAIN_DIR'/'$1'/log'
touch $MAIN_DIR/$1/lib/tag_cache
chmod 777 $MAIN_DIR/$1/lib/tag_cache
touch $MAIN_DIR/$1/pid
chmod 777 $MAIN_DIR/$1/pid
echo "<===> Настройка mpd завершена <===>"
echo "<===> Запуск icecast <===>"
icecast2 -b -c $MAIN_DIR'/'$1'/'icecast.xml
sleep 1s
echo "<===> Запуск mpd <===>"
mpd $MAIN_DIR'/'$1'/'mpd.conf
Если не вдаваться в подробности, то скрипт делает следующее:
- создаются директории для пользователя
- копируются файлы настроек Icecast2 и mpd
- подменяются параметры в файлах настроек
- создаются дополнительные файлы для Icecast2 и mpd
- выставляются права на файлы
- запуск Icecast2
- запуск mpd
После создания 3 файлов необходимо сделать скрипт запускаемым:
chmod 777 script.sh
И выполнить:
./script.sh radio1 password1 9001 19001
После работы скрипта будут запущены Icecast2 и mpd.
В браузере можно попробовать обратится по адресу:
<host>:9001/radio1
К сожалению произойдет ошибка… mpd сервер не запущен ( не проигрывает музыку) и музыкальных файлов нет.
Первым делом необходимо скопировать музыкальные файлы для пользователя в директорию: /userAlias/radio1/music/
Далее надо составить плейлист для пользователя — проще всего установить консольный клиент для mpd:
sudo apt-get install ncmpc
С его помощью можно подключится и управлять mpd.
Подключаемся:
ncmpc -p 19001
Сначала нужно перечитать папку music Ctrl + U
После надо нажать '3' — перейдем в режим просмотра медиатеки.
Управляя клавишами ВВЕРХ / ВНИЗ и выбираем ПРОБЕЛом песни.
Нажав '2' — просмотр плейлиста. Нажав Enter — запустим наш проигрыватель.
Если все правильно настроено, то по перейдя по адресу <host>:9001/radio1
услышим музыку из плейлиста.
Выслушаю любые конструктивные пожелания, замечания и предложения.
Автор: karazhanov