icecast

Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 866
Стаж: 5 лет 9 месяцев
Откуда: Вологодская область
Поблагодарили: 41 раз
Контактная информация:

icecast

Сообщение Артём Мамзиков »

Что мы решили сделать? Что то вроде ретранслятора потока радио.
Почему просто не дать доступ клиентам на сервис с онлайн радио? так как 1.нельзя закрыта внешка, 2. если все ломанутся слушать даже одну и туже радиостанцию нагрузка ляжет вся на внешний канал связи на инет.

Скачать мои примеры конфигураций и плееров
icecast.zip
icecast.zip
(179.24 КБ) 83 скачивания
По этому ставим icecast свободное ПО для организации потокового цифрового аудио и видеовещания.
Оф сайт Icecast
"Icecast - это сервер потокового мультимедиа, который в настоящее время поддерживает аудиопотоки Ogg Vorbis и MP3.
Его можно использовать для создания интернет-радиостанции или частного музыкального автомата, а также для многих других вещей.
Он очень универсален, поскольку относительно легко добавляются новые форматы и поддерживает открытые стандарты для связи и взаимодействия.
Icecast распространяется под лицензией GNU GPL, версия 2. Копия этой лицензии прилагается к этому программному обеспечению в файле COPYING."
Что оно нам дает?
Принимаем радио потоки с внешки и уже сами ретранслируем на своем порту во внутреннюю локальную сеть, если даже 20 пользователей будет слушать 1 и тоже радио внешний поток будет 1! т.е. нагрузка никак не увеличится.
Так же внешку инет можно совсем не использовать, подключить тюнер для фм приема и раздавать текущий эфир в сеть (можно сказать дак они и сами могут на приемнике слушать FM. не у всех есть приемник и не везде ловит сигнал и тем более если мы из одного региона в другой по своим внутренним каналам связи передаем эфир. Есть нюансы по Тюнерам быстрее всего 1 тюнер даст только одновременно одну частоту вещания т.е. если мы хотим одновременно 4 радио с fm то нужно 4 тюнера, либо устройство подороже!
На подобии принцип работы можно посмотреть тут DVB-T/T2/C USB TV-тюнеры через keenetic в IPTV

Схема
схема icecast
схема icecast
Когда то я делал что то подобное при помощи VLC на windows принимал на свой пк и раздавал этот же эфир к себе в сеть клиенты подключались через тот же VLC.

Что я еще рассматривал какое ПО (для Linux)
Серверы для потокового аудио/видео вещания
An MP3 LEnder - Небольшой сервер для организации потокового MP-вещания по сети, которое можно бу
GNUMP3d - Cервер потокового аудио с гибко настраиваемым с помощью шаблонов web-интерфейсом
MPEG4IP - Набор утилит для кодирования и потокового воспроизведения аудио и видео (использ
ShoutCast - Потоковый сервер для музыкального вещания в сети.
icecast - Потоковый мультимедийный сервер, поддерживающий аудиоформаты Ogg Vorbis и MP3
и другие.
на связке из одного компа с LibreTime и второго — принимающего. Плюс он настроил запуск рекламы по времени.
Если кратко, то его решение состоит из готовой сборки LibreTime, которая включает в себя web-админку с LiquidSoap, и с вещанием через IceCast.

Остановился я на 3х ПО ShoutCast, icecast, LibreTime.
Хотел поставить LibreTime - используется для эфира радиостанций, озвучивания торговых центров и тд.
Но сервера на Debian были уже и так нагружены более свободный был AltLinux на его LibreTime установки не было(
Выбираю между двумя бесплатными ShoutCast, icecast
Как оказалось ShoutCast имеет ограничения по бесплатной основе что мне не подходит и выбор пал на icecast.

Забегая в перед потоки радиостанций я брал прямо на сайтах просматривая код html либо с плей листа RadioSN (SlyNet) периодически меняется ссылка расположения на момент написания ссылка RadioSN (Радио более 1000 станций) Некоторые DNS имена сайтов у меля лочил PowerDNS в место имен DNS определил и прописал IP серверов радиостанций!
Обнаружил что в списке радиостанций с 8000 портом используется тот же icecast.
Например prmstrm Авто радио и многие другие радио станции!
Вологодский эфир можно взять с ГРУППА КОМПАНИЙ "ВЫБЕРИ РАДИО"
Потоки на http
Потоки на https
Плейлисты
Показать
Radio-Vologda-online2.gkvr.m3u
#EXTM3U
#EXTINF:-1 ,ВОЛОГДА АВТОРАДИО
http://online2.gkvr.ru:8000/avtoradio11_vld_64.aac
#EXTINF:-1 ,ВОЛОГДА АВТОРАДИО
http://online2.gkvr.ru:8000/avtoradio_vld_64.aac
#EXTINF:-1 ,РАДИО ШАНСОН ВОЛОГДА
http://online2.gkvr.ru:8000/chanson11_vld_64.aac
#EXTINF:-1 ,РАДИО ШАНСОН ВОЛОГДА
http://online2.gkvr.ru:8000/chanson_vld_64.aac
#EXTINF:-1 ,РАДИО DFM ВОЛОГДА
http://online2.gkvr.ru:8000/dfm11_vld_64.aac
#EXTINF:-1 ,РАДИО DFM ВОЛОГДА
http://online2.gkvr.ru:8000/dfm_vld_64.aac
#EXTINF:-1 ,РУССКОЕ РАДИО ВОЛОГДА
http://online2.gkvr.ru:8000/rusradio11_vld_64.aac
#EXTINF:-1 ,РУССКОЕ РАДИО ВОЛОГДА
http://online2.gkvr.ru:8000/rusradio_vld_64.aac
#EXTINF:-1 ,РАДИО ЮМОР FM ВОЛОГДА
http://online2.gkvr.ru:8000/yumorfm11_vld_64.aac
#EXTINF:-1 ,РАДИО ЮМОР FM ВОЛОГДА
http://online2.gkvr.ru:8000/yumorfm_vld_64.aac
#EXTINF:-1 ,Европа плюс ВОЛОГДА
https://hls-01-regions.emgsound.ru/11_v ... ylist.m3u8
#EXTINF:-1 ,Дорожное ВОЛОГДА
https://hls-01-regions.emgsound.ru/15_v ... ylist.m3u8
#EXTINF:-1 ,real-potok IP Наше радио Вологда
http://51.15.170.58/nashe-256
#EXTINF:-1 ,real-potok IP Авторадио Вологда
http://77.222.60.92:8000/avtoradio_vld_64.aac
#EXTINF:-1 ,real-potok IP Русское радио Вологда
http://185.189.12.58:8000/rusradio_vld_64.aac
#EXTINF:-1 ,real-potok IP ДФМ Вологда
http://185.189.12.58:8000/dfm_vld_64.aac
#EXTINF:-1 ,real-potok Наше радио Вологда
http://nashe1.hostingradio.ru/nashe-256
Европа плюс
выбор качества
https://hls-01-regions.emgsound.ru/11_v ... ylist.m3u8
88.212.236.148:443
Качество 96
https://hls-01-regions.emgsound.ru/11_v ... ylist.m3u8
Дорожное вологда
https://hls-01-regions.emgsound.ru/15_v ... ylist.m3u8
Переходим к Установке icecast на AltLinux!

Подготовка
apt-get install apache2
apt-get install php7 apache2-mod_php7 php7-curl php7-gd php7-json php7-zip php7-xml php7-devel php7-openssl php7-xmlreader php7-intl php7-fileinfo php7-mbstring php7-xmlrpc php7-gd2


Далее включаем модуль
a2enmod mod_php7

меняем строки так
nano /etc/httpd2/conf/sites-available/default.conf
#DocumentRoot "/usr/share/doc/indexhtml/ "
DocumentRoot "/var/www/html/"
#<Directory "/usr/share/doc/indexhtml/">
<Directory "/var/www/html/">
Дописать внизу
Alias /doc "/usr/share/doc/indexhtml/"
<Directory "/usr/share/doc/indexhtml/">
Include conf/include/Directory_html_default.conf
</Directory>

дописываем в строку
nano /etc/httpd2/conf/include/Directory_html_default.conf
#Options Includes FollowSymLinks MultiViews
Options Indexes Includes FollowSymLinks MultiViews

chkconfig httpd2 on
chmod 777 /etc/init.d/httpd2

/etc/init.d/httpd2 start
service httpd2 start

Для проверки php создадим
cat >> /var/www/html/phpinfo.php
<?php phpinfo(); ?>
ctrl+d

Перейдем по ссылке
http://IPсервера/phpinfo.php - проверяем все ли установилось что нам нужно

Icecast требует следующих пакетов:
apt-get update
apt-get install libxml2 libxml2-devel

apt install libxslt ( > = требуется версия 1.1)
apt-get install curl curl-devel (> = требуется версия 7.10)
apt-get install vorbis-tools ogg / vorbis (> = требуется версия 1.0)

apt-get install libcurl-devel libogg-devel libspeex-devel libtheora-devel libvorbis-devel libxslt-devel
apt-get install clementine-codecs-ogg

https://ftp.osuosl.org/pub/xiph/releases/vorbis/
rpm -i clementine-codecs-ogg-1.2.3-alt2.noarch.rpm
apt-get install openssl (необязательно, включить, если требуется поддержка SSL)
apt-get install make taglib taglib-devel libshout libshout-devel lame lame-devel libogg libvorbis libtheora libspeex libcurl mailcap

chmod 777 /etc/mime.types
grep mp3 /etc/mime.types - проверка
Установка из исходного кода
Показать
У меня все падал в ошибку
Чтобы построить icecast на платформе Unix, выполните следующие действия:
Скачиваем
wget http://downloads.xiph.org/releases/icec ... 4.4.tar.gz
Извлекаем
tar xvzf icecast-2.4.4.tar.gz
Переходим в извлеченную папку
cd icecast-2.4.4
Запускаем установку
./configure
make
make install
собрать и установить этот выпуск.
Установка из пакета
Скачать
wget http://ftp.altlinux.org/pub/distributio ... x86_64.rpm
Установить
rpm -i icecast-2.4.4-alt1.x86_64.rpm

Настройка конфигурации
nano /etc/icecast.xml
Пример настройки icecast.xml
Показать
<icecast>
<limits>
<clients>800</clients>
<sources>900</sources>
<threadpool>25</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-on-connect, но это позволяет быть более
конкретно о том, сколько лопнуть. Большинству людей это не понадобится
изменение по умолчанию 64К. Применяется для всех точек монтирования -->
<burst-size>65535</burst-size>
</limits>

<http-headers>
<header name="Access-Control-Allow-Origin" value="*" />
<header name="X-Robots-Tag" value="index, noarchive" />
<header name="foo" value="bar" status="200" />
<header name="Nelson" value="Ha-Ha!" status="404" />
</http-headers>

<authentication>
<!-- Источники войдите в систему с именем пользователя 'source' -->
<source-password></source-password>
<!-- Реле войдите под именем пользователя'relay' -->
<!--<relay-user>relay</relay-user>-->
<relay-password></relay-password>

<!-- Администратор входит в систему с именем пользователя, указанным ниже -->
<admin-user>admin</admin-user>
<admin-password>Radio</admin-password>
</authentication>

<!-- Раскомментируйте это, если вам нужны списки каталогов -->
<!--
<directory>
<yp-url-timeout>15</yp-url-timeout>
<yp-url>http://dir.xiph.org/cgi-bin/yp-cgi</yp-url>
</directory>
<directory>
<yp-url-timeout>15</yp-url-timeout>
<yp-url>http://www.oddsock.org/cgi-bin/yp-cgi</yp-url>
</directory>
-->

<!-- Это имя хоста или IP-адрес, которое другие люди будут использовать для подключения к вашему серверу.
Это влияет в основном на URL-адреса, генерируемые Icecast для плейлистов и yp
листинги. -->
<hostname>-VO-Radio</hostname>
<location>-VO-</location>
<admin>admin@localhost</admin>
<fileserve>1</fileserve>
<server-id>icecast 2.4.4</server-id>

<!-- Вы можете использовать эти два, если вам нужен только один слушатель -->
<!--<port>8000</port> -->
<!--<bind-address>127.0.0.1</bind-address>-->

<!-- У вас может быть несколько элементов -->
<listen-socket>
<port>4300</port>
<!--<shoutcast-mount>/live.mp3</shoutcast-mount>-->
<bind-address>192.168.175.8</bind-address>
</listen-socket>
<!--
<listen-socket>
<port>8001</port>
</listen-socket>
-->
<!--(Https порт)
<listen-socket>
<port>8443</port>
<ssl>1</ssl>
</listen-socket
-->
<!-- Попытка связи между серверами Icecast на Record -->
<!-- <master-server>92.255.66.132</master-server> -->
<!-- <master-server-port>8101</master-server-port> -->
<!-- <master-update-interval>120</master-update-interval> -->
<!-- <master-username>relay</master-username> -->
<!-- <master-password></master-password> -->
<!-- <relays-on-demand>1</relays-on-demand> -->

<!--Ретранслятор главного сервера поддерживается только между серверами Icecast-->
<!--<master-server>127.0.0.1</master-server>-->
<!--<master-server-port>8001</master-server-port>-->
<!--<master-update-interval>120</master-update-interval>-->
<!--<master-username>relay</master-username>-->
<!--<master-password>hackme</master-password>-->
<!--<relays-on-demand>0</relays-on-demand>-->

<!-- установка этого параметра делает все relay по требованию, если они не переопределены, это
полезно для главных relay, которые не имеют здесь определений <relay>.

перенаправлений может быть несколько. В данном примере
* server — имя сервера, с которого берется поток; port — сетевой порт, на котором удаленный сервер отдает поток;
mount — точка мониторования на стороне удаленного сервера, с которого берем поток;
local-mount — точка монтирования, которая будет использоваться нашим сервером для обращения к настраиваемому потоку;
on-demand — если стоит 0, сервер всегда берет поток и проигрывает его, если 1 — только при наличие активных обращений.

Значение по умолчанию равно 0 -->
<!--<relays-on-demand>1</relays-on-demand>-->

<!--
<relay>
<server>nashe1.hostingradio.ru</server> Это IP-адрес DNS сервера, который содержит точку монтирования для ретрансляции.

<port>8000</port> Это TCP-порт для сервера, который содержит точку монтирования для ретрансляции

<mount>/nashe-128.mp3</mount> Точка монтирования, расположенная на удаленном сервере. Если вы ретранслируете поток shoutcast, это должен быть /или /name.

<local-mount>/Наше Радио</local-mount> Имя, используемое для локальной точки монтирования. Так будет называться монтировка на сервере ретрансляции.
По умолчанию используется имя удаленной точки монтирования.

<username>joe</username> Источник ретранслятора может потребовать аутентификации сам, если это так, укажите здесь имя пользователя.

<password>soap</password> Источник ретранслятора может потребовать аутентификации сам, если это необходимо, укажите здесь пароль.

<relay-shoutcast-metadata>0</relay-shoutcast-metadata> Если вы ретранслируете поток Shoutcast,
вы можете указать этот индикатор, чтобы также ретранслировать метаданные (названия песен), которые являются частью потока данных Shoutcast.
По умолчанию это включено, но удаленный сервер решает, будет ли он отправлять какие-либо. 1: включено 0,: отключено

<on-demand>0</on-demand> Ретранслятор по запросу будет извлекать поток только в том случае, если есть слушатели, запрашивающие поток. 1: включено ,:0 выключенно
(по умолчанию <relays-on-demand>). Это полезно в случаях, когда вы хотите ограничить расходы на полосу пропускания, когда никто не слушает.
</relay>
-->

<relay>
<server>51.15.175.27</server>
<port>80</port>
<mount>/nashe-128.mp3</mount>
<local-mount>/nashe-radio</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

<relay>
<server>91.219.74.220</server>
<port>8000</port>
<mount>/Vanya-high.ogg</mount>
<local-mount>/radiovanya-ivanovo</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

<relay>
<server>23.105.253.228</server>
<port>80</port>
<mount>/dfm128.mp3</mount>
<local-mount>/dfm-radio</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

<relay>
<server>46.21.248.168</server>
<port>8052</port>
<mount>/europaplus256.mp3</mount>
<local-mount>/europaplus-radio</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

<relay>
<server>92.255.66.132</server>
<port>8101</port>
<mount>/rr_spb</mount>
<local-mount>/radiorecordspb</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

<relay>
<server>91.207.59.30</server>
<port>80</port>
<mount>/stream/air/aac/64/100</mount>
<local-mount>/autoradio</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

<relay>
<server>51.15.188.149</server>
<port>8064</port>
<mount>/moscow.dorognoe.mp3</mount>
<local-mount>/dorognoeradio</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

<relay>
<server>23.105.253.212</server>
<port>80</port>
<mount>/rusradio128.mp3</mount>
<local-mount>/rusradio</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>

<relay>
<server>78.140.208.20</server>
<port>8800</port>
<mount>/pfm_320</mount>
<local-mount>/piterfm</local-mount>
<on-demand>1</on-demand>
<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
</relay>



<!-- Определите раздел <mount> только в том случае, если вы хотите использовать расширенные параметры,
например альтернативные имена пользователей или пароли
<mount>
<mount-name>/example-complex.ogg</mount-name>

<username>othersource</username>
<password>hackmemore</password>

<max-listeners>1</max-listeners>
<max-listener-duration>3600</max-listener-duration>
<dump-file>/tmp/dump-example1.ogg</dump-file>
<intro>/example_intro.ogg</intro>
<fallback-mount>/example2.ogg</fallback-mount>
<fallback-override>1</fallback-override>
<fallback-when-full>1</fallback-when-full>
<charset>ISO8859-1</charset>
<public>1</public>
<stream-name>My audio stream</stream-name>
<stream-description>My audio description</stream-description>
<stream-url>http://some.place.com</stream-url>
<genre>classical</genre>
<bitrate>64</bitrate>
<type>application/ogg</type>
<subtype>vorbis</subtype>
<hidden>1</hidden>
<burst-size>65536</burst-size>
<mp3-metadata-interval>4096</mp3-metadata-interval>
<no-yp>1</no-yp>
<authentication type="htpasswd">
<option name="filename" value="myauth"/>
<option name="allow_duplicate_users" value="0"/>
</authentication>
<http-headers>
<header name="Access-Control-Allow-Origin" value="*" />
<header name="X-Robots-Tag" value="index, noarchive" />
<header name="foo" value="bar" status="200" />
<header name="Nelson" value="Ha-Ha!" status="404" />
</http-headers>
<on-connect>/home/icecast/bin/stream-start</on-connect>
<on-disconnect>/home/icecast/bin/stream-stop</on-disconnect>
</mount>

<mount>
<mount-name>/auth_example.ogg</mount-name>
<authentication type="url">
<option name="mount_add" value="http://myauthserver.net/notify_mount.php"/>
<option name="mount_remove" value="http://myauthserver.net/notify_mount.php"/>
<option name="listener_add" value="http://myauthserver.net/notify_listener.php"/>
<option name="listener_remove" value="http://myauthserver.net/notify_listener.php"/>
</authentication>
</mount>

-->

<!--
<mount type="normal"> Тип точки монтирования (по умолчанию: «нормальная»).
Монтирование типа «по умолчанию» может использоваться для указания общих значений для нескольких точек монтирования.
Обратите внимание, что точки монтирования по умолчанию не объединяются с другими блоками монтирования.
Вы получаете эти значения только в том случае, если не type="normal"существует блока монтирования, соответствующего вашей точке монтирования.

<mount-name>/example-complex.ogg</mount-name> Имя точки монтирования, для которой применяются эти настройки.
НЕ ДОЛЖЕН использоваться в случае типа монтирования «по умолчанию».

<username>othersource</username> Необязательное значение, которое задаст имя пользователя,
которое источник должен использовать для подключения с помощью этой точки монтирования.
Не устанавливайте это значение, если вы не уверены, что исходные клиенты, подключающиеся к точке монтирования,
можно настроить для отправки имени пользователя, отличного от source.
Если это значение отсутствует, используется имя пользователя по умолчанию source.

<password>hackmemore</password> Необязательное значение, которое задает пароль, который должен использовать источник для подключения
с помощью этой точки монтирования. Существует также метод аутентификации на основе URL-адреса для источников, который можно использовать вместо этого.

<max-listeners>1</max-listeners> Необязательное значение, которое задает максимальное количество слушателей, которые могут быть присоединены к этой точке монтирования.

<max-listener-duration>3600</max-listener-duration> Необязательное значение, которое устанавливает продолжительность времени,
в течение которого слушатель будет оставаться подключенным к потоку. Компонент аутентификации может переопределить это.

<dump-file>/tmp/dump-example1.ogg</dump-file> Необязательное значение, которое установит имя файла, которое будет дампом потока, проходящего через эту точку монтирования.
Это имя файла обрабатывается с помощью strftime (3). Это позволяет использовать такие переменные, как %F.

<intro>/example_intro.ogg</intro> Необязательное значение, указывающее файл, это содержимое будет отправлено новым слушателям при их подключении, но до отправки обычного потока.
Убедитесь, что формат указанного файла соответствует формату потоковой передачи. Указанный файл добавляется в корневой каталог перед открытием.

<fallback-mount>/example2.ogg</fallback-mount> запасной вариант Это необязательное значение указывает точку монтирования, в которую клиенты автоматически перемещаются,
если источник выключается или не выполняет потоковую передачу во время подключения слушателя. Только одна может быть указана в каждом монтировании и
должна ссылаться на другую точку монтирования на том же сервере, который выполняет потоковую передачу в том же потоковом формате.
Если клиенты не могут вернуться к другой точке монтирования из-за отсутствия резервного монтирования или указывает, что точка монтирования просто недоступна,
то эти клиенты будут отключены. Если клиенты возвращаются к точке монтирования, а резервное монтирование не осуществляет активную потоковую передачу,
а само определяет резервное монтирование, то вместо этого эти клиенты могут быть перемещены туда.
Этот многоуровневый откат позволяет клиентам каскадировать несколько точек монтирования.
Резервное монтирование также может указывать на файл, расположенный в корневом веб-каталоге.
Это полезно для воспроизведения предварительно записанного файла в случае прекращения потока. Он будет повторяться до тех пор, пока либо слушатель не отключится,
либо поток не станет доступным и не вернет слушателей обратно. Как правило, формат файла должен соответствовать формату потока, в противном случае могут возникнуть проблемы
с воспроизведением.
Обратите внимание, что резервный файл не рассчитан по времени, поэтому будьте осторожны, если вы собираетесь передать это. Они хороши для подчиненных потоков, но не используют
их в основных потоках, если вы это сделаете, тогда ретранслятор будет потреблять потоковые данные с большей скоростью, а слушатели на ретрансляторе в конечном итоге будут отключены.

<fallback-override>1</fallback-override> резервное переопределение
Когда этот параметр включен, это позволяет подключающемуся исходному клиенту или реле на этой точке монтирования переместить слушающих клиентов обратно из резервного монтирования.

<fallback-when-full>1</fallback-when-full> резервный при заполнении
Если установлено значение 1, это приведет к тому, что новые слушатели, когда будет достигнуто максимальное количество слушателей для точки монтирования,
будут переходить к резервному монтированию, если оно указано.

<charset>ISO8859-1</charset> Для потоков, отличных от Ogg, таких как MP3, метаданные, которые вставляются в поток, часто не имеют определенного набора символов.
Мы традиционно использовали UTF8, поскольку он позволяет использовать несколько языковых наборов на веб-страницах и в каталоге потоков, однако многие исходные клиенты для потоков
типа MP3 использовали Latin1 (ISO 8859-1) или оставляли его для любого набора символов, который используется в источнике. клиентская система.
Это несоответствие символов, как известно, вызывает проблему, поскольку движок статистики и серверы каталогов потоков хотят UTF8, поэтому теперь мы предполагаем Latin1 для потоков,
отличных от Ogg (для обработки общего случая), но вы можете указать альтернативный набор символов с помощью этой опции.
Исходные клиенты также могут указать charset=параметр для URL-адреса обновления метаданных, если они того пожелают.

<public>1</public> Параметр по умолчанию для этого -1указывает, что именно исходный клиент или ретранслятор должен определять, следует ли объявлять эту точку монтирования.
Установка 0запретит любую рекламу, а установка 1заставит ее рекламировать. Если вы используете принудительную рекламу, вам может потребоваться установить другие параметры,
перечисленные ниже, поскольку сервер YP может отказаться от рекламы, если предоставленной информации недостаточно.

<stream-name>My audio stream</stream-name> Установка этого параметра добавит указанное имя в статистику (и, следовательно, YP)
​​для этой точки монтирования, даже если исходный клиент / реле предоставит ее.

<stream-description>My audio description</stream-description> Установка этого параметра добавит указанное описание в статистику (и, следовательно, YP) ​​
для этой точки монтирования, даже если исходный клиент / реле предоставит ее.

<stream-url>http://some.place.com</stream-url> Установка этого параметра добавит указанный URL в статистику (и, следовательно, YP)
для этой точки монтирования, даже если исходный клиент / реле предоставит ее. URL-адрес обычно предназначен для направления людей на веб-сайт.

<genre>classical</genre> Установка этого параметра добавит указанный жанр в статистику (и, следовательно, YP) ​​для этой точки монтирования,
даже если исходный клиент / реле предоставляет ее. Это может быть что угодно, использование определенных ключевых слов может помочь при поиске в каталогах YP.

<bitrate>64</bitrate> Установка этого параметра добавит указанный битрейт в статистику (и, следовательно, YP) ​​для этой точки монтирования,
даже если исходный клиент / реле предоставит ее. Это указано в кбит / с.

<type>application/ogg</type> Установка этого параметра добавит указанный тип mime в статистику (и, следовательно, YP) ​​для этой точки монтирования,
даже если исходный клиент / реле предоставляет ее. Маловероятно, что это понадобится.

<subtype>vorbis</subtype> Установка этого параметра добавит указанный подтип в статистику (и, следовательно, YP) ​​для этой точки монтирования.
Подтип действительно помогает серверу YP идентифицировать компоненты типа. Пример настройки: vorbis / theora действительно указывают кодеки в потоке Ogg.

<burst-size>65536</burst-size> Этот необязательный параметр позволяет указать размер пакета, который переопределяет размер пакета по умолчанию, определенный в пределах. Значение в байтах.

<mp3-metadata-interval>4096</mp3-metadata-interval> Этот необязательный параметр указывает, какой интервал в байтах существует между обновлениями метаданных в потоках, совместимых с shoutcast.
Это применимо только к новым слушателям, подключающимся к этой точке монтирования, а не к существующим слушателям, возвращающимся к этой точке монтирования.
По умолчанию используется либо жестко заданный сервер по умолчанию, либо значение, переданное от реле

<hidden>1</hidden> Включите это, чтобы предотвратить отображение этого монтирования на страницах xsl. Это в основном для случаев, когда настроено локальное реле,
и вы не хотите, чтобы источник локального реле отображался.

<no-yp>1</no-yp>
<authentication type="htpasswd">
<option name="filename" value="myauth"/>
<option name="allow_duplicate_users" value="0"/>

</authentication> Это указывает на то, что для указанной точки монтирования потребуется аутентификация слушателя (или источника).
В настоящее время мы поддерживаем схему аутентификации на основе файлов ( type=htpasswd) и пересылку запросов аутентификации на основе URL.
Точка монтирования, настроенная с помощью аутентификатора, будет отображать красный ключ рядом с именем точки монтирования на экранах администратора.
Вы можете узнать больше об аутентификации слушателя и аутентификации источника на основе URL-адресов здесь .

<http-headers> Этот элемент помещается в любом месте раздела монтирования конфигурации icecast.
Он будет содержать <header>дочерние элементы, которые один за другим определяют фактические заголовки HTTP.

header Этот тег определяет фактический заголовок, который будет отправлен HTTP-клиенту в ответ на каждый запрос для этой точки монтирования,
но в настоящее время только в том случае, если код состояния HTTP равен «200». Этот тег может содержать следующие атрибуты
name является обязательным, и его значение определяет имя поля заголовка HTTP.
value является обязательным, и его значение определяет значение поля заголовка HTTP.

<header name="Access-Control-Allow-Origin" value="*" />
<header name="X-Robots-Tag" value="index, noarchive" />
<header name="foo" value="bar" status="200" />
<header name="Nelson" value="Ha-Ha!" status="404" />
</http-headers>

<on-connect>/home/icecast/bin/stream-start</on-connect> Укажите программу, которая запускается при запуске исходного кода. Ему передается параметр,
который представляет собой имя запускаемой точки монтирования. Обработка потока не дожидается завершения скрипта.
Следует проявлять осторожность, поскольку существует небольшая вероятность того, что дескрипторы потоковых файлов будут перепутаны с дескрипторами файлов сценариев,
если номера FD превышают 1024. Этот вопрос будет рассмотрен в следующем выпуске Icecast. Эта опция недоступна в Win32.

<on-disconnect>/home/icecast/bin/stream-stop</on-disconnect> Укажите программу, которая запускается при завершении исходного кода.
Ему передается параметр, который является именем завершившейся точки монтирования. Обработка потока не дожидается завершения скрипта.
Следует проявлять осторожность, поскольку существует небольшая вероятность того, что дескрипторы потоковых файлов будут перепутаны с дескрипторами файлов сценариев,
если номера FD превышают 1024. Этот вопрос будет рассмотрен в следующем выпуске Icecast. Эта опция недоступна в Win32.
</mount>
-->

<fileserve>1</fileserve>

<!-- установите точку монтирования для источника shoutcast для использования, если нет, то по умолчанию
указан параметр /stream, но вы можете изменить его здесь, Если есть альтернатива
разыскивается или требуется продлени
<shoutcast-mount>/live.nsv</shoutcast-mount>
-->

<paths>
<!-- базовый каталог используется только в том случае, если включен chroot -->
<basedir>/var/lib/icecast</basedir>

<!-- Обратите внимание, что если <chroot> включен ниже, то эти пути должны быть оба
относитесь к новому root, а не к исходному корню root -->
<logdir>/var/lib/icecast/logs</logdir>
<webroot>/var/lib/icecast/web</webroot>
<adminroot>/var/lib/icecast/admin</adminroot>
<pidfile>/var/run/icecast/icecast.pid</pidfile>
<!--
<allow-ip>/path/to/ip_allowlist</allow-ip>
<deny-ip>/path_to_ip_denylist</deny-ip>
<ssl-certificate>/path/to/certificate.pem</ssl-certificate>
<ssl-allowed-ciphers>ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS</ssl-allowed-ciphers>
-->

<!-- Псевдонимы: обрабатывайте запросы на путь "Источник source" как на путь "dest"
Может быть сделан специфичным для порта или связанного адреса с помощью "порта port"
и атрибуты "привязка-адрес bind-address".
-->
<!--
<alias source="/foo" dest="/bar"/>
-->
<!-- Псевдонимы: также могут быть использованы для простых перенаправлений,
этот пример перенаправит все запросы на http://server:port/ to
страница состояния
-->
<alias source="/" dest="/status.xsl"/>
</paths>

<logging>
<accesslog>access.log</accesslog>
<errorlog>error.log</errorlog>
<playlistlog>playlist.log</playlistlog>
<loglevel>1</loglevel> <!-- 4 Отладки, 3 Информации, 2 Предупреждения, 1 Ошибка -->
<logsize>10000</logsize> <!-- Максимальный размер файла журнала -->
<!-- Если logarchive включен (1), то при достижении logsize
файл журнала будет перемещен в [error|access|playlist].бревно.Метка даты,
в противном случае он будет перемещен в [error|access|playlist].бревно.старый.
По умолчанию используется неархивный режим (т. е. перезапись)
-->
<!-- <logarchive>1</logarchive> -->
</logging>

<security>
<chroot>0</chroot>
<changeowner>
<user>icecast</user>
<group>icecast</group>
</changeowner>
</security>
</icecast>
Запустить вручную тест запуска
icecast -c /path/to/icecast.xml
или
icecast -b -c /etc/icecast.xml

Если ошибка более подробно xmllint icecast.xml

Разрешить порты 8000 и 8001

Если все ок можно попробовать зайти веб интерфейс http://IP-сервера : и порт который указали в конфигурации обычно 8000

Добавить в автозагрузку
chkconfig --add icecast
chkconfig icecast on или chkconfig icecast2 on


3 команды старта
service icecast start
systemctl start icecast
/etc/rc.d/init.d/icecast start

Просмотр ошибок в журнале
journalctl -xn

После изменения конфига перечитываем сервисы
systemctl --system daemon-reload

Проверка пользователя
su - icecast -s /bin/bash
export PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin

Служба запускается от пользователя icecast у меня тут были некоторые проблемы
Запускаю вручную от root все ок запускается работает от пользователя icecast
Запускаю как службу или останавливаю все вроде работает но никак не реагирует пишет запущенно веб интерфейс не досупен запускаю командой пытаюсь остановить службой пишет остановлено веб интерфейс работает надо убивать процесс.

У меня была ошибка
[icecast@RAJONPROXY ~]$ icecast -b -c /etc/icecast.xml
Starting icecast2
Detaching from the console
[icecast@RAJONPROXY ~]$ [2020-10-05 11:33:54] WARN CONFIG/_parse_root Warning, server version string override detected. This may lead to unexpected client software behavior.
WARNING: Cannot change server root unless running as root.
FATAL: could not open error logging (/logs/error.log): No such file or directory
FATAL: could not open access logging (/logs/access.log): No such file or directory
FATAL: could not open playlist logging (/logs/playlist.log): No such file or directory
FATAL: Could not start logging

в файле /etc/icecast.xml
Отключил
<chroot>0</chroot>

И прописал полный путь
<logdir>/var/lib/icecast/logs</logdir>
<webroot>/var/lib/icecast/web</webroot>
<adminroot>/var/lib/icecast/admin</adminroot>
<pidfile>/var/run/icecast/icecast.pid</pidfile>


./var/lib/icecast - вебка
./etc/rc.d/init.d/icecast - конфиг службы
chmod 777 -R icecast
chmod 777 /etc/rc.d/init.d/icecast
chmod 777 /etc/icecast.xml

mkdir /var/run/icecast
chmod 777 /var/run/icecast
chmod 777 -R /var/lib/icecast

Что то корректно не отрабатывал chroot>1</chroot по идее он должен был задать корневую папку /var/lib/icecast
<!-- базовый каталог используется только в том случае, если включен chroot -->
<basedir>/var/lib/icecast</basedir>
И все остальные пути он бы увидел и ошибки бы не было так как папка icecast была бы для него корнем и при попытке что либо взломать через icecast максимально можно было попасть в папку icecast что более безопастно.
О работе chroot можно почитать отдельно.

Возможно кому то поможет Не есть хорошо но служба работает не корректно в некоторых случаях без прав добавляем пользователя в группу root
usermod -a -G root icecast

Имя пользователя может быть icecast2

Просмотреть пользователей
cat /etc/passwd
icecast2:x:104:106::/usr/share/icecast2:/usr/sbin/nologin
Группы
cat /etc/group
icecast:x:106:

Вид веб интерфейса переведен на русский
ICECAST Статус
ICECAST Статус
ICECAST Инфо
ICECAST Инфо
ICECAST Администратор
ICECAST Администратор
ICECAST Список точек монтирования
ICECAST Список точек монтирования
У меня используется как ретранслятор потока, можно сделать свой поток из локальных файлов аудио или своего эфира поставив дополнительное ПО, так же делать врезку в текущие потоки или перенос пользователей из потока в поток.
То что не поддерживает MP3 версия это просто нужно поправить строку в файле status.xsl
xsl:if test="server_type and ((server_type = 'application/ogg') or (server_type = 'audio/ogg') or (server_type = 'audio/mp3') or (server_type = 'audio/mpeg'))">
Сделано так что некоторые браузеры из за лицензии не поддерживаю не воспроизводят mp3 и у пор сделан на ogg поток!
icecastplyer.jpg
icecastplyer.jpg

Использование https ssl
Пример использование на Windows ssl
Показать
Для теста можно получить бесплатный сертификат Например тут
Сертификат должен быть выдан та тоже доменное имя на каком работает icecast
например http://radiotest.ru то и сертификат должен быть выпущен на radiotest.ru , а не какое ни будь другое например radioyo.ru так ssl работать не будет.
Далее сертификат должен быть в расширении .pem быстрее всего он сразу в таком и сгенерируется, но если будет .cer, .crt, и .key
нужно конвертировать в .pem Как очень много информации в интернете Пример

После того как получен .pem сертификат прописываем его в конфигурацию в файл icecast.xml так же прописываем контрольную сумму сертификата ssl-allowed-ciphers (не обязательно жестко задает какой сертификат использовать по совпадению контрольной суммы в файле сертификата)

<paths>
<ssl-certificate>C:\Program Files (x86)\Icecast\icecast.pem</ssl-certificate> (путь к сертификату в папке icecast)

<ssl-allowed-ciphers>ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS</ssl-allowed-ciphers>
<alias source="/foo" dest="/bar"/>

</paths>

Перезапускаем icecast
Заходим уже по https://
и видим вебка открылась https:// а потоков нет, потоки остались на http://

Для того чтобы перевести потоки на https:// нужно добавить порт к потокам для ssl будет использоваться 2 порта: 1 обычный http 8000 и 2 будет https 8443 (при желании обычный можно будет отключить)

listen-socket> (http порт оставил, т.к. радио крутится в каталогах типа PCradio)
<port>8000</port>
</listen-socket>

<listen-socket> (Https порт)
<port>8443</port>
<ssl>1</ssl>
</listen-socket

Порты указываете какие нравятся главное чтоб они были разные не пересекались между собой
Перезапускаем icecast и пробуем по https://
Пример https://radiotest.ru:8443 должны появится потоки на радио пример https://radiotest.ru:8443/наш поток

Если не выводятся логи можно попробовать прописать полный путь до лог файла
<basedir>C:/Program Files (x86)/Icecast/</basedir>
<logdir>C:/Program Files (x86)/Icecast/logs</logdir>
<pidfile>C:/Program Files (x86)/Icecast/icecast.pid</pidfile>
<webroot>C:/Program Files (x86)/Icecast/web</webroot>
<adminroot>C:/Program Files (x86)/Icecast/admin</adminroot>
<allow-ip>/path/to/ip_allowlist</allow-ip>
<deny-ip>/path_to_ip_denylist</deny-ip>

Еще пример

Обратите внимание, что это сделает ваш поток доступным на порту 443 вместо 8000. Некоторые клиенты (например, facebookexternalhit / 1.1) могут попытаться завязать поток, поскольку думали, что это https-URL, ожидающий подключения. Это может быть не то поведение, которого вы ожидаете или желаете.

У кого то не получилось
Icecast, работающий по адресу http://vgsound.online:8085/stream.ogg и это нормально, но мы хотим, чтобы это выполнялось через https. Как описано ранее, здесь не задействован веб-сервер, и мы запускаем все наши службы, размещенные нами сами. Icecast прямо из коробки.
Теперь нам удалось получить файлы для SSL от SSL for Free / Letsencrypt, в результате чего мы получили три разных файла: ca_bundle.crt, certificate.crt и private.key. Сертификат сделан для домена vgsound.online.
Теперь нужно запустить поток для https://vgsound.online:8085/stream.ogg . В файле config.xlm мы безуспешно перепробовали всевозможные комбинации.
Подскажите, пожалуйста, что делать. У нас есть все ингредиенты, но мы не знаем, как это запустить.

Я вижу проблему в том, что Icecast для Windows не поддерживает SSL.
Возможно, вам придется вставить прокси, который может передавать ogg и делать это безопасно.
Или используйте другой операционной системой.

сертификата icecast.pem.
(Для создания последнего нужно скопировать содержимое файлов fullchain.pem и privkey.pem, открыв их текстовым редактором, в один файл и сохранить его под именем icecast.pem.) Необходимо убедиться, что в файле icecast.xml прописаны два порта: один для http-соединения (8000), другой для защищенного https-соединения (8443). Строки с указанием пути к SSL-сертификату и указанием https-порта необходимо раскомментировать. В файле вместо ssl может быть прописано tls — разницы я не увидел.

Совместимость с Icecast и Icecast-KH
Icecast 2.4, 2.5 и Icecast-KH используют немного другой синтаксис для настройки своих SSL-сертификатов. RSAS совместим со всеми тремя форматами, что упрощает обновление с любого из них.

<!--<ssl-certificate>/path/to/certificate.pem</ssl-certificate> <!--Путь к вашему файлу сертификата SSL / TLS (в формате PEM) с привязанной к нему цепочкой сертификатов.-->
<ssl-allowed-ciphers>ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS</ssl-allowed-ciphers> --> <!--(Необязательно) Список разрешенны
<!--<ssl-certificate>.pem</ssl-certificate>--> <!--PEM-файл, содержащий сертификат сервера. Сюда может входить пакет, но это не обязательно.-->
<!--<ssl-private-key>.pem</ssl-private-key> --> <!--Ключевой файл, предоставленный подписывающим органом-->
<!--<ssl-cafile></ssl-cafile>--> <!--Часто это предоставляется как часть библиотеки SSL, но при необходимости вы можете указать другую-->
<!--<ssl-dhparams></ssl-dhparams>--> <!--((Необязательно) Файл параметров Диффи-Хеллмана для определенных наборов шифров.-->

Начиная с 2.4.0-kh5 речь о сборке KH
автоматическое определение SSL-соединений во входящих сокетах.
Теперь нет необходимости в <ssl> в listen-socket, но он все еще существует для обеспечения совместимости.
добавьте <ssl-private-key> в разделе <paths>, чтобы разрешить использование комбинированного PEM или отдельных файлов SSL-ключей/сертификатов.
выберите URL-адрес https/http в автоматически сгенерированном m3u на основе входящего запроса.

По раздельности не заработало
<ssl-certificate>/etc/letsencrypt/live/домен/fullchain.pem</ssl-certificate>
<ssl-private-key>/etc/letsencrypt/live/домен/privkey.pem</ssl-private-key>
`privkey.pem`: закрытый ключ для вашего сертификата.
`fullchain.pem`: файл сертификата, используемый в большинстве серверных программ. (крнневой + серт)
`chain.pem` : используется для сшивания OCSP в Nginx >=1.3.7.
`cert.pem` : нарушает работу многих конфигураций сервера и не должен использоваться без ознакомления с дополнительной документацией.

[2024-04-06 16:27:59] WARN connection/get_ssl_certificate Invalid cert file /etc/letsencrypt/live/домен/icecast.pem (system lib)
[2024-04-06 16:27:59] INFO connection/get_ssl_certificate No SSL capability on any configured ports
Недействительный файл сертификата /etc/letsencrypt/live/домен/fullchain.pem (системная библиотека)
Нет поддержки SSL на любых настроенных порта


Объединяем в 1 файл сертификаты и ключ (на примере бесплатного 90 дневного сертификата) и даем права
cat /etc/letsencrypt/live/домен/fullchain.pem > /etc/icecast/icecast.pem
cat /etc/letsencrypt/live/домен/privkey.pem >> /etc/icecast/icecast.pem
chown icecast2:icecast /etc/icecast/icecast.pem

В конфигурации
<ssl-certificate>/etc/icecast/icecast.pem</ssl-certificate>
<ssl-allowed-ciphers>ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS</ssl-allowed-ciphers>
Перезапуск cron если не используется служба
kill-icecast.sh

Код: Выделить всё

#!/bin/bash

# Получаем основной PID процесс icecast, без дочерних.
icecastpid=$(pgrep -fo "icecast")
if [ -n "$icecastpid" ]; then
echo "Завершаем процесс icecast" "$icecastpid"
kill -15 $icecastpid &
sleep 5
echo "Запускаем обратно icecast"
icecast -b -c /etc/icecast.xml &
else
echo "Запускаем icecast"
icecast -b -c /etc/icecast.xml &
fi

#pgrep -fo "icecast"|xargs -I {} bash -c 'if [ -n {} ]; then kill -9 {} >/dev/null & |sleep 5|icecast -b -c /etc/icecast.xml &; else icecast -b -c /etc/icecast.xml &; fi'


# Проверим еще раз что процесс завершился несколько раз)
#ps -e|grep -Ei "icecast"| awk '{print $1}'|xargs -I {} bash -c 'if [ -n {} ]; then kill -9 {} >/dev/null; else start; fi'
#ps -e|grep -Ei "icecast"| awk '{print $1}'|xargs -I {} bash -c 'if [ -n {} ]; then kill -9 {} >/dev/null; else start; fi'
#ps -e|grep -Ei "icecast"| awk '{print $1}'|xargs -I {} bash -c 'if [ -n {} ]; then kill -9 {} >/dev/null; else start; fi'

#linkspid=`ps -e|grep -Ei "icecast"| awk '{print $1}'`
# Завершим процесс
#kill "${linkspid}"
#kill -15 "${linkspid}"
#kill -9 "${linkspid}"
#kill -TERM "${linkspid}"
#kill -KILL "${linkspid}"
количество слов: 2982
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 866
Стаж: 5 лет 9 месяцев
Откуда: Вологодская область
Поблагодарили: 41 раз
Контактная информация:

icecast

Сообщение Артём Мамзиков »

Перевод различные настройки проверки
Показать
Каждый сервер Icecast может содержать несколько трансляций (или точек монтирования), каждая из которых содержит отдельный поток контента. «Точка монтирования» - это уникальное имя на вашем сервере, идентифицирующее конкретный поток - оно выглядит как имя файла, например «/stream.ogg». Слушатель может одновременно прослушивать только одну точку монтирования. Это означает, что у вас может быть один сервер Icecast, содержащий либо несколько трансляций с разным контентом, либо, возможно, одну и ту же трансляцию, но с потоками с разным битрейтом или качеством. В этом случае каждая трансляция или поток представляет собой отдельную точку монтирования.
На этом этапе описанные здесь шаги относятся к версии Icecast для Unix или Win32 для консоли. Icecast также доступен в версии с графическим интерфейсом пользователя Win32, и шаги настройки аналогичны, но не совсем одинаковы.
Первым шагом в этом процессе является поиск и установка самого сервера Icecast2. Как это сделать, в этой документации не говорится. После установки у вас должен быть бинарный файл Icecast и 3 каталога.
conf
Содержит файл конфигурации Icecast ( icecast.xml), который определяет все параметры конфигурации для сервера.
admin
Содержит файлы xslt, которые используются сервером Icecast для предоставления веб-интерфейса к возможностям администрирования сервера.
logs
Это пустой каталог, который (если он указан в файле конфигурации) будет содержать все журналы (их 2) для Icecast.
Следующим шагом является редактирование icecast.xmlфайла и установка соответствующих значений. Большинство указанных значений в примерах подходят, для базовой настройки следует указать следующие записи и, при необходимости, изменить их в соответствии с вашей ситуацией:

<hostname>- DNS-имя или IP-адрес, используемые для списков потокового каталога.
<source-password>- Будет использоваться для аутентификации исходного клиента.
<admin-password>- Будет использоваться для аутентификации административных функций Icecast.
<listen-socket>(порт и адрес привязки)

После изменения файла конфигурации вы сможете запустить сервер с помощью следующей команды

icecast -c /path/to/icecast.xml
Если сообщения об ошибках не появляются, проверьте error.logфайл на наличие сообщения «сервер запущен», оно будет выглядеть примерно так:

[2003-10-31 13:04:49] INFO main/main.c Icecast 2.3.0 server started
Вы можете заметить небольшие изменения в строке выше, время, несомненно, будет другим, а на некоторых платформах оно main.cбудет просто основным, но ключевым моментом здесь является то, что сервер запущен, ведение журнала работает и отображается версия.

Кроме того, можно проверить , что он начал, посетив следующий URL: http://yourip:port/admin/stats.xml. Вам будет предложено ввести имя пользователя и пароль. Введите имя пользователя adminи пароль, для которого вы ввели <admin-password>. Если все в порядке, вы должны увидеть небольшое XML-дерево, которое представляет статистику Icecast (подробнее об этом позже).

Теперь, когда сервер Icecast запущен, вы должны настроить исходный клиент. Информация, которая вам понадобится для исходного клиента, следующая:

IP-адрес и порт сервера icecast - оба взяты из <listen-socket>
исходного пароля - из<source-password>

Кроме того, вам нужно будет выбрать точку монтирования и указать ее в исходном клиенте. Icecast не нужно знать о каждой точке монтирования (хотя вы можете настроить параметры для конкретной точки монтирования - это описано в разделе «Расширенная конфигурация»), однако есть некоторые моменты, которые следует упомянуть относительно точек монтирования. Все потоки Ogg Vorbis должны иметь точки монтирования, заканчивающиеся на .ogg(i, e. /mystream.ogg). Это происходит из-за того, что большинство медиаплееров лениво определяют тип потока. Потоки MP3 обычно не содержат расширения (/ mystream). Точки монтирования также не должны содержать никаких пробелов или нечетных символов (опять же из-за ленивого кодирования многих медиаплееров).

После настройки исходного клиента вы сможете подключить его к серверу Icecast. Убедитесь, что он подключен, нажав URL-адрес stats.xml, упомянутый выше.

Теперь, когда у вас есть источник подключаемого, слушая поток включает в себя просто открыв соответствующий следующий URL в браузере: http://yourip:port/mounpoint-you-specified. Так, например, если вы подключили исходный клиент к серверу icecast, расположенному в 192.0.2.23:8000с точкой монтирования /mystream.ogg, то вы откроете: http://192.0.2.23:8000/mystream.oggили http://192.0.2.23:8000/mystream.ogg.m3u. Обратите внимание, что URL-адрес с .m3uрасширением будет служить ссылкой, которая открывает большинство медиаплееров. Также важно отметить, что m3u не обязательно должен содержать только поток MP3, он может содержать потоки произвольного типа контента и используется Icecast для обслуживания списка воспроизведения, который представляет вашу трансляцию для слушающих клиентов. В качестве альтернативы вы можете открыть URL-адрес потока прямо в вашем медиаплеере ( http://192.0.2.23:8000/mystream.oggв этом случае)

"настройка" Настройка веб-серверов Apache 2.4.4 адаптироваться ко многим видам систем.




Использование: ./configure [OPTION]... [ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ]...
Для назначения переменных окружения (например, CC, CFLAGS...), укажите их как
VAR=ЗНАЧЕНИЕ. Ниже приведены описания некоторых полезных переменных.
Значения по умолчанию для параметров указаны в скобках.
Конфигурация:
-h, --help отобразите эту справку и выйдите
--справка=короткие параметры отображения, характерные для данного пакета
--help=рекурсивное отображение краткой справки по всем включенным пакетам
-V, --version отображение информации о версии и выход
-q, --quiet, --silent do not print `проверка ...' сообщения
--кэш-файл=файл результаты теста кэша в файл [гостей с ограниченными физическими]
-C, --config-cache псевдоним для `--cache-file=config.кэш'
-n, --no-create не создавать выходные файлы
--srcdir=DIR найдите источники в DIR [configure dir or `..']

Каталог установки:
--префикс=префикс архитектурно-независимые файлы установки в приставку
[/usr/local]
--exec-prefix=EPREFIX установка архитектурно-зависимых файлов в EPREFIX
[ПРЕФИКС]

По умолчанию, сделать установить установите все файлы в
`/usr/local/bin', `/usr/local/lib' и т. д. Вы можете указать
установочный префикс, отличный от `/usr/local', использующий `--prefix',
например, `--prefix=$HOME'.

Для лучшего контроля используйте следующие параметры.
Тонкая настройка установочных каталогов:
--bindir=DIR пользовательские исполняемые файлы [EPREFIX/bin]
--sbindir=DIR исполняемые файлы системного администратора [EPREFIX/sbin]
--libexecdir=исполняемые файлы программы DIR [EPREFIX/libexec]
--sysconfdir=DIR только для чтения данных одной машины [префикс/etc]
--sharedstatedir=DIR модифицируемая архитектура-независимые данные [префикс/com]
--localstatedir=DIR модифицируемые одномашинные данные [префикс/var]
--runstatedir=DIR модифицируемые данные для каждого процесса [LOCALSTATEDIR/run]
--libdir=библиотеки объектного кода DIR [EPREFIX/lib]
--includedir=DIR C заголовочные файлы [префикс/включить]
--oldincludedir=DIR C заголовочные файлы для не-gcc [/usr/include]
--datarootdir=DIR Arch только для чтения.-независимый корень данных [префикс/доля]
--datadir=DIR архитектура только для чтения-независимые данные [DATAROOTDIR]
--infodir=DIR info documentation [DATAROOTDIR/info]
--localedir=DIR locale-зависимые данные [DATAROOTDIR/locale]
--mandir=DIR man documentation [DATAROOTDIR/man]
--docdir=DIR documentation root [DATAROOTDIR/doc/icecast]
--htmldir=DIR html документация [DOCDIR]
--dvidir=DIR dvi документация [DOCDIR]
--pdfdir=DIR pdf документация [DOCDIR]
--psdir=DIR ps documentation [DOCDIR]

Название программы:
--программы-префикс=префикс, добавляемый префикс установлены имена программ
--program-suffix=суффикс добавление суффикса к именам установленных программ
--программы-преобразование-имя=программа запустить программу СЭД на установленные имена программ

Тип системы:
--сборка=сборка настройка Для дом на сборке догадались]
--host=HOST cross-compile для сборки программ для запуска на хосте [BUILD]

дополнительная функция:
--отключить-вариант-проверка игнорировать нераспознанные опции --Enable/--с нужным
--disable-FEATURE do not include FEATURE (то же самое, что --enable-FEATURE=no)
--включение-функция[=АРГ] включить функцию [АРГ=да]
--включить-молчит-правила менее подробного вывода сборки (отменить: "принять в=1")
--отключить-молчание-правила построения подробного вывода (отменить: "сделать V=0")
--включить-сопровождающий-режим
включить сделать правила и зависимости не полезными (и
иногда сбивает с толку) для случайного установщика
--включить-отслеживание зависимостей
не отвергайте медленные экстракторы зависимостей
--отключить-отслеживание зависимостей
ускоряет одноразовую сборку
--включить-общий[=ПКГС] построить разделяемые библиотеки [по умолчанию=да]
--включить статический[=ПКГС] построить статические библиотеки [по умолчанию=да]
--позволяют быстро установить[=ПКГС]
оптимизация для быстрой установки [по умолчанию=да]
--disable-libtool-lock избегайте блокировки (может нарушить параллельную сборку)
--disable-largefile опустить поддержку больших файлов
--отключить-отключить поддержку каталога гг гг

дополнительный пакет:
--с-пакет[=АРГ] использовать [АРГ=да]
--без-пакета не используйте пакет (то же самое, что --with-PACKAGE=no)
--с-пос[=ПКГС] старайтесь использовать только пик/не пик объектов [по умолчанию=использовать
оба]
--with-aix-soname=aix|svr4|both
вариант управления версиями общей библиотеки (он же "SONAME") для
предоставьте на AIX, [default=aix].
--with-gnu-ld предположим, что компилятор C использует GNU ld [default=no]
--with-sysroot[=DIR] Поиск зависимых библиотек внутри DIR (или
sysroot компилятора, если он не указан).
--with-xslt-config=PATH используйте xslt-config в PATH, чтобы найти libxslt
--with-ogg=PREFIX префикс, в котором установлен libogg (необязательно)
--with-vorbis=PREFIX префикс, в котором установлен libvorbis (необязательно)
--with-theora=PREFIX префикс, в котором установлена libtheora (необязательно)
--with-speex=PREFIX префикс, в котором установлен libspeex (необязательно)
--с-скручиваемость=pfx-файлы с префиксом, где установлен libcurl использует это (опционально)
--с-скручиваемость-конфиг=завиток-конфиг
Используйте curl-config, чтобы найти libcurl
--с префиксом-openssl=PFX, где установлен openssl (необязательно)

Некоторые влиятельные переменные окружения:
Команда компилятора CC C
Уровне, с флагами компилятора
Флаги компоновщика LDFLAGS, например-L<lib dir>, если у вас есть библиотеки в a
нестандартный каталог <lib dir>
Библиотеки библиотеки пройти, чтобы компоновщик, например,- л<библиотеки>
CPPFLAGS (Objective) флаги препроцессора C/C++, например -I<include dir> if
у вас есть заголовки в нестандартном каталоге <include dir>
LT_SYS_LIBRARY_PATH
Определяемый пользователем путь поиска библиотеки во время выполнения.
Препроцессор CPP C
XSLTCONFIG программа настройки XSLT
OGG_PREFIX путь к установке ogg
VORBIS_PREFIX
путь к установке vorbis
И многие пути и многие другие установки
Путь к установке кодек Speex кодек Speex

Используйте эти переменные, чтобы переопределить выбор, сделанный "configure", или помочь
это для поиска библиотек и программ с нестандартными именами/местоположениями.

Сообщайте об ошибках в <icecast@xiph.org>.

<relay>
<server>nashe1.hostingradio.ru</server> Это IP-адрес сервера, который содержит точку монтирования для ретрансляции.

<port>80</port> Это TCP-порт для сервера, который содержит точку монтирования для ретрансляции

<mount>/nashe-128.mp3</mount> Точка монтирования, расположенная на удаленном сервере. Если вы ретранслируете поток shoutcast, это должен быть /или /name.

<local-mount>/Наше Радио</local-mount> Имя, используемое для локальной точки монтирования. Так будет называться монтировка на сервере ретрансляции.
По умолчанию используется имя удаленной точки монтирования.

<username>joe</username> Источник ретранслятора может потребовать аутентификации сам, если это так, укажите здесь имя пользователя.

<password>soap</password> Источник ретранслятора может потребовать аутентификации сам, если это необходимо, укажите здесь пароль.

<relay-shoutcast-metadata>0</relay-shoutcast-metadata> Если вы ретранслируете поток Shoutcast,
вы можете указать этот индикатор, чтобы также ретранслировать метаданные (названия песен), которые являются частью потока данных Shoutcast.
По умолчанию это включено, но удаленный сервер решает, будет ли он отправлять какие-либо. 1: включено 0,: отключено

<on-demand>0</on-demand> Ретранслятор по запросу будет извлекать поток только в том случае, если есть слушатели, запрашивающие поток. 1: включено ,:0 выключенно
(по умолчанию <relays-on-demand>). Это полезно в случаях, когда вы хотите ограничить расходы на полосу пропускания, когда никто не слушает.
</relay>


<mount type="normal"> Тип точки монтирования (по умолчанию: «нормальная»).
Монтирование типа «по умолчанию» может использоваться для указания общих значений для нескольких точек монтирования.
Обратите внимание, что точки монтирования по умолчанию не объединяются с другими блоками монтирования.
Вы получаете эти значения только в том случае, если не type="normal"существует блока монтирования, соответствующего вашей точке монтирования.

<mount-name>/example-complex.ogg</mount-name> Имя точки монтирования, для которой применяются эти настройки.
НЕ ДОЛЖЕН использоваться в случае типа монтирования «по умолчанию».

<username>othersource</username> Необязательное значение, которое задаст имя пользователя,
которое источник должен использовать для подключения с помощью этой точки монтирования.
Не устанавливайте это значение, если вы не уверены, что исходные клиенты, подключающиеся к точке монтирования,
можно настроить для отправки имени пользователя, отличного от source.
Если это значение отсутствует, используется имя пользователя по умолчанию source.

<password>hackmemore</password> Необязательное значение, которое задает пароль, который должен использовать источник для подключения
с помощью этой точки монтирования. Существует также метод аутентификации на основе URL-адреса для источников, который можно использовать вместо этого.

<max-listeners>1</max-listeners> Необязательное значение, которое задает максимальное количество слушателей, которые могут быть присоединены к этой точке монтирования.

<max-listener-duration>3600</max-listener-duration> Необязательное значение, которое устанавливает продолжительность времени,
в течение которого слушатель будет оставаться подключенным к потоку. Компонент аутентификации может переопределить это.

<dump-file>/tmp/dump-example1.ogg</dump-file> Необязательное значение, которое установит имя файла, которое будет дампом потока, проходящего через эту точку монтирования.
Это имя файла обрабатывается с помощью strftime (3). Это позволяет использовать такие переменные, как %F.

<intro>/example_intro.ogg</intro> Необязательное значение, указывающее файл, это содержимое будет отправлено новым слушателям при их подключении, но до отправки обычного потока.
Убедитесь, что формат указанного файла соответствует формату потоковой передачи. Указанный файл добавляется в корневой каталог перед открытием.

<fallback-mount>/example2.ogg</fallback-mount> запасной вариант Это необязательное значение указывает точку монтирования, в которую клиенты автоматически перемещаются,
если источник выключается или не выполняет потоковую передачу во время подключения слушателя. Только одна может быть указана в каждом монтировании и
должна ссылаться на другую точку монтирования на том же сервере, который выполняет потоковую передачу в том же потоковом формате.
Если клиенты не могут вернуться к другой точке монтирования из-за отсутствия резервного монтирования или указывает, что точка монтирования просто недоступна,
то эти клиенты будут отключены. Если клиенты возвращаются к точке монтирования, а резервное монтирование не осуществляет активную потоковую передачу,
а само определяет резервное монтирование, то вместо этого эти клиенты могут быть перемещены туда.
Этот многоуровневый откат позволяет клиентам каскадировать несколько точек монтирования.
Резервное монтирование также может указывать на файл, расположенный в корневом веб-каталоге.
Это полезно для воспроизведения предварительно записанного файла в случае прекращения потока. Он будет повторяться до тех пор, пока либо слушатель не отключится,
либо поток не станет доступным и не вернет слушателей обратно. Как правило, формат файла должен соответствовать формату потока, в противном случае могут возникнуть проблемы
с воспроизведением.
Обратите внимание, что резервный файл не рассчитан по времени, поэтому будьте осторожны, если вы собираетесь передать это. Они хороши для подчиненных потоков, но не используют
их в основных потоках, если вы это сделаете, тогда ретранслятор будет потреблять потоковые данные с большей скоростью, а слушатели на ретрансляторе в конечном итоге будут отключены.

<fallback-override>1</fallback-override> резервное переопределение
Когда этот параметр включен, это позволяет подключающемуся исходному клиенту или реле на этой точке монтирования переместить слушающих клиентов обратно из резервного монтирования.

<fallback-when-full>1</fallback-when-full> резервный при заполнении
Если установлено значение 1, это приведет к тому, что новые слушатели, когда будет достигнуто максимальное количество слушателей для точки монтирования,
будут переходить к резервному монтированию, если оно указано.

<charset>ISO8859-1</charset> Для потоков, отличных от Ogg, таких как MP3, метаданные, которые вставляются в поток, часто не имеют определенного набора символов.
Мы традиционно использовали UTF8, поскольку он позволяет использовать несколько языковых наборов на веб-страницах и в каталоге потоков, однако многие исходные клиенты для потоков
типа MP3 использовали Latin1 (ISO 8859-1) или оставляли его для любого набора символов, который используется в источнике. клиентская система.
Это несоответствие символов, как известно, вызывает проблему, поскольку движок статистики и серверы каталогов потоков хотят UTF8, поэтому теперь мы предполагаем Latin1 для потоков,
отличных от Ogg (для обработки общего случая), но вы можете указать альтернативный набор символов с помощью этой опции.
Исходные клиенты также могут указать charset=параметр для URL-адреса обновления метаданных, если они того пожелают.

<public>1</public> Параметр по умолчанию для этого -1указывает, что именно исходный клиент или ретранслятор должен определять, следует ли объявлять эту точку монтирования.
Установка 0запретит любую рекламу, а установка 1заставит ее рекламировать. Если вы используете принудительную рекламу, вам может потребоваться установить другие параметры,
перечисленные ниже, поскольку сервер YP может отказаться от рекламы, если предоставленной информации недостаточно.

<stream-name>My audio stream</stream-name> Установка этого параметра добавит указанное имя в статистику (и, следовательно, YP)
​​для этой точки монтирования, даже если исходный клиент / реле предоставит ее.

<stream-description>My audio description</stream-description> Установка этого параметра добавит указанное описание в статистику (и, следовательно, YP) ​​
для этой точки монтирования, даже если исходный клиент / реле предоставит ее.

<stream-url>http://some.place.com</stream-url> Установка этого параметра добавит указанный URL в статистику (и, следовательно, YP)
для этой точки монтирования, даже если исходный клиент / реле предоставит ее. URL-адрес обычно предназначен для направления людей на веб-сайт.

<genre>classical</genre> Установка этого параметра добавит указанный жанр в статистику (и, следовательно, YP) ​​для этой точки монтирования,
даже если исходный клиент / реле предоставляет ее. Это может быть что угодно, использование определенных ключевых слов может помочь при поиске в каталогах YP.

<bitrate>64</bitrate> Установка этого параметра добавит указанный битрейт в статистику (и, следовательно, YP) ​​для этой точки монтирования,
даже если исходный клиент / реле предоставит ее. Это указано в кбит / с.

<type>application/ogg</type> Установка этого параметра добавит указанный тип mime в статистику (и, следовательно, YP) ​​для этой точки монтирования,
даже если исходный клиент / реле предоставляет ее. Маловероятно, что это понадобится.

<subtype>vorbis</subtype> Установка этого параметра добавит указанный подтип в статистику (и, следовательно, YP) ​​для этой точки монтирования.
Подтип действительно помогает серверу YP идентифицировать компоненты типа. Пример настройки: vorbis / theora действительно указывают кодеки в потоке Ogg.

<burst-size>65536</burst-size> Этот необязательный параметр позволяет указать размер пакета, который переопределяет размер пакета по умолчанию, определенный в пределах. Значение в байтах.

<mp3-metadata-interval>4096</mp3-metadata-interval> Этот необязательный параметр указывает, какой интервал в байтах существует между обновлениями метаданных в потоках, совместимых с shoutcast.
Это применимо только к новым слушателям, подключающимся к этой точке монтирования, а не к существующим слушателям, возвращающимся к этой точке монтирования.
По умолчанию используется либо жестко заданный сервер по умолчанию, либо значение, переданное от реле

<hidden>1</hidden> Включите это, чтобы предотвратить отображение этого монтирования на страницах xsl. Это в основном для случаев, когда настроено локальное реле,
и вы не хотите, чтобы источник локального реле отображался.

<no-yp>1</no-yp>
<authentication type="htpasswd">
<option name="filename" value="myauth"/>
<option name="allow_duplicate_users" value="0"/>

</authentication> Это указывает на то, что для указанной точки монтирования потребуется аутентификация слушателя (или источника).
В настоящее время мы поддерживаем схему аутентификации на основе файлов ( type=htpasswd) и пересылку запросов аутентификации на основе URL.
Точка монтирования, настроенная с помощью аутентификатора, будет отображать красный ключ рядом с именем точки монтирования на экранах администратора.
Вы можете узнать больше об аутентификации слушателя и аутентификации источника на основе URL-адресов здесь .

<http-headers> Этот элемент помещается в любом месте раздела монтирования конфигурации icecast.
Он будет содержать <header>дочерние элементы, которые один за другим определяют фактические заголовки HTTP.

header Этот тег определяет фактический заголовок, который будет отправлен HTTP-клиенту в ответ на каждый запрос для этой точки монтирования,
но в настоящее время только в том случае, если код состояния HTTP равен «200». Этот тег может содержать следующие атрибуты
name является обязательным, и его значение определяет имя поля заголовка HTTP.
value является обязательным, и его значение определяет значение поля заголовка HTTP.

<header name="Access-Control-Allow-Origin" value="*" />
<header name="X-Robots-Tag" value="index, noarchive" />
<header name="foo" value="bar" status="200" />
<header name="Nelson" value="Ha-Ha!" status="404" />
</http-headers>

<on-connect>/home/icecast/bin/stream-start</on-connect> Укажите программу, которая запускается при запуске исходного кода. Ему передается параметр,
который представляет собой имя запускаемой точки монтирования. Обработка потока не дожидается завершения скрипта.
Следует проявлять осторожность, поскольку существует небольшая вероятность того, что дескрипторы потоковых файлов будут перепутаны с дескрипторами файлов сценариев,
если номера FD превышают 1024. Этот вопрос будет рассмотрен в следующем выпуске Icecast. Эта опция недоступна в Win32.

<on-disconnect>/home/icecast/bin/stream-stop</on-disconnect> Укажите программу, которая запускается при завершении исходного кода.
Ему передается параметр, который является именем завершившейся точки монтирования. Обработка потока не дожидается завершения скрипта.
Следует проявлять осторожность, поскольку существует небольшая вероятность того, что дескрипторы потоковых файлов будут перепутаны с дескрипторами файлов сценариев,
если номера FD превышают 1024. Этот вопрос будет рассмотрен в следующем выпуске Icecast. Эта опция недоступна в Win32.
</mount>

<mount>
<mount-name>/auth_example.ogg</mount-name>
<authentication type="url">
<option name="mount_add" value="http://myauthserver.net/notify_mount.php"/>
<option name="mount_remove" value="http://myauthserver.net/notify_mount.php"/>
<option name="listener_add" value="http://myauthserver.net/notify_listener.php"/>
<option name="listener_remove" value="http://myauthserver.net/notify_listener.php"/>
</authentication>
</mount>





Точка Mонтирования

+Название Потока:
+Описание Потока:
Тип Содержимого:
Трансляция началась:
Скорость передачи данных Битрейс:
Качество:
Качество Видео:
Размер кадров:
Частота кадров:
+Текущие Слушатели:
+Максимальное кол-во слушателей:
+Жанр:
+URL-адрес потока:
+В данный момент играет:


+Stream Name: Stream Title:
+Stream Description:
Content Type:
Stream started: Mount Start:
+Bitrate:
Quality:
Video Quality:
Framesize:
Framerate:
+Listeners (current): Current Listeners:
+Listeners (peak): Peak Listeners:
+Genre: Stream Genre:
+Stream URL:
+Currently playing: Current Song:

Not Connected
Support icecast development at




<relay>
<server>nashe1.hostingradio.ru</server>
<port>80</port>
<mount>/nashe-128.mp3</mount>
<local-mount>/Наше Радио</local-mount>
<on-demand>1</on-demand>
<server_name>Название Потока</server_name>
<server_description>Описание Потока</server_description>
<server_type>Тип Содержимого</server_type>
<server_url>URL-адрес потока</server_url>
<genre>Жанр</genre>
<bitrate>Скорость передачи данных Битрейс 64</bitrate>
</relay>


<relay>
<server>nashe1.hostingradio.ru</server>
<port>80</port>
<mount>/nashe-128.mp3</mount>
<local-mount>/Наше Радио</local-mount>
<on-demand>1</on-demand>
<stream-name>Название Потока</stream-name>
<stream-description>Описание Потока</stream-description>
<content-type>Тип Содержимого</content-type>
<stream-url>URL-адрес потока</stream-url>
<genre>Жанр</genre>
<bitrate>Скорость передачи данных Битрейс 64</bitrate>
</relay>


потоки авторадио
http://101.ru/api/channel/getListServer ... rmat=html5
http://193.232.148.43/v3_1


Проверки потоков
http://51.15.175.27/nashe-128.mp3 наше радио
http://91.219.74.220:8000/Vanya-high.ogg радио ваня
http://23.105.253.228/dfm128.mp3 ДФМ
http://46.21.248.168:8052/europaplus256.mp3 Европа плюс
http://92.255.66.132:8101/rr_spb РадиоРекорд
http://91.207.59.30/stream/air/aac/64/100 Авторадио
http://51.15.188.149:8064/moscow.dorognoe.mp3 Дорожное
http://23.105.253.212/rusradio128.mp3 Русское радио
http://78.140.208.20:8800/pfm_320 Питер ФМ
Веб интерфейс на русском
Директория \web
Файл status.xsl

Код: Выделить всё

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" />
<xsl:template match = "/icestats">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Icecast Стриминг Медиа Сервер</title>
	<link rel="stylesheet" type="text/css" href="style.css" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
</head>
<body>
	<h1 id="header">Icecast2 Статус</h1>
	<!--меню заголовка индекса-->
	<div id="menu">
		<ul>
			<li><a href="admin/">Администрирование</a></li>
			<li><a href="status.xsl">Статус Сервера</a></li>
			<li><a href="server_version.xsl">Версия</a></li>
		</ul>
	</div>
	<!--меню заголовка конечного индекса -->
	<xsl:text disable-output-escaping="yes">
	&lt;!-- Внимание:
	НЕ ПЫТАЙТЕСЬ АНАЛИЗИРОВАТЬ ВЫВОД ICECAST HTML!
	Веб-интерфейс может полностью изменяться между выпусками.
	Если у вас есть необходимость в автоматической обработке данных сервера,
	пожалуйста, ознакомьтесь с соответствующей документацией. Последние документы:
	 https://icecast.org/docs/icecast-latest/icecast2_stats.html
	-->
	</xsl:text>
	<!--состояние точки монтирования-->
	<xsl:for-each select="source">
		<xsl:choose>
			<xsl:when test="listeners">
			<div class="roundbox">
				<div class="mounthead">
					<h3 class="mount">Точка Mонтирования<xsl:value-of select="@mount" /></h3>
					<div class="right">
						<xsl:choose>
							<xsl:when test="authenticator">
								<a class="auth" href="/auth.xsl">Логин</a>
							</xsl:when>
							<xsl:otherwise>
								<ul class="mountlist">
									<li><a class="play" href="{@mount}.m3u">M3U</a></li>
									<li><a class="play" href="{@mount}.xspf">XSPF</a></li>
									<li><a class="play" href="{@mount}.vclt">VCLT</a></li>
								</ul>
							</xsl:otherwise>
						</xsl:choose>
					</div>
				</div>
				<div class="mountcont">
					<xsl:if test="server_type and ((server_type = 'application/ogg') or (server_type = 'audio/ogg') or (server_type = 'audio/mp3') or (server_type = 'audio/mpeg'))">
						<div class="audioplayer">
							<audio controls="controls" preload="none">
								<source src="{@mount}" type="{server_type}" />
							</audio>
						</div>
					</xsl:if>
					<table class="yellowkeys">
						<tbody>
							<xsl:if test="server_name">
								<tr>
									<td>Название Потока:</td>
									<td><xsl:value-of select="server_name" /></td>
								</tr>
							</xsl:if>
							<xsl:if test="server_description">
								<tr>
									<td>Описание Потока:</td>
									<td><xsl:value-of select="server_description" /></td>
								</tr>
							</xsl:if>
							<xsl:if test="server_type">
								<tr>
									<td>Тип Содержимого:</td>
									<td><xsl:value-of select="server_type" /></td>
								</tr>
							</xsl:if>
							<xsl:if test="stream_start">
								<tr>
									<td>Трансляция началась:</td>
									<td class="streamstats"><xsl:value-of select="stream_start" /></td>
								</tr>
							</xsl:if>
							<xsl:if test="bitrate">
								<tr>
									<td>Скорость передачи данных Битрейс:</td>
									<td class="streamstats"><xsl:value-of select="bitrate" /></td>
								</tr>
							</xsl:if>
							<xsl:if test="quality">
								<tr>
									<td>Качество:</td>
									<td class="streamstats"><xsl:value-of select="quality" /></td>
								</tr>
							</xsl:if>
							<xsl:if test="video_quality">
								<tr>
									<td>Качество Видео:</td>
									<td class="streamstats"><xsl:value-of select="video_quality" /></td>
								</tr>
							</xsl:if>
							<xsl:if test="frame_size">
								<tr>
									<td>Размер кадров:</td>
									<td class="streamstats"><xsl:value-of select="frame_size" /></td>
								</tr>
							</xsl:if>
							<xsl:if test="frame_rate">
								<tr>
									<td>Частота кадров:</td>
									<td class="streamstats"><xsl:value-of select="frame_rate" /></td>
								</tr>
							</xsl:if>
							<xsl:if test="listeners">
								<tr>
									<td>Текущие Слушатели:</td>
									<td class="streamstats"><xsl:value-of select="listeners" /></td>
								</tr>
							</xsl:if>
							<xsl:if test="listener_peak">
								<tr>
									<td>Максимальное кол-во слушателей:</td>
									<td class="streamstats"><xsl:value-of select="listener_peak" /></td>
								</tr>
							</xsl:if>
							<xsl:if test="genre">
								<tr>
									<td>Жанр:</td>
									<td class="streamstats"><xsl:value-of select="genre" /></td>
								</tr>
							</xsl:if>
							<xsl:if test="server_url">
								<tr>
									<td>URL-адрес потока:</td>
									<td class="streamstats">
										<a href="{server_url}"><xsl:value-of select="server_url" /></a>
									</td>
								</tr>
							</xsl:if>
							<tr>
								<td>В данный момент играет:</td>
								<td class="streamstats">
								<xsl:if test="artist">
									<xsl:value-of select="artist" /> - 
								</xsl:if>
									<xsl:value-of select="title" />
								</td>
							</tr>
						</tbody>
					</table>
				</div>
			</div>
			</xsl:when>
			<xsl:otherwise>
				<h3><xsl:value-of select="@mount" /> - Нет соединения</h3>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:for-each>
	<div id="footer">
		Поддержка разработки icecast в <a href="https://www.icecast.org/">www.icecast.org</a>
	</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Файл status-json.xsl

Код: Выделить всё

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="xml2json.xslt"/>
<xsl:output indent="no" omit-xml-declaration="yes" method="text" encoding="UTF-8" media-type="application/json"/>
<xsl:strip-space elements="*"/>

<!-- переопределение импортированной переменной преобразования для включения вывода -->
<xsl:variable name="output">true</xsl:variable>

<!-- скрыть определенные узлы из всех источников -->
<xsl:template match="icestats/source/max_listeners"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
<xsl:template match="icestats/source/public"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
<xsl:template match="icestats/source/source_ip"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
<xsl:template match="icestats/source/slow_listeners"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
<xsl:template match="icestats/source/*[contains(name(), 'total_bytes')]"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
<xsl:template match="icestats/source/user_agent" ><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>

<!-- скрыть определенные глобальные узлы -->
<xsl:template match="icestats/sources"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
<xsl:template match="icestats/clients"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
<xsl:template match="icestats/stats"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
<xsl:template match="icestats/listeners"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
<xsl:template match="node()[contains(name(), 'connections')]"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>

</xsl:stylesheet>
Файл server_version.xsl

Код: Выделить всё

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" />
<xsl:template match = "/icestats">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Icecast Стриминг Медиа Сервер</title>
	<link rel="stylesheet" type="text/css" href="style.css" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
</head>
<body>
	<h1 id="header">Информация о сервере</h1>
	<!--меню заголовка индекса -->
	<div id="menu">
		<ul>
			<li><a href="admin/">Администрирование</a></li>
			<li><a href="status.xsl">Статус Сервера</a></li>
			<li><a href="server_version.xsl">Версия</a></li>
		</ul>
	</div>
	<!--меню заголовка конечного индекса -->

	<div class="roundbox">
		<h3>Информация о сервере</h3>
		<table class="yellowkeys">
			<tbody>
				<xsl:for-each select="/icestats">
				<tr>
					<td>Местоположение</td>
					<td><xsl:value-of select="location" /></td>
				</tr>
				<tr>
					<td>Администратор</td>
					<td><xsl:value-of select="admin" /></td>
				</tr>
				<tr>
					<td>Хост</td>
					<td><xsl:value-of select="host" /></td>
				</tr>
				<tr>
					<td>Версия</td>
					<td><xsl:value-of select="server_id" /></td>
				</tr>
				</xsl:for-each>
				<tr>
					<td>Загрузить</td>
					<td><a href="https://icecast.org/download/">icecast.org</a></td>
				</tr>
				<tr>
					<td>Исходный код</td>
					<td><a href="https://icecast.org/download/#git">icecast.org/download/#git</a></td>
				</tr>
				<tr>
					<td>Документация</td>
					<td><a href="https://icecast.org/docs/">icecast.org/docs</a></td>
				</tr>
				<tr>
					<td>Потоковый Каталог</td>
					<td><a href="http://dir.xiph.org/index.php">dir.xiph.org</a></td>
				</tr>
				<tr>
					<td>Сообщество</td>
					<td><a href="https://icecast.org/contact/">icecast.org/contact</a></td>
				</tr>
			</tbody>
		</table>
	</div>
	<div id="footer">
		Поддержка разработки icecast в <a href="https://www.icecast.org/">www.icecast.org</a>
	</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Файл auth.xsl

Код: Выделить всё

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" />
<xsl:template match = "/icestats" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Icecast Стриминг Медиа Сервер</title>
	<link rel="stylesheet" type="text/css" href="style.css" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
</head>
<body>
	<h1 id="header">Icecast2 Статус</h1>
	<!--меню заголовка индекса -->
	<div id="menu">
		<ul>
			<li><a href="admin/">Администрирование</a></li>
			<li><a href="status.xsl">Статус Сервера</a></li>
			<li><a href="server_version.xsl">Версия</a></li>
		</ul>
	</div>
	<!--меню заголовка конечного индекса -->
	<h2>Страница Авторизации</h2>
	<xsl:for-each select="source">
		<xsl:choose>
		<xsl:when test="listeners">
			<xsl:if test="authenticator">
				<div class="roundbox">
					<h3 class="mount">
						Точка Mонтирования <xsl:value-of select="@mount" />
						<xsl:if test="server_name">
							<small><xsl:value-of select="server_name" /></small>
						</xsl:if>
					</h3>
					<form class="alignedform" method="get" action="/admin/buildm3u">
						<p>
							<label for="name">Имя пользователя: </label>
							<input id="name" name="username" type="text" />
						</p>
						<p>
							<label for="password">Пароль: </label>
							<input id="password" name="password" type="password" />
						</p>
						<input type="hidden" name="mount" value="{@mount}" />
						<input type="submit" value="Login" />
					</form>
				</div>
			</xsl:if>
		</xsl:when>
		<xsl:otherwise>
			<h3><xsl:value-of select="@mount" /> - Нет соединения</h3>
		</xsl:otherwise>
		</xsl:choose>
	</xsl:for-each>
	<div id="footer">
		Поддержка разработки icecast в <a href="https://www.icecast.org/">www.icecast.org</a>
	</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
количество слов: 2401
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 866
Стаж: 5 лет 9 месяцев
Откуда: Вологодская область
Поблагодарили: 41 раз
Контактная информация:

icecast

Сообщение Артём Мамзиков »

Директория \admin
Файл listclients.xsl

Код: Выделить всё

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" />
<xsl:template match = "/icestats" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Icecast Стриминг Медиа Сервер</title>
	<link rel="stylesheet" type="text/css" href="/style.css" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
</head>
<body>
	<h1>Icecast2 Администратор</h1>
	<!--меню заголовка индекса -->
	<div id="menu">
		<ul>
			<li><a href="stats.xsl">Домашняя Администратор</a></li>
			<li><a href="listmounts.xsl">Список Точек Монтирования</a></li>
			<li><a href="/status.xsl">Public Home</a></li>
		</ul>
	</div>
	<!--меню заголовка конца индекса -->
	<h2>Статистика слушателя</h2>
	<xsl:for-each select="source">
		<div class="roundbox">
			<div class="mounthead">
				<h3>Точка Mонтирования<xsl:value-of select="@mount" /></h3>
				<div class="right">
					<xsl:choose>
						<xsl:when test="authenticator">
							<a class="auth" href="/auth.xsl">Логин</a>
						</xsl:when>
						<xsl:otherwise>
							<ul class="mountlist">
								<li><a class="play" href="{@mount}.m3u">M3U</a></li>
								<li><a class="play" href="{@mount}.xspf">XSPF</a></li>
								<li><a class="play" href="{@mount}.vclt">VCLT</a></li>
							</ul>
						</xsl:otherwise>
					</xsl:choose>
				</div>
			</div>
			<div class="mountcont">
				<ul class="nav">
					<li class="active"><a href="listclients.xsl?mount={@mount}">Список клиентов</a></li>
					<li><a href="moveclients.xsl?mount={@mount}">Переместить слушателей</a></li>
					<li><a href="updatemetadata.xsl?mount={@mount}">Обновить метаданные</a></li>
					<xsl:if test="authenticator">
						<li><a href="manageauth.xsl?mount={@mount}">Управление аутентификацией</a></li>
					</xsl:if>
					<li><a href="killsource.xsl?mount={@mount}">Убить источник</a></li>
				</ul>
				<xsl:choose>
					<xsl:when test="listener">
						<div class="scrolltable">
							<table class="colortable">
								<thead>
									<tr>
										<td>IP</td>
										<td>Сек. подключен</td>
										<td>Пользовательский агент</td>
										<td>Действие</td>
									</tr>
								</thead>
								<tbody>
									<xsl:variable name = "themount"><xsl:value-of select="@mount" /></xsl:variable>
									<xsl:for-each select="listener">
										<tr>
											<td>
												<xsl:value-of select="IP" />
												<xsl:if test="username">
													(<xsl:value-of select="username" />)
												</xsl:if>
											</td>
											<td><xsl:value-of select="Connected" /></td>
											<td><xsl:value-of select="UserAgent" /></td>
											<td><a href="killclient.xsl?mount={$themount}&amp;id={ID}">Kick</a></td>
										</tr>
									</xsl:for-each>
								</tbody>
							</table>
						</div>
					</xsl:when>
					<xsl:otherwise>
						<p>Нет подключенных слушателей</p>
					</xsl:otherwise>
				</xsl:choose>
			</div>
		</div>
	</xsl:for-each>
	<div id="footer">
		Поддержка разработки icecast в <a href="https://www.icecast.org/">www.icecast.org</a>
	</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Файл listmounts.xsl

Код: Выделить всё

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" />
<xsl:template match = "/icestats" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Icecast Стриминг Медиа Сервер</title>
	<link rel="stylesheet" type="text/css" href="/style.css" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
</head>
<body>
	<h1>Icecast2 Администратор</h1>
	<!--меню заголовка индекса -->
	<div id="menu">
		<ul>
			<li><a href="stats.xsl">Домашняя Администратор</a></li>
			<li><a href="listmounts.xsl">Список Точек Монтирования</a></li>
			<li><a href="/status.xsl">Public Home</a></li>
		</ul>
	</div>
	<!--меню заголовка конца индекса -->
	<h2>Активные точки монтирования</h2>
	<xsl:for-each select="source">
		<div class="roundbox">
			<div class="mounthead">
				<h3 class="mount">Точка Mонтирования <xsl:value-of select="@mount" /></h3>
				<div class="right">
					<xsl:choose>
						<xsl:when test="authenticator">
							<a class="auth" href="/auth.xsl">Логин</a>
						</xsl:when>
						<xsl:otherwise>
							<ul class="mountlist">
								<li><a class="play" href="{@mount}.m3u">M3U</a></li>
								<li><a class="play" href="{@mount}.xspf">XSPF</a></li>
								<li><a class="play" href="{@mount}.vclt">VCLT</a></li>
							</ul>
						</xsl:otherwise>
					</xsl:choose>
				</div>
			</div>
			<div class="mountcont">
				<ul class="nav">
					<li><a href="listclients.xsl?mount={@mount}">Список Клиентов</a></li>
					<li><a href="moveclients.xsl?mount={@mount}">Перемещение Слушателей</a></li>
					<li><a href="updatemetadata.xsl?mount={@mount}">Обновление Метаданных</a></li>
					<xsl:if test="authenticator">
						<li><a href="manageauth.xsl?mount={@mount}">Управление Аутентификацией</a></li>
					</xsl:if>
					<li><a href="killsource.xsl?mount={@mount}">Убить Источник</a></li>
				</ul>
				<p><xsl:value-of select="listeners" /> Слушатель(и)</p>
			</div>
		</div>
	</xsl:for-each>
	<div id="footer">
		Поддержка разработки icecast в <a href="https://www.icecast.org/">www.icecast.org</a>
	</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Файл manageauth.xsl

Код: Выделить всё

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" />
<xsl:template match = "/icestats" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Icecast Стриминг Медиа Сервер</title>
	<link rel="stylesheet" type="text/css" href="/style.css" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
</head>
<body>
	<h1>Icecast2 Администратор</h1>
	<!--меню заголовка индекса -->
	<div id="menu">
		<ul>
			<li><a href="stats.xsl">Домашняя Администратор</a></li>
			<li><a href="listmounts.xsl">Список Точек Монтирования</a></li>
			<li><a href="/status.xsl">Public Home</a></li>
		</ul>
	</div>
	<!--меню заголовка конца индекса -->
	<h2>Управление Аутентификацией</h2>
	<xsl:if test="iceresponse">
		<div class="roundbox">
			<h3>Сообщения</h3>
			<xsl:for-each select="iceresponse">
				<xsl:value-of select="message" /><br />
			</xsl:for-each>
		</div>
	</xsl:if>
	<xsl:for-each select="source">
		<div class="roundbox">
			<h3>Точка Mонтирования <xsl:value-of select="@mount" />
				<xsl:if test="server_name">
					<small><xsl:value-of select="server_name" /></small>
				</xsl:if>
			</h3>
			<ul class="nav">
				<li><a href="listclients.xsl?mount={@mount}">Список клиентов</a></li>
				<li><a href="moveclients.xsl?mount={@mount}">Переместить слушателей</a></li>
				<li><a href="updatemetadata.xsl?mount={@mount}">Обновить метаданные</a></li>
				<li><a href="manageauth.xsl?mount={@mount}">Управление аутентификацией</a></li>
				<li><a href="killsource.xsl?mount={@mount}">Убить источник</a></li>
			</ul>
			<xsl:if test="User">
				<table class="colortable">
					<thead>
						<tr>
							<td>Пользователь</td>
							<td>Действие</td>
						</tr>
					</thead>
					<tbody>
						<xsl:variable name="themount"><xsl:value-of select="@mount" /></xsl:variable>
						<xsl:for-each select="User">
							<tr>
								<td>
									<xsl:value-of select="username" />
								</td>
								<td>
									<a href="manageauth.xsl?mount={$themount}&amp;username={username}&amp;action=delete">Удалить</a>
								</td>
							</tr>
						</xsl:for-each>
					</tbody>
				</table>
			</xsl:if>
			<form class="alignedform" method="get" action="/admin/manageauth.xsl">
				<fieldset>
					<legend>Добавление нового пользователя</legend>
					<p>
						<label for="username">Имя пользователя:</label>
						<input type="text" id="username" name="username"/>
					</p>
					<p>
						<label for="password">Пароль:</label>
						<input type="password" id="password" name="password"/>
					</p>
					<input type="hidden" name="mount" value="{@mount}"/>
					<input type="hidden" name="action" value="add"/>
					<input type="Submit" value="Add"/>
				</fieldset>
			</form>
		</div>
	</xsl:for-each>
	<div id="footer">
		Поддержка разработки icecast в <a href="https://www.icecast.org/">www.icecast.org</a>
	</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Файл moveclients.xsl

Код: Выделить всё

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" />
<xsl:template match = "/icestats" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Icecast Стриминг Медиа Сервер</title>
	<link rel="stylesheet" type="text/css" href="/style.css" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
</head>
<body>
	<h1>Icecast2 Администратор</h1>
	<!--меню заголовка индекса -->
	<div id="menu">
		<ul>
			<li><a href="stats.xsl">Домашняя Администратор</a></li>
			<li><a href="listmounts.xsl">Список Точек Монтирования</a></li>
			<li><a href="/status.xsl">Public Home</a></li>
		</ul>
	</div>
	<!--меню заголовка конца индекса -->
	<xsl:variable name = "currentmount" ><xsl:value-of select="current_source" /></xsl:variable>
	<h2>Перемещение слушателей из <xsl:value-of select="current_source" /></h2>
	<div class="roundbox">
		<h3>Переместиться в какую точку монтирования?</h3>
		<xsl:for-each select="source">
			<p>
				Перейти от <code><xsl:copy-of select="$currentmount" /></code> к <code><xsl:value-of select="@mount" /></code><br />
				<xsl:value-of select="listeners" /> слушатели<br />
				<a href="moveclients.xsl?mount={$currentmount}&amp;destination={@mount}">Перемещение клиентов</a>
			</p>
		</xsl:for-each>
	</div>
	<div id="footer">
		Поддержка разработки icecast в <a href="https://www.icecast.org/">www.icecast.org</a>
	</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Файл response.xsl

Код: Выделить всё

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" />
<xsl:template match = "/iceresponse" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Icecast Стриминг Медиа Сервер</title>
	<link rel="stylesheet" type="text/css" href="/style.css" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
</head>
<body>
	<h1>Icecast2 Администратор</h1>
	<!--меню заголовка индекса -->
	<div id="menu">
		<ul>
			<li><a href="stats.xsl">Домашняя Администратор</a></li>
			<li><a href="listmounts.xsl">Список Точек Монтирования</a></li>
			<li><a href="/status.xsl">Public Home</a></li>
		</ul>
	</div>
	<!--меню заголовка конца индекса -->
	<h2>Ответ сервера Icecast</h2>
	<xsl:for-each select="/iceresponse">
		<div class="roundbox">
			<h3>Отклик</h3>
			<p>Сообщение: <xsl:value-of select="message" /></p>
			<p>Код возврата: <xsl:value-of select="return" /></p>
		</div>
	</xsl:for-each>
	<div id="footer">
		Поддержка разработки icecast в <a href="https://www.icecast.org/">www.icecast.org</a>
	</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Файл stats.xsl

Код: Выделить всё

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" />
<xsl:template match = "/icestats" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Icecast Стриминг Медиа Сервер</title>
	<link rel="stylesheet" type="text/css" href="/style.css" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
</head>
<body>
	<h1>Icecast2 Администратор</h1>
	<!--меню заголовка индекса -->
	<div id="menu">
		<ul>
			<li><a href="stats.xsl">Домашняя Администратор</a></li>
			<li><a href="listmounts.xsl">Список Точек Монтирования</a></li>
			<li><a href="/status.xsl">Public Home</a></li>
		</ul>
	</div>
	<!--меню заголовка конца индекса -->
	<!--глобальная статистика сервера -->
	<div class="roundbox">
		<h3>Глобальная Статистика Сервера</h3>
		<table class="yellowkeys">
			<tbody>
				<xsl:for-each select="/icestats">
					<xsl:for-each select="*">
						<xsl:if test = "name()!='source'"> 
							<tr>
							   <td><xsl:value-of select="name()" /></td>
							   <td><xsl:value-of select="." /></td>
							</tr>
						</xsl:if>
					</xsl:for-each>
				</xsl:for-each>
			</tbody>
		</table>
	</div>
	<!--конец глобальной статистики сервера-->

	<!--статистика точки монтирования-->
	<xsl:for-each select="source">
		<xsl:if test = "listeners!=''"> 
			<div class="roundbox">
				<div class="mounthead">
					<h3 class="mount">Точка Mонтирования <xsl:value-of select="@mount" /></h3>
					<div class="right">
						<xsl:choose>
							<xsl:when test="authenticator">
								<a class="auth" href="/auth.xsl">Логин</a>
							</xsl:when>
							<xsl:otherwise>
								<ul class="mountlist">
									<li><a class="play" href="{@mount}.m3u">M3U</a></li>
									<li><a class="play" href="{@mount}.xspf">XSPF</a></li>
									<li><a class="play" href="{@mount}.vclt">VCLT</a></li>
								</ul>
							</xsl:otherwise>
						</xsl:choose>
					</div>
				</div>
				<div class="mountcont">
					<ul class="nav">
						<li><a href="listclients.xsl?mount={@mount}">Список клиентов</a></li>
						<li><a href="moveclients.xsl?mount={@mount}">Переместить слушателей</a></li>
						<li><a href="updatemetadata.xsl?mount={@mount}">Обновить метаданные</a></li>
						<xsl:if test="authenticator">
							<li><a href="manageauth.xsl?mount={@mount}">Управление аутентификацией</a></li>
						</xsl:if>
						<li><a href="killsource.xsl?mount={@mount}">Убить источник</a></li>
					</ul>
					<xsl:if test="server_type and ((server_type = 'application/ogg') or (server_type = 'audio/ogg') or (server_type = 'audio/mp3') or (server_type = 'audio/mpeg'))">
						<div class="audioplayer">
							<audio controls="controls" preload="none">
								<source src="{@mount}" type="{server_type}" />
							</audio>
						</div>
					</xsl:if>
					<table class="yellowkeys">
						<tbody>
							<xsl:for-each select="*">
								<tr>
									<td><xsl:value-of select="name()" /></td>
									<td><xsl:value-of select="." /></td>
								</tr>
							</xsl:for-each>
						</tbody>
					</table>
				</div>
			</div>
		</xsl:if>
	</xsl:for-each>
	<!--статистика конечной точки монтирования-->
	<div id="footer">
		Поддержка разработки icecast в <a href="https://www.icecast.org/">www.icecast.org</a>
	</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Файл updatemetadata.xsl

Код: Выделить всё

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" />
<xsl:template match = "/icestats">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Icecast Стриминг Медиа Сервер</title>
	<link rel="stylesheet" type="text/css" href="/style.css" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
</head>
<body>
	<h1>Icecast2 Администратор</h1>
	<!--меню заголовка индекса -->
	<div id="menu">
		<ul>
			<li><a href="stats.xsl">Домашняя Администратор</a></li>
			<li><a href="listmounts.xsl">Список Точек Монтирования</a></li>
			<li><a href="/status.xsl">Public Home</a></li>
		</ul>
	</div>
	<!--меню заголовка конца индекса -->
	<h2>Обновить метаданные</h2>
	<xsl:for-each select="source">
		<div class="roundbox">
			<h3>Точка Mонтирования <xsl:value-of select="@mount" /> 
				<xsl:if test="server_name">
					<small><xsl:value-of select="server_name" /></small>
				</xsl:if>
			</h3>
			<form class="alignedform" method="get" action="/admin/metadata.xsl">
				<p>
					<label for="song">Метаданные:</label>
					<input type="text" id="song" name="song"/>
				</p>
				<p>
					<input type="submit" value="Update"/>
					<input type="hidden" name="mount" value="{@mount}"/>
					<input type="hidden" name="mode" value="updinfo"/>
					<input type="hidden" name="charset" value="UTF-8"/>
				</p>
			</form>
		</div>
	</xsl:for-each>
	<div id="footer">
		Поддержка разработки icecast в <a href="https://www.icecast.org/">www.icecast.org</a>
	</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Файл vclt.xsl

Код: Выделить всё

<!--
Таблица стилей VCLT xslt для Icecast 2.3.2 и выше
     на основе таблицы стилей XSPF xslt.
     Авторское право (C) 2007 Томас Б. Рюккер, <thomas@ruecker.fi>
     Авторское право (C) 2011 Филипп Шаффт, <lion@lion.leolix.org>

     Это бесплатное программное обеспечение; вы можете распространять его и / или
     изменить его в соответствии с условиями Стандартной общественной лицензии GNU
     опубликовано Free Software Foundation; либо версия 2
     Лицензии или (по вашему выбору) любой более поздней версии.

     Эта программа распространяется в надежде, что она будет полезна,
     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
     КОММЕРЧЕСКАЯ ЦЕННОСТЬ или ПРИГОДНОСТЬ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ. Увидеть
     Стандартная общественная лицензия GNU для более подробной информации.

     Вы должны были получить копию Стандартной общественной лицензии GNU
     вместе с этой программой; если нет, напишите в
     Фонд свободного программного обеспечения, Inc.,
     51 Franklin Street, Fifth Floor, Бостон, Массачусетс 02110-1301, США
-->

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="yes" media-type="audio/x-vclt"
        method="text" indent="no" encoding="UTF-8" />
<xsl:template match = "/icestats" >
<xsl:for-each select="source">STREAMURL=<xsl:value-of select="listenurl" />
<xsl:if test="artist"><xsl:text>
</xsl:text>ARTIST=<xsl:value-of select="artist" /></xsl:if>
<xsl:if test="title"><xsl:text>
</xsl:text>TITLE=<xsl:value-of select="title" /></xsl:if>

<xsl:if test="server_name"><xsl:text>
</xsl:text>SERVER_NAME=<xsl:value-of select="server_name" /></xsl:if>
<xsl:if test="server_description"><xsl:text>
</xsl:text>DESCRIPTION=<xsl:value-of select="server_description" /></xsl:if>
SIGNALINFO=<xsl:choose>
 <xsl:when test="server_type = 'application/ogg'">
  <xsl:choose>
   <xsl:when test="subtype = 'Vorbis'">codec:ogg_vorbis</xsl:when>
   <!-- More codecs should be added here, however I don't know how to find out about the codec.
        At the moment we just guess that application/ogg is a Ogg bitstream with some undefined
        codec. Everything else is undefined.
   -->
   <xsl:otherwise>codec:ogg_general</xsl:otherwise>
  </xsl:choose>
 </xsl:when>
</xsl:choose><xsl:text>
</xsl:text>
<xsl:if test="genre">GENRE=<xsl:value-of select="genre" /></xsl:if>
==
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Файл xspf.xsl

Код: Выделить всё

<!--
	Таблица стилей XSPF xslt для Icecast 2.3.2 и выше
     Авторские права (C) 2007 Томас Б. Рюккер, tbr@ruecker-itk.de

     Это бесплатное программное обеспечение; вы можете распространять его и / или
     изменить его в соответствии с условиями Стандартной общественной лицензии GNU
     опубликовано Free Software Foundation; либо версия 2
     Лицензии или (по вашему выбору) любой более поздней версии.

     Эта программа распространяется в надежде, что она будет полезна,
     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
     КОММЕРЧЕСКАЯ ЦЕННОСТЬ или ПРИГОДНОСТЬ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ. Увидеть
     Стандартная общественная лицензия GNU для более подробной информации.

     Вы должны были получить копию Стандартной общественной лицензии GNU
     вместе с этой программой; если нет, напишите в
     Фонд свободного программного обеспечения, Inc.,
     51 Franklin Street, Fifth Floor, Бостон, Массачусетс 02110-1301, США
-->

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="no" media-type="application/xspf+xml"
        method="xml" indent="yes" encoding="UTF-8" />
<xsl:template match = "/icestats" >
<playlist version="1" xmlns="http://xspf.org/ns/0/">
	<title><xsl:value-of select="server" /></title>
	<creator><xsl:value-of select="server" /></creator>
	<trackList >
<!-- конец «заголовка» -->

<xsl:for-each select="source">

<track>
    <location><xsl:value-of select="listenurl" /></location>


<xsl:if test="artist"><creator><xsl:value-of select="artist" /></creator></xsl:if>
<title><xsl:value-of select="title" /></title>
<!-- Используются элементы <xsl: text> \ n </ xsl: text> в следующей части
для принудительного переноса строк этот формат, похоже, ожидается клиентами -->
<annotation>
<xsl:if test="server_name">Название потока: <xsl:value-of select="server_name" /><xsl:text>
</xsl:text></xsl:if>
<xsl:if test="server_description">Описание потока: <xsl:value-of select="server_description" /></xsl:if>
Тип содержимого: <xsl:value-of select="server_type" /><xsl:text>
</xsl:text>
<xsl:if test="bitrate">Битрейт: <xsl:value-of select="bitrate" /><xsl:text>
</xsl:text></xsl:if>
<xsl:if test="quality">Качество: <xsl:value-of select="quality" /><xsl:text>
</xsl:text></xsl:if>
<xsl:if test="video_quality">Качество видео: <xsl:value-of select="video_quality" /><xsl:text>
</xsl:text></xsl:if>
<xsl:if test="frame_size">Размер кадра: <xsl:value-of select="frame_size" /><xsl:text>
</xsl:text></xsl:if>
<xsl:if test="frame_rate">Частота кадров: <xsl:value-of select="frame_rate" /><xsl:text>
</xsl:text></xsl:if>
<xsl:if test="listeners">Текущие слушатели: <xsl:value-of select="listeners" /><xsl:text>
</xsl:text></xsl:if>
<xsl:if test="listener_peak">Пик слушателей: <xsl:value-of select="listener_peak" /><xsl:text>
</xsl:text></xsl:if>
<xsl:if test="genre">Жанр трансляции: <xsl:value-of select="genre" /></xsl:if>
</annotation>

<xsl:if test="server_url"><info><xsl:value-of select="server_url" /></info></xsl:if>

</track>

</xsl:for-each>
</trackList>
</playlist>

</xsl:template>
</xsl:stylesheet>
количество слов: 2671
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 866
Стаж: 5 лет 9 месяцев
Откуда: Вологодская область
Поблагодарили: 41 раз
Контактная информация:

icecast

Сообщение Артём Мамзиков »

После того как мф настроили icecast2 нам нужно в чем то принимать потоки.
VLC нам не подходит так как доступ есть только через браузер там авторизация через прокси и доступ только конкретному браузеру через проверку user-agenta по этому нужно что то делать на html или php!

Без использования Adobe Flash Player, на html5 audio
Первые версии были сделаны в виде дороже плееров , при включении Другова потока, предыдущее выключалось.
radio2.html
radio2.html
Файл radio2.html

Код: Выделить всё

<!DOCTYPE html>
<html>
<head>
    <title>RADIO</title>
    <meta charset="utf-8">
    <script>
        function playAudio(elem) {
            document.querySelectorAll('audio').forEach(function(el){
                el.pause();
            })
            document.querySelectorAll('button').forEach(function(el){
                el.innerHTML = 'Play';
            })


            window.document.getElementById('btn' + elem).innerHTML = 'Pause';
            window.document.getElementById('audio' + elem).play();
        }
    </script>
</head>
<body>
    <p>AvtoRadio Online</p>
    <div class="controls">
        <button id="btn1" onclick="playAudio(1);">Play</button>
    </div>
    <audio id="audio1">
		<source src="http://192.168.175.5:8000/autoradio" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/autoradio" type="audio/mp3">
		<source src="http://192.168.175.5:8000/autoradio" type="audio/ogg">
        Ваш браузер не поддерживает тег audio Обновите браузер!
    </audio>


    <p>Nashe-radio</p>
    <div class="controls">
        <button id="btn2" onclick="playAudio(2);">Play</button>
    </div>
    <audio id="audio2">
		<source src="http://192.168.175.5:8000/nashe-radio" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/nashe-radio" type="audio/mp3">
		<source src="http://192.168.175.5:8000/nashe-radio" type="audio/ogg">
        Ваш браузер не поддерживает тег audio Обновите браузер!
    </audio>


    <p>RadioVanya</p>
    <div class="controls">
        <button id="btn3" onclick="playAudio(3);">Play</button>
    </div>
    <audio id="audio3">
		<source src="http://192.168.175.5:8000/radiovanya-ivanovo" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/radiovanya-ivanovo" type="audio/mp3">
		<source src="http://192.168.175.5:8000/radiovanya-ivanovo" type="audio/ogg">
        Ваш браузер не поддерживает тег audio Обновите браузер!
    </audio>
	
	<p>Russkoe Radio</p>
    <div class="controls">
        <button id="btn4" onclick="playAudio(4);">Play</button>
    </div>
    <audio id="audio4">
		<source src="http://192.168.175.5:8000/rusradio" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/rusradio" type="audio/mp3">
		<source src="http://192.168.175.5:8000/rusradio" type="audio/ogg">
        Ваш браузер не поддерживает тег audio Обновите браузер!
    </audio>
	
	<p>RecordSPB</p>
    <div class="controls">
        <button id="btn5" onclick="playAudio(5);">Play</button>
    </div>
	<audio id="audio5">
		<source src="http://192.168.175.5:8000/radiorecordspb" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/radiorecordspb" type="audio/mp3">
		<source src="http://192.168.175.5:8000/radiorecordspb" type="audio/ogg">
		Ваш браузер не поддерживает тег audio Обновите браузер!
	</audio>
	
	<p>EuropaPlus</p>
    <div class="controls">
        <button id="btn6" onclick="playAudio(6);">Play</button>
    </div>
	<audio id="audio6">
		<source src="http://192.168.175.5:8000/europaplus-radio" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/europaplus-radio" type="audio/mp3">
		<source src="http://192.168.175.5:8000/europaplus-radio" type="audio/ogg">
		Ваш браузер не поддерживает тег audio Обновите браузер!
	</audio>
	
	<p>DFM</p>
    <div class="controls">
        <button id="btn7" onclick="playAudio(7);">Play</button>
    </div>
	<audio id="audio7">
		<source src="http://192.168.175.5:8000/dfm-radio" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/dfm-radio" type="audio/mp3">
		<source src="http://192.168.175.5:8000/dfm-radio" type="audio/ogg">
		Ваш браузер не поддерживает тег audio Обновите браузер!
	</audio>
	
	<p>DorognoeRadio</p>
    <div class="controls">
        <button id="btn8" onclick="playAudio(8);">Play</button>
    </div>
	<audio id="audio8">
		<source src="http://192.168.175.5:8000/dorognoeradio" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/dorognoeradio" type="audio/mp3">
		<source src="http://192.168.175.5:8000/dorognoeradio" type="audio/ogg">
		Ваш браузер не поддерживает тег audio Обновите браузер!
	</audio>
	
</body>
</html>
radio3.html
radio3.html
Файл radio3.html

Код: Выделить всё

<!DOCTYPE html>
<html>

<head>
	<title>RADIO</title>
	<meta charset="utf-8">
</head>
<body>
<div class="audio">
    <p>AvtoRadio Online</p>
	<audio controls  preload="none">
		<source src="http://192.168.175.5:8000/autoradio" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/autoradio" type="audio/mp3">
		<source src="http://192.168.175.5:8000/autoradio" type="audio/ogg">
		Ваш браузер не поддерживает тег audio Обновите браузер!
	</audio>
</div>


<div class="audio">
    <p>Nashe-radio</p>
	<audio controls preload="none">
		<source src="http://192.168.175.5:8000/nashe-radio" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/nashe-radio" type="audio/mp3">
		<source src="http://192.168.175.5:8000/nashe-radio" type="audio/ogg">
		Ваш браузер не поддерживает тег audio Обновите браузер!
	</audio>
</div>


<div class="audio">
    <p>RadioVanya</p>
	<audio controls  preload="none">
		<source src="http://192.168.175.5:8000/radiovanya-ivanovo" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/radiovanya-ivanovo" type="audio/mp3">
		<source src="http://192.168.175.5:8000/radiovanya-ivanovo" type="audio/ogg">
		Ваш браузер не поддерживает тег audio Обновите браузер!
	</audio>
</div>


<div class="audio">
    <p>Russkoe Radio</p>
	<audio controls preload="none">
		<source src="http://192.168.175.5:8000/rusradio" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/rusradio" type="audio/mp3">
		<source src="http://192.168.175.5:8000/rusradio" type="audio/ogg">
		Ваш браузер не поддерживает тег audio Обновите браузер!
	</audio>
</div>


<div class="audio">
    <p>RecordSPB</p>
	<audio controls  preload="none">
		<source src="http://192.168.175.5:8000/radiorecordspb" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/radiorecordspb" type="audio/mp3">
		<source src="http://192.168.175.5:8000/radiorecordspb" type="audio/ogg">
		Ваш браузер не поддерживает тег audio Обновите браузер!
	</audio>
</div>

<div class="audio">
    <p>EuropaPlus</p>
	<audio controls  preload="none">
		<source src="http://192.168.175.5:8000/europaplus-radio" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/europaplus-radio" type="audio/mp3">
		<source src="http://192.168.175.5:8000/europaplus-radio" type="audio/ogg">
		Ваш браузер не поддерживает тег audio Обновите браузер!
	</audio>
</div>

<div class="audio">
    <p>DFM</p>
	<audio controls  preload="none">
		<source src="http://192.168.175.5:8000/dfm-radio" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/dfm-radio" type="audio/mp3">
		<source src="http://192.168.175.5:8000/dfm-radio" type="audio/ogg">
		Ваш браузер не поддерживает тег audio Обновите браузер!
	</audio>
</div>

<div class="audio">
    <p>DorognoeRadio</p>
	<audio controls  preload="none">
		<source src="http://192.168.175.5:8000/dorognoeradio" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/dorognoeradio" type="audio/mp3">
		<source src="http://192.168.175.5:8000/dorognoeradio" type="audio/ogg">
		Ваш браузер не поддерживает тег audio Обновите браузер!
	</audio>
</div>

<div class="audio">
    <p>piterfm</p>
        <audio controls  preload="none">
		<source src="http://192.168.175.5:8000/piterfm" type="audio/mpeg">
		<source src="http://192.168.175.5:8000/piterfm" type="audio/mp3">
		<source src="http://192.168.175.5:8000/piterfm" type="audio/ogg">
		Ваш браузер не поддерживает тег audio Обновите браузер!
    </audio>
</div>

<script type="text/javascript">//<![CDATA[
let last = {};
document.querySelectorAll('audio').forEach(function(el){
  el.addEventListener('playing', function(){
    if (last.pause && last !== this)
      last.pause()
    last = this
  }); 
})
  //]]></script>
</body>
</html>
количество слов: 1030
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 866
Стаж: 5 лет 9 месяцев
Откуда: Вологодская область
Поблагодарили: 41 раз
Контактная информация:

icecast

Сообщение Артём Мамзиков »

Бесплатный плеер на html 5
Оф.сайт HTML5 Audio player with playlist

Переделал на потоки радио
Сохранение звука не только визуально но и по факту смены радио
При перелистывании и щелчке на радио включается а не встает в паузу после чего нужно жать на кнопку плей
Проблемы с кэшем на 2 круге либо после паузы (двойной Эфир старый + новый или просто старый откуда то берет или зацикливается)
Открытие в отдельном окне определенных размеров (нужно прямо из закладок пока сделана через доп страницу clik плюс она не закрывается так как открыта вручную сделал сброс на пустую страницу mozila)
Плеер радио
Плеер радио
clik.html

Код: Выделить всё

<!DOCTYPE html>
<html>

<!-- Открытие нового окна по клику -->

<a href="http://192.168.***.***:8000/Radio.html#size-window" onclick="window.open(this.href, '', 'scrollbars=1,height='+Math.min(450, screen.availHeight)+',width='+Math.min(362, screen.availWidth)); return false;">Radio</a>

<!-- Открытие нового окна автоматом -->
<script type='text/javascript'>
var newWin = window.open("http://192.168.***.***:8000/Radio.html","JSSite","width=362,height=450,resizable=yes,scrollbars=yes,status=yes")
    newWin.focus()
</script>

<!-- Перенаправление страницы -->

<script>
 setTimeout(function(){window.location.href = 'about:blank';}, 9 * 1000);
 <!--    window.location.replace("about:blank");-->
</script>

<!-- Попытка закрытия страницы -->
<!--
<a href="javascript:close_window();">close</a>
<a href="#" onclick="close_window();return false;">close</a>
<a href="javascript:window.open('','_self').close();">close</a>
-->

</html>
Radio.html

Код: Выделить всё

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
    <meta http-equiv="pragma" content="no-cache"/>
    <meta http-equiv="Expires" content="0">
    <meta charset="utf-8" />
    <meta name="author" content="Script Tutorials" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
    <title>Radio player</title>

    <!-- добавление стилей и скриптов -->
    <link href="css/styles.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>
    <script type="text/javascript" src="js/jquery-ui-1.8.21.custom.min.js"></script>
    <script type="text/javascript" src="js/main.js"></script>
</head>
<body>
    <div class="example">

        <div class="player">
            <div class="pl"></div>
            <div class="title"></div>
            <div class="artist"></div>
            <div class="cover"></div>
            <div class="controls">
                <div class="play"></div>
                <div class="pause"></div>
                <div class="rew"></div>
                <div class="fwd"></div>
            </div>
            <div class="volume"></div>
            <div class="tracker"></div>
        </div>
        <ul class="playlist">
            <li audiourl="http://192.168.175.5:8000/nashe-radio" cover="nashe-radio.jpg" artist="">NasheRadio</li>
            <li audiourl="http://192.168.175.5:8000/autoradio" cover="autoradio.jpg" artist="">AutoRadio</li>
            <li audiourl="http://192.168.175.5:8000/radiovanya-ivanovo" cover="radiovanya-ivanovo.jpg" artist="">RadioVanya</li>
            <li audiourl="http://192.168.175.5:8000/rusradio" cover="rusradio.jpg" artist="">RuskoeRadio</li>
            <li audiourl="http://192.168.175.5:8000/radiorecordspb" cover="radiorecordspb.jpg" artist="">RadioRecordSPB</li>
            <li audiourl="http://192.168.175.5:8000/europaplus-radio" cover="europaplus-radio.jpg" artist="">EuropaPlus</li>
            <li audiourl="http://192.168.175.5:8000/dfm-radio" cover="dfm-radio.jpg" artist="">DFM</li>
	    <li audiourl="http://192.168.175.5:8000/dorognoeradio" cover="dorognoeradio.jpg" artist="">DorognoeRadio</li>
	    <li audiourl="http://192.168.175.5:8000/piterfm" cover="piterfm.jpg" artist="">PiterFM</li>
        </ul>
<p>При возникновении проблем</p>
<p>Одновременно нажать клавиши Ctrl F5</p>
    </div>
</body>
</html>
Директория js
main.js

Код: Выделить всё

/**
*
* Аудиоплеер HTML5 с плейлистом
*
* Лицензируется по лицензии MIT.
* http://www.opensource.org/licenses/mit-license.php
*
* Copyright 2012, Script Tutorials
* http://www.script-tutorials.com/
 */

jQuery(document).ready(function() {

    // внутренние переменные
    var song;
    var tracker = $('.tracker');
    var volume = $('.volume');
    var dVol = 1; // от 0 до 1 пример 0.9

    function initAudio(elem) {
        var url = elem.attr('audiourl');
        var title = elem.text();
        var cover = elem.attr('cover');
        var artist = elem.attr('artist');

        $('.player .title').text(title);
        $('.player .artist').text(artist);
        $('.player .cover').css('background-image','url(data/' + cover+')');;

        song = new Audio(url);
        song.preload = "none";
        song.volume = dVol;

        // прослушиватель событий обновления времени
        song.addEventListener('timeupdate',function (){
            var curtime = parseInt(song.currentTime, 10);
            tracker.slider('value', curtime);
        });

        $('.playlist li').removeClass('active');
        elem.addClass('active');
    }
    function playAudio() {
        song.play();
    	//song.addEventListener ('loadedmetadata', function ()
	//{
	//tracker.slider («option», «max», song.duration);
	//});
	//tracker.slider("option", "max", song.duration);
    	song.addEventListener('finished', function(){
	    stopAudio();

	var next = $('.playlist li.active').next();
	if (next.length == 0) {
	    next = $('.playlist li:first-child');
	}
	initAudio(next);

	playAudio();

	song.addEventListener('loadedmetadata', function() {
	    tracker.slider('option', 'max', song.duration);
	    });
	});
        //tracker.slider("option", "max", song.duration);
	tracker.slider("option", "value", tracker.slider("value"));

        $('.play').addClass('hidden');
        $('.pause').addClass('visible');
    }
    function stopAudio() {
	song.currentTime = 0;
        song.pause();
        song.currentTime = 0;
        song.url = '';
        
        $('.play').removeClass('hidden');
        $('.pause').removeClass('visible');
    }

    // играть
    $('.play').click(function (e) {
        e.preventDefault();

        playAudio();
    });

    // Пауза
    $('.pause').click(function (e) {
        e.preventDefault();

        stopAudio();
    });

    // Вперед
    $('.fwd').click(function (e) {
        e.preventDefault();

	song.currentTime = 0;
        stopAudio();

        var next = $('.playlist li.active').next();
        if (next.length == 0) {
            next = $('.playlist li:first-child');
        }
        initAudio(next);
        playAudio();
    });

    // Назад
    $('.rew').click(function (e) {
        e.preventDefault();

        stopAudio();

        var prev = $('.playlist li.active').prev();
        if (prev.length == 0) {
            prev = $('.playlist li:last-child');
        }
        initAudio(prev);
        playAudio();
    });

    // Показать список воспроизведения
    $('.pl').click(function (e) {
        e.preventDefault();

        $('.playlist').fadeIn(300);
    });

    // элементы списка воспроизведения
    $('.playlist li').click(function () {
        stopAudio();
        initAudio($(this));
        playAudio();
    });

    // инициализация - первый элемент в плейлисте
    initAudio($('.playlist li:first-child'));

    // установите громкость
    song.volume = dVol;
    // когда мы инициализируем новый звук, он начинает использовать громкость по умолчанию. Чтобы сохранить значение громкости, вы можете добавить еще одну глобальную переменную и обновлять ее каждый раз, когда мы меняем ползунок громкости. Затем в функции 'initAudio' после 'new Audio' вы можете добавить следующий код: song.volume = ваша новая переменная;

    // инициализация регулятор громкости
    volume.slider({
        range: 'min',
        min: 1,
        max: 100,
        value: 100,
        start: function(event,ui) {},
        slide: function(event, ui) {
            song.volume = ui.value / 100;
            dVol = ui.value / 100;
        },
        stop: function(event,ui) {},
    });

    // пустой ползунок трекера
    tracker.slider({
        range: 'min',
        min: 0, max: 10,
        start: function(event,ui) {},
        slide: function(event, ui) {
            song.currentTime = ui.value;
        },
        stop: function(event,ui) {}
    });
});
Без изменений
jquery-ui-1.8.21.custom.min.js
jquery-1.7.2.min.js

Директория css
styles.css

Код: Выделить всё

/* ============================================================================================== 
Это уведомление об авторских правах должно всегда оставаться нетронутым в таблице стилей.
Оригинальная версия этой таблицы стилей и связанный с ней html-код (x)
доступны по адресу http://www.script-tutorials.com/html5-audio-player-with-playlist/
Авторское право (c) учебные пособия по сценариям. Все права защищены.
Эта таблица стилей и связанный с ней html-код (x)могут быть изменены любым способом в соответствии с вашими требованиями.
================================================================================================= */
* {
    margin: 0;
    padding: 0;
}
body {
    background-color: #fff;
}
header {
    background-color:rgba(33, 33, 33, 0.9);
    color:#fff;
    display:block;
    font: 14px/1.3 Arial,sans-serif;
    margin-bottom: 10px;
    position:relative;
}
header h2{
    font-size: 22px;
    margin: 0px auto;
    padding: 10px 0;
    width: 100%;
    text-align: center;
}
header a, a:visited {
    text-decoration:none;
    color:#fcfcfc;
}

/* Аудиоплеер HTML5 со стилями плейлиста */
.example {
    margin: 10px;
    width: 345px;
}
.player {
    background: transparent url("../images/spr.png") no-repeat scroll center top;
    height: 162px;
    position: relative;
    width: 326px;
    z-index: 2;
}
.title, .artist {
    font-family: verdana;
    left: 167px;
    position: absolute;

    -moz-user-select: none;
    -webkit-user-select: none;
    -ms-user-select: none;
}
.title {
    color: #FFFFFF;
    font-size: 14px;
    font-weight: bold;
    top: 23px;
}
.artist {
    color: #EEEEEE;
    font-size: 12px;
    top: 40px;
}
.pl {
    background: transparent url("../images/spr.png") no-repeat scroll -274px -175px;
    cursor: pointer;
    height: 34px;
    left: 270px;
    position: absolute;
    top: 20px;
    width: 32px;
}
.pl:hover {
    top: 21px;
}
.cover {
    background: transparent url(../data/cover1.jpg) no-repeat scroll center top;
    border-radius: 5px 5px 5px 5px;
    height: 94px;
    left: 20px;
    position: absolute;
    top: 20px;
    width: 94px;
}
.controls {
    cursor: pointer;
    height: 23px;
    left: 167px;
    position: absolute;
    top: 65px;
    width: 138px;
}
.controls .play, .controls .pause, .controls .rew, .controls .fwd {
    background: transparent url("../images/spr.png") no-repeat scroll 0 0;
    float: left;
    height: 100%;
    width: 33%;
}
.controls .play {
    background-position: -8px -171px;
}
.controls .pause {
    background-position: -8px -198px;
    display: none;
}
.controls .rew {
    background-position: -54px -171px;
}
.controls .fwd {
    background-position: -100px -171px;
}
.controls .play:hover {
    background-position: -8px -170px;
}
.controls .pause:hover {
    background-position: -8px -197px;
}
.controls .rew:hover {
    background-position: -54px -170px;
}
.controls .fwd:hover {
    background-position: -100px -170px;
}
.hidden {
    display: none;
}
.controls .visible {
    display: block;
}
.volume {
    height: 11px;
    left: 186px;
    position: absolute;
    top: 96px;
    width: 112px;
}
.tracker {
    height: 15px;
    left: 20px;
    position: absolute;
    top: 126px;
    width: 285px;
}
.ui-slider-range {
    background: transparent url("../images/spr.png") no-repeat scroll 5px -222px;
    height: 100%;
    position: absolute;
    top: 0;
}
.ui-slider-handle {
    cursor: pointer;
    height: 10px;
    margin-left: -5px;
    position: absolute;
    top: 2px;
    width: 10px;
    z-index: 2;
}
.volume .ui-slider-handle {
    background: url("../images/spr.png") no-repeat scroll -201px -188px rgba(0, 0, 0, 0);
    height: 13px;
    width: 13px;
}
.playlist {
    background-color: #333333;
    border-radius: 5px 5px 5px 5px;
    list-style-type: none;
    margin: -10px 0 0 2px;
    padding-bottom: 10px;
    padding-top: 15px;
    position: relative;
    width: 322px;
    z-index: 1;
}
.playlist li {
    color: #EEEEEE;
    cursor: pointer;
    margin: 0 0 5px 15px;
}
.playlist li.active {
    font-weight: bold;
}
Так же изменены картинки под радио потоки


Метаданные SHOUTcast / Icecast всегда идут после первого звукового фрагмента. Невозможно получить метаданные в потоке, не имея перед ним аудиофрагмента.
Большинство станций используют интервалы метаданных 8 КБ.
Многие используют интервалы по 16 КБ.
Не думаю, что когда-либо видел интервал метаданных больше 32 КБ.
Сторона сервера будет буферизовать аудиопоток и очистить этот буфер, как только вы подключитесь. Вы часто будете получать метаданные в первом или втором ответном пакете.

Начиная с Icecast 2.4, предпочтительным способом получения машиночитаемых метаданных о потоках, проходящих через сервер, является status-json.xsl. Этот JSON API по умолчанию включен во всех установках. Начиная с версии 2.4.1 это по умолчанию открытый API, отправляющий заголовок ACAO со знаком «*».
В случае старых установок Icecast (2.3.x): их можно дооснастить JSON API (администратору достаточно скопировать status-json.xsl и xml2json.xslt из 2.4.1 отпустить в веб-каталог).

Запрос метаданных потока

Код: Выделить всё

curl -H "Icy-MetaData: 1" -v "http://192.168.175.1:8000/radiorecordspb" >/dev/null
вывод метаданными потока
Показать

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 192.168.175.1:8000...
* Connected to 192.168.175.1 (192.168.175.1) port 8000
> GET /radiorecordspb HTTP/1.1
> Host: 192.168.175.1:8000
> User-Agent: curl/8.6.0
> Accept: */*
> Icy-MetaData: 1
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Server: Icecast
< Connection: Close
< Pragma: no-cache
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, private
< Vary: Origin
< Access-Control-Allow-Origin: *
< Date: Thu, 21 Mar 2024 06:19:43 GMT
< Content-Type: audio/aacp
< X-Robots-Tag: index, noarchive
< foo: bar
< icy-br: 96
< ice-audio-info: channels=2;samplerate=44100;bitrate=96
< icy-description: Stream transcoder based on liquidsoap
< icy-genre: various
< icy-name: rr_main
< icy-pub: 1
< icy-metaint: 8192
<
{ [7690 bytes data]
100 707k 0 707k 0 0 13071 0 --:--:-- 0:00:55 --:--:-- 11178

Код: Выделить всё

 curl -v "http://192.168.175.1:8000/radiorecordspb"
Ответ
Показать
* Trying 192.168.175.1:8000...
* Connected to 192.168.175.1 (192.168.175.1) port 8000
> GET /radiorecordspb HTTP/1.1
> Host: 192.168.175.1:8000
> User-Agent: curl/8.6.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: Icecast
< Connection: Close
< Pragma: no-cache
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, private
< Vary: Origin
< Access-Control-Allow-Origin: *
< Date: Thu, 21 Mar 2024 07:08:45 GMT
< Content-Type: audio/aacp
< X-Robots-Tag: index, noarchive
< foo: bar
< icy-br: 96
< ice-audio-info: channels=2;samplerate=44100;bitrate=96
< icy-description: Stream transcoder based on liquidsoap
< icy-genre: various
< icy-name: rr_main
< icy-pub: 1
<
Warning: Binary output can mess up your terminal. Use "--output -" to tell
Warning: curl to output it to your terminal anyway, or consider "--output
Warning: <FILE>" to save to a file.
* Failure writing output to destination
* Closing connection

Код: Выделить всё

curl -I "http://192.168.175.1:8000/radiorecordspb"
вывод
Показать
HTTP/1.1 200 OK
Server: Icecast
Connection: Close
Pragma: no-cache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, private
Vary: Origin
Access-Control-Allow-Origin: *
Date: Thu, 21 Mar 2024 07:09:43 GMT
Content-Type: audio/aacp
X-Robots-Tag: index, noarchive
foo: bar
icy-br: 96
ice-audio-info: channels=2;samplerate=44100;bitrate=96
icy-description: Stream transcoder based on liquidsoap
icy-genre: various
icy-name: rr_main
icy-pub: 1

Код: Выделить всё

curl -s "http://192.168.175.1:8000/status-json.xsl"
вывод
Показать
{"icestats":
{"admin":"AAMamzikov@localhost",
"banned_IPs":0,
"build":20240318120222,
"host":"192.168.175.1",
"location":"Vol.Obl",
"outgoing_kbitrate":1124,
"server_id":"Icecast 2.4.0-kh19",
"server_start":"20/Mar/2024:12:03:36 +0300",
"stream_kbytes_read":137073,
"stream_kbytes_sent":815018,
"source":[

{"genre":"various",
"listener_peak":0,
"listeners":0,
"listenurl":"http://192.168.175.1:8000/autoradio",
"on_demand":1,
"server_name":"Unspecified name"},

{"genre":"various",
"listener_peak":0,
"listeners":0,
"listenurl":"http://192.168.175.1:8000/dfm-radio",
"on_demand":1,
"server_name":"Unspecified name"},
{"genre":"various",
"listener_peak":0,
"listeners":0,
"listenurl":"http://192.168.175.1:8000/dorognoeradio",
"on_demand":1,
"server_name":"Unspecified name"},

{"genre":"various",
"listener_peak":0,
"listeners":0,
"listenurl":"http://192.168.175.1:8000/europaplus-radio",
"on_demand":1,
"server_name":"Unspecified name"},

{"genre":"various",
"listener_peak":0,
"listeners":0,
"listenurl":"http://192.168.175.1:8000/marusya",
"on_demand":1,
"server_name":"Unspecified name"},

{"genre":"various",
"listener_peak":2,
"listeners":0,
"listenurl":"http://192.168.175.1:8000/nashe-radio",
"on_demand":1,
"server_name":"Unspecified name"},

{"genre":"various","listener_peak":0,"listeners":0,"listenurl":"http://192.168.175.1:8000/piterfm","on_ ... nspecified name"},

{"audio_info":
"channels=2;
samplerate=44100;
bitrate=96",
"bitrate":96,
"connected":5455,
"genre":"various",
"incoming_bitrate":97312,
"listener_peak":15,
"listeners":12,
"listenurl":"http://192.168.175.1:8000/radiorecordspb",
"metadata_updated":"21/Mar/2024:10:44:14 +0300",
"outgoing_kbitrate":1137,
"queue_size":101329,
"server_description":"Stream transcoder based on liquidsoap",
"server_name":"rr_main",
"server_type":"audio/aacp",
"stream_start":"21/Mar/2024:09:14:45 +0300",
"title":"MODJO - Lady (Hear Me Tonight) (Record Mix)",
"total_mbytes_sent":569,
"yp_currently_playing":"MODJO - Lady (Hear Me Tonight) (Record Mix)"},

{"genre":"various",
"listener_peak":0,
"listeners":0,
"listenurl":"http://192.168.175.1:8000/radiovanya-ivanovo",
"on_demand":1,
"server_name":"Unspecified name"},

{"genre":"various",
"listener_peak":2,
"listeners":0,
"listenurl":"http://192.168.175.1:8000/rusradio",
"on_demand":1,
"server_name":"Unspecified name",
"server_type":"audio/mpeg"}]}}
Только для конкретного потока

Код: Выделить всё

curl -s "http://192.168.175.1:8000/status-json.xsl" | jq '.icestats.source[] | select(.listenurl == "http://192.168.175.1:8000/radiorecordspb")'
Ответ
Показать
{
"audio_info": "channels=2;samplerate=44100;bitrate=96",
"bitrate": 96,
"connected": 6430,
"genre": "various",
"incoming_bitrate": 97232,
"listener_peak": 15,
"listeners": 12,
"listenurl": "http://192.168.221.89:8000/radiorecordspb",
"metadata_updated": "21/Mar/2024:11:00:46 +0300",
"outgoing_kbitrate": 1099,
"queue_size": 113801,
"server_description": "Stream transcoder based on liquidsoap",
"server_name": "rr_main",
"server_type": "audio/aacp",
"stream_start": "21/Mar/2024:09:14:45 +0300",
"title": "R3HAB/INNA/SASH! - Rock My Body (Record Mix)",
"total_mbytes_sent": 703,
"yp_currently_playing": "R3HAB/INNA/SASH! - Rock My Body (Record Mix)"
}

Получить информацию о всех источниках (потоках) на сервере:

Код: Выделить всё

curl -s "http://192.168.175.1:8000/status-json.xsl"
Получить информацию о конкретном источнике (потоке) по его URL:

Код: Выделить всё

curl -s "http://192.168.175.1:8000/status-json.xsl?mount=/radiorecordspb"
Получить информацию о текущем треке, воспроизводимом на определенном источнике (потоке):

Код: Выделить всё

curl -s "http://192.168.175.1:8000/status-json.xsl?mount=/radiorecordspb&mode=viewjson"
Получить информацию о состоянии сервера, такую как количество активных соединений, количество слушателей и т. д.:

Код: Выделить всё

curl -s "http://192.168.175.1:8000/status-json.xsl?mode=viewjson"
Тестируем получение информации для одного из потоков
/test.html

Код: Выделить всё

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
  <title>Информация о потоке</title>
</head>
<body>
  <h1>Данные о потоке:</h1>
  <ul id="track-info"></ul>

  <h2>Слушатели потока:</h2>
  <ul id="listeners-info"></ul>

  <h2>Информация о сервере:</h2>
  <ul id="server-info"></ul>

  <script>
    function getCurrentTrack() {
      fetch('http://192.168.175.1:8000/status-json.xsl?mount=/radiorecordspb')
        .then(function(response) {
          if (response.ok) {
            return response.json();
          }
          throw new Error('Ошибка при получении данных с сервера.');
        })
        .then(function(data) {
          var trackInfo = data.icestats.source;
          var serverInfo = data.icestats;

          // Очищаем предыдущие данные
          document.getElementById('track-info').innerHTML = '';
          document.getElementById('listeners-info').innerHTML = '';
          document.getElementById('server-info').innerHTML = '';

          // Выводим информацию о текущем треке
          for (var key in trackInfo) {
            if (key === 'source') {
              continue; // Пропускаем свойство "source"
            }

            var listItem = document.createElement('li');
            var russianKey = getRussianKey(key); // Получаем русское название свойства
            var value = trackInfo[key];

            // Обрабатываем свойство "Слушатели"
            if (key === 'listener') {
              var listeners = value;

              // Выводим каждого слушателя
              for (var i = 0; i < listeners.length; i++) {
                var listenerItem = document.createElement('li');
                var listenerInfo = listeners[i];
                var listenerText = 'IP: ' + listenerInfo.IP + ', Подключено: ' + listenerInfo.Connected;
                listenerItem.textContent = listenerText;
                document.getElementById('listeners-info').appendChild(listenerItem);
              }
            } else {
              if (key === 'audio_info') {
                value = value.replace('channels', 'каналов').replace('samplerate', 'частота дискретизации').replace('bitrate', 'битрейт');
              }
              listItem.innerHTML = russianKey + ': ' + value;
              document.getElementById('track-info').appendChild(listItem);
            }
          }

          // Выводим информацию о сервере
          for (var key in serverInfo) {
            if (key === 'source') {
              continue; // Пропускаем свойство "source"
            }

            var listItem = document.createElement('li');
            var russianKey = getRussianKey(key); // Получаем русское название свойства
            var value = serverInfo[key];
            listItem.innerHTML = russianKey + ': ' + value;
            document.getElementById('server-info').appendChild(listItem);
          }
        })
        .catch(function(error) {
          console.log('Ошибка:', error.message);
        });
    }

    // Функция для получения русского названия свойства
    function getRussianKey(key) {
      var russianKeys = {
        'admin': 'Администратор',
        'banned_IPs': 'Заблокированные IP',
        'build': 'Версия',
        'host': 'Хост',
        'location': 'Местоположение',
        'outgoing_kbitrate': 'Исходящая скорость передачи',
        'server_id': 'Идентификатор сервера',
        'server_start': 'Время запуска сервера',
        'stream_kbytes_read': 'Количество прочитанных килобайт',
        'stream_kbytes_sent': 'Количество отправленных килобайт',
        'audio_info': 'Информация о звуке',
        'bitrate': 'Битрейт',
        'connected': 'Подключено',
        'genre': 'Жанр',
        'incoming_bitrate': 'Входящий битрейт',
        'listener_peak': 'Пиковое количество слушателей',
        'listeners': 'Количество слушателей',
        'listenurl': 'URL для прослушивания',
        'metadata_updated': 'Обновлено',
        'outgoing_kbitrate': 'Исходящая скорость передачи',
        'queue_size': 'Размер очереди',
        'server_description': 'Описание сервера',
        'server_name': 'Название сервера',
        'server_type': 'Тип сервера',
        'stream_start': 'Время начала потока',
        'title': 'Название трека',
        'total_mbytes_sent': 'Общее количество отправленных мегабайт',
        'yp_currently_playing': 'Текущий трек',
        'listener': 'Слушатели'
        // Добавьте остальные русские названия свойств
      };

      // Возвращаем русское название свойства, если оно существует, иначе возвращаем оригинальное название
      return russianKeys[key] || key;
    }

    // Обновляем информацию о текущем треке каждые 5 секунд
    setInterval(getCurrentTrack, 5000);

    // Вызываем функцию для получения информации о текущем треке при загрузке страницы
    getCurrentTrack();
  </script>
</body>
</html>
количество слов: 2514
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 866
Стаж: 5 лет 9 месяцев
Откуда: Вологодская область
Поблагодарили: 41 раз
Контактная информация:

icecast

Сообщение Артём Мамзиков »

Установка из исходного кода на AltLinux 8.2 x64

Icecast KH практика показывает, что он оказался стабильнее, чем обычный Icecast.
Также, KH версия в отличие от обычной совместима с сервисом Streamlicensing
сборка KH явно превосходит по своей функциональности базовую.
Давайте разберём по запчастям:
Burst-size - закачка на клиента на максимально возможной скорости, в отличии от стандартного закачивающего на скорости точки монтирования. Т.е. клиент быстрее получает дополнительный буфер и быстрее начинает проигрывание материала. Плюс сервер быстрее "отстреливает" подобного клиента и переводит его в режим получения обычного потока, что позволяет снизить нагрузку на сервера в моменты большого притока новых слушателей. У меня динамика от тысячи до двух тысяч в час в утренние часы.
Возможность перенаправления по условию на ВНЕШНИЕ точки монтирования, обычный icecast может перенаправлять только на внутренние точки монтирования. Эта фича позволяет более гибко и полноценно распределять нагрузку по ферме вещающих серверов.
Возможность задавать максимальную полосу занимаемую icecast просто в конфиге.
Возможность сбора мета данных в отдельный log файл.
Встроенный механизм allow deny хостов.
Встроенный механизм авторизации через auth.php скрипт.
Встроенный механизм allow UA.
intro, outtro файлы.
+ много мелких фич в admin интерфейсе удобных для администрирования и мониторинга
Ограничение 4000 подключений, Решаем проблему.
Вписываем в /etc/security/limits.conf
nobody - nofile 10000

Как принять https поток, а не http ?
Хорошим решением этой проблемы является настройка обратного прокси-сервера с помощью nginx. Я сделал это, чтобы получить доступ к потоку https через http, и icecast2 может передать его без проблем.
Форк -kh, если Icecast поддерживает SSL и имеет множество расширений и может ретранслировать поток https.
Вы не должны включать http или https в контекст, только адрес.

Код: Выделить всё

    <relay>
            <server>sourceip</server>
            <port>443</port>
            <mount>/sourcemount</mount>
            <local-mount>/localmount</local-mount>
            <on-demand>0</on-demand>
            <relay-shoutcast-metadata>1</relay-shoutcast-metadata>
    </relay>
Я проверил с сервером icecast ветки -kh, и это сработало, НО я не смог подтвердить, что он действительно устанавливает SSL-соединение; но он устанавливает связь.

Обратить внимание что веб версия немного отличаеться от стандартного icecast
http://192.168.***.**:8000/index.html - Версия KH
http://192.168.***.**:8000/status.xsl - Обычная версия
Отличие веб версий
Показать
Веб файлы для KH версии
index.html
admin.html
adminbar.html
statusbar.html
auth.xsl
server_version.xsl
status.xsl
status2.xsl
7.xsl

/admin/
flashpolicy
listmounts.xsl
managerelays.xsl
response.xsl
stats.xsl
viewxml.xsl
listclients.xsl
logs.xsl
manageauth.xsl
moveclients.xsl
showlog.xsl
updatemetadata.xsl
xspf.xsl

/doc/
icecast2_basicsetup.html
icecast2_glossary.html
icecast2_introduction.html
icecast2_stats.html
Index.hhk
win32_section2.html
icecast2_config_file.html
icecast2.hhc
icecast2_listenerauth.html
icecast2_win32.html
index.html
win32_section3.html
icecast2_admin.html
icecast2_faq.html
icecast2.hhp
icecast2_relay.html
icecast2_yp.html
index_win32.html
win32_section1.html



Обычная версия
status.xsl
server_version.xsl
auth.xsl
status-json.xsl
xml2json.xslt

/admin/
stats.xsl
listmounts.xsl
listclients.xsl?mount=/autoradio
moveclients.xsl?mount=/autoradio
response.xsl
vclt.xsl
manageauth.xsl
xspf.xsl
moveclients.xsl
updatemetadata.xsl

/doc/
index.html
config-file.html
introduction.html
admin-interface.html
faq.html
glossary.html
auth.html
relaying.html
server-stats.html
basic-setup.html
win32.html
changes.html
yp.html
Icecast -kh branches
github Icecast -kh

Код: Выделить всё

./configure --help
./configure --help
Показать
`configure' настраивает Icecast 2.4.0-kh19 для адаптации ко многим типам систем.

Использование: ./configure [ОПЦИЯ]... [VAR=ЗНАЧЕНИЕ]...

Чтобы назначить переменные окружения (например, CC, CFLAGS...), укажите их как
VAR=VALUE. Смотрите ниже описания некоторых полезных переменных.

Значения по умолчанию для параметров указаны в квадратных скобках.

Конфигурация:
-h, --help отобразите эту справку и выйдите
--help=short параметры отображения, характерные для данного пакета
--help=recursive отобразите краткую справку по всем включенным пакетам
-V, --version отобразите информацию о версии и выйдите
-q, --quiet, --silent не печатайте сообщения `проверка..."
--cache-file=FILE кэшировать результаты теста в ФАЙЛЕ [отключено]
-C, --config-cache псевдоним для `--cache-file=config.cache'
-n, --no-create не создавайте выходные файлы
--srcdir=DIR найдите исходники в каталоге [настроить каталог или `..']

Установочные каталоги:
--prefix=PREFIX установите архитектурно-независимые файлы в PREFIX [/usr/local]
--exec-prefix=EPREFIX установите файлы, зависящие от архитектуры, в PREFIX [PREFIX]

По умолчанию `make install" установит все файлы в `/usr/local/bin', `/usr/local/lib' etc.
Вы можете указать установочный префикс, отличный от `/usr/local' с помощью `--prefix',
например `--prefix=$HOME'.

Для лучшего контроля используйте приведенные ниже опции.

Точная настройка установочных каталогов:
--bindir=DIR пользовательские исполняемые файлы [EPREFIX/bin]
--sbindir=DIR исполняемые файлы системного администратора [EPREFIX/sbin]
--libexecdir=DIR исполняемые файлы программы [EPREFIX/libexec]
--sysconfdir=DIR данные для одной машины, доступные только для чтения [PREFIX/etc]
--sharedstatedir=DIR изменяемые данные, не зависящие от архитектуры [PREFIX/com]
--localstatedir=DIR изменяемые данные для одной машины [PREFIX/var]
--runstatedir=DIR изменяемые данные для каждого процесса [LOCALSTATEDIR/run]
--libdir=DIR библиотеки объектного кода [EPREFIX/lib]
--includedir=DIR Заголовочные файлы C [PREFIX/include]
--oldincludedir=DIR Заголовочные файлы C для не-gcc [/usr/include]
--datarootdir=DIR архив только для чтения.-независимый root данных [PREFIX/share]
--datadir=DIR данные, не зависящие от архитектуры, доступны только для чтения [DATAROOTDIR]
--infodir=DIR информационная документация [DATAROOTDIR/info]
--localedir=DIR данные, зависящие от языка [DATAROOTDIR/locale]
--mandir=DIR документация пользователя [DATAROOTDIR/man]
--docdir=DIR документация администрация [DATAROOTDIR/doc/icecast]
--htmldir=DIR документация html [DOCDIR]
--dvidir=DIR документация dvi [DOCDIR]
--pdfdir=DIR документация pdf [DOCDIR]
--psdir=DIR документация ps [DOCDIR]

Названия программ:
--program-prefix=PREFIX добавляйте ПРЕФИКС к именам установленных программ
--program-suffix=SUFFIX добавляйте СУФФИКС к названиям установленных программ
--program-transform-name=PROGRAM запустите программу sed по именам установленных программ

Типы систем:
--build=BUILD настроить для сборки при сборке [угадано/guessed]
--host=HOST перекрестная компиляция для создания программ для запуска на хосте [BUILD]

Дополнительные функции:
--disable-option-checking игнорировать непризнанное --enable/--with options
--disable-FEATURE не включать ФУНКЦИЮ (аналогично --enable-FEATURE=нет)
--enable-FEATURE[=ARG] включить ФУНКЦИЮ [ARG=yes]
--enable-silent-rules менее подробный вывод сборки (отмена: "make V=1")
--disable-silent-rules подробный вывод сборки (отменить: "make V=0")
--enable-maintainer-mode включить создание правил и зависимостей, бесполезных (а иногда и сбивающих с толку) для обычного установщика
--enable-shared[=PKGS] создавать общие библиотеки [по умолчанию=да]
--enable-static[=PKGS] создавать статические библиотеки [по умолчанию=да]
--enable-fast-install[=PKGS] оптимизация для быстрой установки [по умолчанию=да]
--enable-dependency-tracking не отвергайте медленные средства извлечения зависимостей
--disable-dependency-tracking ускоряет одноразовую сборку
--disable-libtool-lock избегайте блокировки (может нарушить параллельную сборку)
--disable-largefile исключить поддержку больших файлов
--disable-yp отключить поддержку каталога YP

Дополнительные пакеты:
--with-PACKAGE[=ARG] использовать ПАКЕТ [АРГУМЕНТ=да]
--without-PACKAGE не используйте PACKAGE (то же, что --with-PACKAGE=no)
--with-pic[=PKGS] старайтесь использовать только объекты PIC/non-PIC [по умолчанию=использовать оба]
--with-aix-soname=aix|svr4|both вариант управления версиями разделяемой библиотеки (он же "SONAME"), предоставляемый в AIX, [по умолчанию=aix].
--with-gnu-ld предположим, что компилятор C использует GNU ld [по умолчанию=нет]
--with-sysroot[=DIR] Выполните поиск зависимых библиотек в каталоге (или в системном корне компилятора, если он не указан).
--with-xslt-config=PATH используйте xslt-config в PATH, чтобы найти libxslt
--with-ogg=PREFIX Префикс, в котором установлен libogg (необязательно)
--with-vorbis=PREFIX Префикс, в котором установлен libvorbis (необязательно)
--with-theora=PREFIX Префикс, в котором установлена libtheora (необязательно)
--with-speex=PREFIX Префикс, в котором установлен libspeex (необязательно)
--with-curl=PFX Префикс, в котором установлен libcurl (необязательно)
--with-curl-config=curl-config Используйте curl-config, чтобы найти libcurl
--with-openssl=PFX Используйте curl-config, чтобы найти libcurl

Некоторые влиятельные переменные среды:
CC Команда компилятора C
CFLAGS Флаги компилятора C
LDFLAGS флаги компоновщика, например -L<lib dir>, если у вас есть библиотеки в нестандартном каталоге <lib dir>
LIBS библиотеки для передачи компоновщику, например -l<библиотека>
CPPFLAGS (Objective) Флаги препроцессора C/C++, например -I<включить каталог>, если у вас есть заголовки в нестандартном каталоге <включить каталог>
LT_SYS_LIBRARY_PATH Определенный пользователем путь поиска библиотеки во время выполнения.
CXX Команда компилятора C++
CXXFLAGS Флаги компилятора C++
CXXCPP Препроцессор C++
ICY_CHARSET Набор символов, используемый для метаданных ICY, по умолчанию - UTF 8
XSLTCONFIG Программа настройки XSLT
OGG_PREFIX путь к установке ogg
VORBIS_PREFIX путь к установке vorbis
THEORA путь к установке theora
SPEEX путь к установке speex

Используйте эти переменные, чтобы переопределить выбор, сделанный "configure", или помочь
ему найти библиотеки и программы с нестандартными именами / расположениями.

Сообщать об ошибках в <karl@kheyes.plus.com>.
Пути установки
Показать
/etc/
/etc/chroot.d/
/etc/logrotate.d/
/etc/rc.d/init.d/
/usr/bin/
/usr/share/doc/icecast/
/usr/share/doc/icecast/assets/css/
/usr/share/doc/icecast/assets/font/
/usr/share/doc/icecast/assets/img/
/usr/share/doc/icecast/img/
/var/lib/icecast/admin/
/var/lib/icecast/etc/
/var/lib/icecast/lib64/
/var/lib/icecast/logs/
/var/lib/icecast/web/
/var/run/icecast/
/usr/lib/debug/usr/bin/
/usr/src/debug/icecast/src/avl/
/usr/src/debug/icecast/src/httpp/
/usr/src/debug/icecast/src/log/
/usr/src/debug/icecast/src/net/
/usr/src/debug/icecast/src/thread/
/usr/src/debug/icecast/src/
Создать Пользователя и группу icecast

Код: Выделить всё

./configure --prefix=/ --sysconfdir=/etc --localstatedir=/var --bindir=/usr/bin --datadir=/var/lib --mandir=/usr/share/man --docdir=/usr/share --libdir=/usr/lib/debug --includedir=/usr/src/debug/icecast/src
make
make install

make LDLIBS="-lxml2 -L/usr/lib64"
make LDLIBS="-lxml2 -L/usr/lib64" LDFLAGS="-Wl,-rpath,/usr/lib64"
make LDLIBS="-lxml2 -L/usr/lib64" LDFLAGS="-Wl,-rpath,/usr/lib64" LIBS="-lxml2"
make LDLIBS="-lxml2 -L/usr/lib64" LDFLAGS="-Wl,-rpath,/usr/lib64" LIBS="-lxml2 -lgcc_s"
make LDLIBS="-lxml2 -L/usr/lib64" LDFLAGS="-Wl,-rpath,/usr/lib64" LIBS="-lxml2 -lgcc_s -L/usr/lib64"
make LDLIBS="-lxml2 -L/usr/lib64" LDFLAGS="-Wl,-rpath,/usr/lib64" LIBS="-lxml2 -lgcc_s -L/usr/lib64 -Wl,-rpath,/usr/lib64"

make LDLIBS="-lxml2 -L/usr/lib64" LDFLAGS="-Wl,-rpath,/usr/lib64" LIBS="-lxml2 -lgcc_s -L/usr/lib64 -Wl,-rpath,/usr/lib64" install

Проверка

Код: Выделить всё

icecast -V
Icecast 2.4.0-kh19

usage: icecast [-b -v] -c <file>
options:
-c <file> Specify configuration file
-v Display version info
-b Run icecast in the background

Настраиваем файл конфигурации и пробуем запустить

Код: Выделить всё

<icecast>
    <!-- местоположение и администратор - это две произвольные строки, которые, например, видны
	на странице информации о сервере веб-интерфейса icecast
    (server_version.xsl). -->
    <location>Vol.Obl</location>
    <admin>AAMamzikov@localhost</admin>

    <!-- важный!
	Специально для неопытных пользователей:
	Начните с изменения всех паролей и перезапуска Icecast.
	Подробные инструкции по настройке приведены в документации.
	Она также доступна здесь: http://icecast.org/docs/
    -->

    <limits>
        <clients>800</clients>
        <sources>900</sources>
        <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-on-connect, но это позволяет быть более
	    конкретно о том, сколько лопнуть. Большинству людей это не понадобится
	    изменение по умолчанию 64К. Применяется для всех точек монтирования  -->
        <burst-size>65535</burst-size>
        <!--<max-bandwidth>100M</max-bandwidth> -->

    </limits>

    <http-headers>
	<header name="Access-Control-Allow-Origin" value="*" />
	<header name="X-Robots-Tag" value="index, noarchive" />
	<header name="foo" value="bar" status="200" />
	<header name="Nelson" value="Ha-Ha!" status="404" />
    </http-headers>

    <authentication>
        <!-- Источники войдите в систему с именем пользователя 'source' -->
        <source-password></source-password>
        <!-- Реле войдите под именем пользователя'relay' -->
	<!--<relay-user>relay</relay-user>-->
        <relay-password></relay-password>

        <!-- Администратор входит в систему с именем пользователя, указанным ниже -->
        <admin-user>admin</admin-user>
        <admin-password>Пароль</admin-password>
    </authentication>

    <!-- установите точку монтирования для используемого источника shoutcast, если не указано значение по умолчанию
         указано значение /stream, но вы можете изменить его здесь, если требуется альтернатива
         или требуется расширение
    <shoutcast-mount>/live.nsv</shoutcast-mount>
    -->

    <!-- Раскомментируйте это, если вам нужны списки каталогов -->
    <!--
    <directory>
        <yp-url-timeout>15</yp-url-timeout>
        <yp-url>http://dir.xiph.org/cgi-bin/yp-cgi</yp-url>
    </directory>
    <directory>
        <yp-url-timeout>15</yp-url-timeout>
        <yp-url>http://www.oddsock.org/cgi-bin/yp-cgi</yp-url>
    </directory>
    -->

    <!-- Это имя хоста или IP-адрес, которое другие пользователи будут использовать для подключения к вашему серверу.
	Это влияет в основном на URL-адреса, сгенерированные Icecast для плейлистов и yp
	объявления. Вы должны правильно настроить его, чтобы списки YP работали!
    -->
    <hostname>192.168.175.21</hostname>

    <!-- Вы можете использовать эти два, если вам нужен только один слушатель -->
    <!--<port>8000</port> -->
    <!--<bind-address>127.0.0.1</bind-address>-->

    <!-- У вас может быть несколько элементов <listen-socket> -->
    <listen-socket>
        <port>8000</port>
        <!-- <bind-address>127.0.0.1</bind-address> -->
        <!-- <shoutcast-mount>/stream</shoutcast-mount> -->
        <bind-address>192.168.175.21</bind-address>
    </listen-socket>
    <!--
    <listen-socket>
        <port>8001</port>
    </listen-socket>
    -->
    <!--
    <listen-socket>
        <port>8443</port>
        <ssl>1</ssl>
    </listen-socket>
    -->


    <!-- Глобальные настройки заголовка.
         Заголовки, определенные здесь, будут возвращаться для каждого HTTP-запроса в Icecast.

         Заголовок ACAO делает Icecast общедоступным контентом/API по умолчанию
         Это упростит встраивание потоков (это необходимо для некоторых функций HTML5).
         Также это позволяет получить прямой доступ, например, к /status-json.xsl с других сайтов.
         Если вы этого не хотите, закомментируйте следующую строку или ознакомьтесь с CORS.
    -->

    <!-- Разрешите указать несколько главных серверов, пробуя каждый из них по очереди.
    <relay>
        <local-mount>/stream.mp3</local-mount>
        <server>a.b.c.d</server>
        <timeout>6</timeout>
        <master>
            <port>8000</port>
            <mount>/a</mount>
        </master>
        <master>
            <port>80</port>
            <mount>/</mount>
        </master>
    </relay>
    -->

    <!-- Ретрансляция
         Вам это не нужно, если у вас только один сервер.
         Пожалуйста, обратитесь к документации для получения подробного объяснения.-->
    <!--<master-server>127.0.0.1</master-server>-->
    <!--<master-server-port>8001</master-server-port>-->
    <!--<master-update-interval>120</master-update-interval>-->
    <!--<master-password>hackme</master-password>-->

    <!-- Попытка связи между серверами Icecast на Record -->
    <!-- <master-server>92.255.66.132</master-server> -->
    <!-- <master-server-port>8101</master-server-port> -->
    <!-- <master-update-interval>120</master-update-interval> -->
    <!-- <master-username>relay</master-username> -->
    <!-- <master-password></master-password> -->
    <!-- <relays-on-demand>1</relays-on-demand> -->
    
    <!--Ретранслятор главного сервера поддерживается только между серверами Icecast-->
    <!--<master-server>127.0.0.1</master-server>-->
    <!--<master-server-port>8001</master-server-port>-->
    <!--<master-update-interval>120</master-update-interval>-->
    <!--<master-username>relay</master-username>-->
    <!--<master-password>hackme</master-password>-->
	<!-- проблема, описанная выше, с аутентификацией для реле при настройке ведомого устройства -->
    <!--<master-relay-auth>1</master-relay-auth>-->
    <!--<relays-on-demand>0</relays-on-demand>-->

    <!-- Установка этого параметра делает все реле relay доступными по требованию, если они не переопределены, это
	полезно для основных реле, у которых здесь нет определений <relay>.

	перенаправлений может быть несколько. В данном примере
	* server — имя сервера, с которого берется поток; port — сетевой порт, на котором удаленный сервер отдает поток;
	mount — точка мониторования на стороне удаленного сервера, с которого берем поток;
	local-mount — точка монтирования, которая будет использоваться нашим сервером для обращения к настраиваемому потоку;
	on-demand — если стоит 0, сервер всегда берет поток и проигрывает его, если 1 — только при наличие активных обращений.
	Значение по умолчанию равно 0 -->
    <!--<relays-on-demand>1</relays-on-demand>-->
	
	<!-- Запросите главный сервер перенаправить новых слушателей на этот подчиненный сервер передаваемые данные основаны на <имени хоста> и <порту> -->
    <!--<master-redirect>1</master-redirect>-->

    <!-- Максимальное количество подчиненных устройств, которые могут зарегистрироваться для перенаправления нового прослушивателя. -->
    <!--<max-redirect-slaves>10</max-redirect-slaves>-->

    <!-- Ретрансляторы. Укажите информацию о подключении и по умолчанию запросите встроенные метаданные для потоков mp3, если они доступны.
         Ретранслятор по запросу получит поток только при наличии подключенных слушателей -->

<!--
<relay>
    <server>nashe1.hostingradio.ru</server>  Это IP-адрес DNS сервера, который содержит точку монтирования для ретрансляции.

    <port>8000</port>   Это TCP-порт для сервера, который содержит точку монтирования для ретрансляции

    <mount>/nashe-128.mp3</mount> Точка монтирования, расположенная на удаленном сервере. Если вы ретранслируете поток shoutcast, это должен быть /или /name.

    <local-mount>/Наше Радио</local-mount> Имя, используемое для локальной точки монтирования. Так будет называться монтировка на сервере ретрансляции.
    По умолчанию используется имя удаленной точки монтирования.

    <username>joe</username> Источник ретранслятора может потребовать аутентификации сам, если это так, укажите здесь имя пользователя.

    <password>soap</password>  Источник ретранслятора может потребовать аутентификации сам, если это необходимо, укажите здесь пароль.

    <relay-shoutcast-metadata>0</relay-shoutcast-metadata> Если вы ретранслируете поток Shoutcast, 
    вы можете указать этот индикатор, чтобы также ретранслировать метаданные (названия песен), которые являются частью потока данных Shoutcast.
    По умолчанию это включено, но удаленный сервер решает, будет ли он отправлять какие-либо. 1: включено 0,: отключено

        <on-demand>0</on-demand> Ретранслятор по запросу будет извлекать поток только в том случае, если есть слушатели, запрашивающие поток. 1: включено ,:0 выключенно
    (по умолчанию <relays-on-demand>). Это полезно в случаях, когда вы хотите ограничить расходы на полосу пропускания, когда никто не слушает.
</relay>
-->

    <!--
    <relay>
        <server>127.0.0.1</server>
        <port>8080</port>
        <mount>/example.ogg</mount>
        <local-mount>/different.ogg</local-mount>
        <on-demand>1</on-demand>
        <retry-delay>30</retry-delay>

        <relay-shoutcast-metadata>0</relay-shoutcast-metadata>
    </relay>
    -->


	<relay>
<!--		<server>51.15.175.27</server>
		<port>80</port>
		<mount>/nashe-128.mp3</mount>-->
<!-- https://nashe1.hostingradio.ru/nashe-256 -->
		<server>5.101.51.181</server>
		<port>80</port>
		<mount>/nashe-256</mount>
		<local-mount>/nashe-radio</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
<!--		<server>95.216.21.120</server>
		<port>443</port>
		<mount>/radio_vanya-hi</mount>
		<server>stream03.pcradio.ru</server> -->
		<server>62.210.138.35</server>
                <port>443</port>
                <mount>/radio_vanya-hi</mount>
		<local-mount>/radiovanya-ivanovo</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
<!--		<server>23.105.253.228</server>
		<port>80</port>
		<mount>/dfm128.mp3</mount>-->
		<server>193.162.143.219</server>
		<port>8000</port>
		<mount>/dfm_vld_64.aac</mount>
		<local-mount>/dfm-radio</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
		<server>46.21.248.168</server>
		<port>8052</port>
		<mount>/europaplus256.mp3</mount>
		<local-mount>/europaplus-radio</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
		<server>23.111.104.132</server>
		<port>80</port>
		<mount>/rr_main96.aacp</mount>
		<local-mount>/radiorecordspb</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
<!--		<server>91.207.59.30</server>
		<port>80</port>
		<mount>/stream/air/aac/64/100</mount> -->
		<server>193.162.143.219</server>
		<port>8000</port>
		<mount>/avtoradio_vld_64.aac</mount>
		<local-mount>/autoradio</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
		<server>193.162.143.219</server>
		<port>8000</port>
		<mount>/dorozhnoe_nsb_64.aac</mount>
		<local-mount>/dorognoeradio</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
<!--		<server>23.105.253.212</server>
		<port>80</port>
		<mount>/rusradio128.mp3</mount>-->
		<server>193.162.143.219</server>
		<port>8000</port>
		<mount>/rusradio_vld_64.aac</mount>
		<local-mount>/rusradio</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
		<server>95.216.21.120</server>
		<port>443</port>
		<mount>/piterfm_1009-hi</mount>
		<local-mount>/piterfm</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
		<server>185.185.69.42</server>
		<port>9433</port>
		<mount>/marusya_default</mount>
		<local-mount>/marusya</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

    

    <!-- Точки монтирования
	Определяйте разделы <монтировать><mount> только в том случае, если вы хотите использовать расширенные параметры,
	такие как альтернативные имена пользователей или пароли
    <mount>
        <mount-name>/example-complex.ogg</mount-name>

        <username>othersource</username>
        <password>hackmemore</password>

        <max-listeners>1</max-listeners>
	<max-listener-duration>3600</max-listener-duration>
	    <max-bandwidth>1000k</max-bandwidth>
        <file-seekable>0</file-seekable>
        <dump-file>/backup/live-%d-%b.ogg</dump-file>
        <dump-file>/tmp/dump-example1.ogg</dump-file>
	<intro>/example_intro.ogg</intro>
        <fallback-mount>/example2.ogg</fallback-mount>
        <fallback-override>1</fallback-override>
        <fallback-when-full>1</fallback-when-full>
	<charset>ISO8859-1</charset>
	<public>1</public>
	<stream-name>My audio stream</stream-name>
	<stream-description>My audio description</stream-description>
	<stream-url>http://some.place.com</stream-url>
	<genre>classical</genre>
	<bitrate>64</bitrate>
	<type>application/ogg</type>
	<subtype>vorbis</subtype>
        <hidden>1</hidden>
	<burst-size>65536</burst-size>
	<mp3-metadata-interval>4096</mp3-metadata-interval>
        <no-yp>1</no-yp>
        <authentication type="htpasswd">
                <option name="filename" value="myauth"/>
                <option name="allow_duplicate_users" value="0"/>
        </authentication>
	<http-headers>
	    <header name="Access-Control-Allow-Origin" value="*" />
	    <header name="X-Robots-Tag" value="index, noarchive" />
	    <header name="foo" value="bar" status="200" />
	    <header name="Nelson" value="Ha-Ha!" status="404" />
	</http-headers>
        <on-connect>/home/icecast/bin/stream-start</on-connect>
        <on-disconnect>/home/icecast/bin/stream-stop</on-disconnect>
    </mount>

    <mount>
        <mount-name>/auth_example.ogg</mount-name>
        <authentication type="url">
            <option name="mount_add"       value="http://myauthserver.net/notify_mount.php"/>
            <option name="mount_remove"    value="http://myauthserver.net/notify_mount.php"/>
            <option name="listener_add"    value="http://myauthserver.net/notify_listener.php"/>
            <option name="listener_remove" value="http://myauthserver.net/notify_listener.php"/>
        </authentication>
    </mount>

    -->


    <!-- Настройки по умолчанию для всех монтирований, которые не имеют определенного <тип точки монтирования="обычный/нормальная" <mount type="normal">.
Монтирование типа «по умолчанию» может использоваться для указания общих значений для нескольких точек монтирования.
Обратите внимание, что точки монтирования по умолчанию не объединяются с другими блоками монтирования. 
Вы получаете эти значения только в том случае, если не type="normal"существует блока монтирования, соответствующего вашей точке монтирования.

    <mount-name>/example-complex.ogg</mount-name> Имя точки монтирования, для которой применяются эти настройки.
    НЕ ДОЛЖЕН использоваться в случае типа монтирования «по умолчанию».

     <username>othersource</username> Необязательное значение, которое задаст имя пользователя, 
    которое источник должен использовать для подключения с помощью этой точки монтирования.
    Не устанавливайте это значение, если вы не уверены, что исходные клиенты, подключающиеся к точке монтирования,
    можно настроить для отправки имени пользователя, отличного от source.
    Если это значение отсутствует, используется имя пользователя по умолчанию source.

    <password>hackmemore</password> Необязательное значение, которое задает пароль, который должен использовать источник для подключения
    с помощью этой точки монтирования. Существует также метод аутентификации на основе URL-адреса для источников, который можно использовать вместо этого.

    <max-listeners>1</max-listeners> Необязательное значение, которое задает максимальное количество слушателей, которые могут быть присоединены к этой точке монтирования.

    <max-listener-duration>3600</max-listener-duration> Необязательное значение, которое устанавливает продолжительность времени, 
    в течение которого слушатель будет оставаться подключенным к потоку. Компонент аутентификации может переопределить это.

    <dump-file>/tmp/dump-example1.ogg</dump-file> Необязательное значение, которое установит имя файла, которое будет дампом потока, проходящего через эту точку монтирования.
    Это имя файла обрабатывается с помощью strftime (3). Это позволяет использовать такие переменные, как %F.

    <intro>/example_intro.ogg</intro> Необязательное значение, указывающее файл, это содержимое будет отправлено новым слушателям при их подключении, но до отправки обычного потока.
    Убедитесь, что формат указанного файла соответствует формату потоковой передачи. Указанный файл добавляется в корневой каталог перед открытием.

    <fallback-mount>/example2.ogg</fallback-mount> запасной вариант Это необязательное значение указывает точку монтирования, в которую клиенты автоматически перемещаются,
    если источник выключается или не выполняет потоковую передачу во время подключения слушателя. Только одна может быть указана в каждом монтировании и 
    должна ссылаться на другую точку монтирования на том же сервере, который выполняет потоковую передачу в том же потоковом формате.
    Если клиенты не могут вернуться к другой точке монтирования из-за отсутствия резервного монтирования или указывает, что точка монтирования просто недоступна, 
    то эти клиенты будут отключены. Если клиенты возвращаются к точке монтирования, а резервное монтирование не осуществляет активную потоковую передачу,
    а само определяет резервное монтирование, то вместо этого эти клиенты могут быть перемещены туда.
    Этот многоуровневый откат позволяет клиентам каскадировать несколько точек монтирования.
    Резервное монтирование также может указывать на файл, расположенный в корневом веб-каталоге.
    Это полезно для воспроизведения предварительно записанного файла в случае прекращения потока. Он будет повторяться до тех пор, пока либо слушатель не отключится,
    либо поток не станет доступным и не вернет слушателей обратно. Как правило, формат файла должен соответствовать формату потока, в противном случае могут возникнуть проблемы
    с воспроизведением.
    Обратите внимание, что резервный файл не рассчитан по времени, поэтому будьте осторожны, если вы собираетесь передать это. Они хороши для подчиненных потоков, но не используют
    их в основных потоках, если вы это сделаете, тогда ретранслятор будет потреблять потоковые данные с большей скоростью, а слушатели на ретрансляторе в конечном итоге будут отключены.

    <fallback-override>1</fallback-override> резервное переопределение
    Когда этот параметр включен, это позволяет подключающемуся исходному клиенту или реле на этой точке монтирования переместить слушающих клиентов обратно из резервного монтирования.

    <fallback-when-full>1</fallback-when-full> резервный при заполнении
    Если установлено значение 1, это приведет к тому, что новые слушатели, когда будет достигнуто максимальное количество слушателей для точки монтирования,
    будут переходить к резервному монтированию, если оно указано.

    <charset>ISO8859-1</charset> Для потоков, отличных от Ogg, таких как MP3, метаданные, которые вставляются в поток, часто не имеют определенного набора символов. 
    Мы традиционно использовали UTF8, поскольку он позволяет использовать несколько языковых наборов на веб-страницах и в каталоге потоков, однако многие исходные клиенты для потоков
    типа MP3 использовали Latin1 (ISO 8859-1) или оставляли его для любого набора символов, который используется в источнике. клиентская система.
    Это несоответствие символов, как известно, вызывает проблему, поскольку движок статистики и серверы каталогов потоков хотят UTF8, поэтому теперь мы предполагаем Latin1 для потоков,
    отличных от Ogg (для обработки общего случая), но вы можете указать альтернативный набор символов с помощью этой опции.
    Исходные клиенты также могут указать charset=параметр для URL-адреса обновления метаданных, если они того пожелают.

    <public>1</public> Параметр по умолчанию для этого -1указывает, что именно исходный клиент или ретранслятор должен определять, следует ли объявлять эту точку монтирования. 
    Установка 0запретит любую рекламу, а установка 1заставит ее рекламировать. Если вы используете принудительную рекламу, вам может потребоваться установить другие параметры,
    перечисленные ниже, поскольку сервер YP может отказаться от рекламы, если предоставленной информации недостаточно.

    <stream-name>My audio stream</stream-name> Установка этого параметра добавит указанное имя в статистику (и, следовательно, YP) 
    для этой точки монтирования, даже если исходный клиент / реле предоставит ее.

    <stream-description>My audio description</stream-description> Установка этого параметра добавит указанное описание в статистику (и, следовательно, YP)
    для этой точки монтирования, даже если исходный клиент / реле предоставит ее.

    <stream-url>http://some.place.com</stream-url> Установка этого параметра добавит указанный URL в статистику (и, следовательно, YP) 
    для этой точки монтирования, даже если исходный клиент / реле предоставит ее. URL-адрес обычно предназначен для направления людей на веб-сайт.

    <genre>classical</genre> Установка этого параметра добавит указанный жанр в статистику (и, следовательно, YP) для этой точки монтирования, 
    даже если исходный клиент / реле предоставляет ее. Это может быть что угодно, использование определенных ключевых слов может помочь при поиске в каталогах YP.

    <bitrate>64</bitrate> Установка этого параметра добавит указанный битрейт в статистику (и, следовательно, YP) для этой точки монтирования, 
    даже если исходный клиент / реле предоставит ее. Это указано в кбит / с.

    <type>application/ogg</type> Установка этого параметра добавит указанный тип mime в статистику (и, следовательно, YP) для этой точки монтирования, 
    даже если исходный клиент / реле предоставляет ее. Маловероятно, что это понадобится.

    <subtype>vorbis</subtype> Установка этого параметра добавит указанный подтип в статистику (и, следовательно, YP) для этой точки монтирования.
    Подтип действительно помогает серверу YP идентифицировать компоненты типа. Пример настройки: vorbis / theora действительно указывают кодеки в потоке Ogg.

    <burst-size>65536</burst-size> Этот необязательный параметр позволяет указать размер пакета, который переопределяет размер пакета по умолчанию, определенный в пределах. Значение в байтах.

    <mp3-metadata-interval>4096</mp3-metadata-interval>  Этот необязательный параметр указывает, какой интервал в байтах существует между обновлениями метаданных в потоках, совместимых с shoutcast.
    Это применимо только к новым слушателям, подключающимся к этой точке монтирования, а не к существующим слушателям, возвращающимся к этой точке монтирования.
    По умолчанию используется либо жестко заданный сервер по умолчанию, либо значение, переданное от реле

    <hidden>1</hidden> Включите это, чтобы предотвратить отображение этого монтирования на страницах xsl. Это в основном для случаев, когда настроено локальное реле,
    и вы не хотите, чтобы источник локального реле отображался.

    <no-yp>1</no-yp>
    <authentication type="htpasswd">
    <option name="filename" value="myauth"/>
    <option name="allow_duplicate_users" value="0"/>

    </authentication> Это указывает на то, что для указанной точки монтирования потребуется аутентификация слушателя (или источника). 
    В настоящее время мы поддерживаем схему аутентификации на основе файлов ( type=htpasswd) и пересылку запросов аутентификации на основе URL.
    Точка монтирования, настроенная с помощью аутентификатора, будет отображать красный ключ рядом с именем точки монтирования на экранах администратора.
    Вы можете узнать больше об аутентификации слушателя и аутентификации источника на основе URL-адресов здесь .

    <http-headers> Этот элемент помещается в любом месте раздела монтирования конфигурации icecast.
    Он будет содержать <header>дочерние элементы, которые один за другим определяют фактические заголовки HTTP.

    header Этот тег определяет фактический заголовок, который будет отправлен HTTP-клиенту в ответ на каждый запрос для этой точки монтирования, 
    но в настоящее время только в том случае, если код состояния HTTP равен «200». Этот тег может содержать следующие атрибуты
    name является обязательным, и его значение определяет имя поля заголовка HTTP.
    value является обязательным, и его значение определяет значение поля заголовка HTTP.

	<header name="Access-Control-Allow-Origin" value="*" />
	<header name="X-Robots-Tag" value="index, noarchive" />
	<header name="foo" value="bar" status="200" />
	<header name="Nelson" value="Ha-Ha!" status="404" />
	</http-headers>

    <on-connect>/home/icecast/bin/stream-start</on-connect> Укажите программу, которая запускается при запуске исходного кода. Ему передается параметр, 
    который представляет собой имя запускаемой точки монтирования. Обработка потока не дожидается завершения скрипта.
    Следует проявлять осторожность, поскольку существует небольшая вероятность того, что дескрипторы потоковых файлов будут перепутаны с дескрипторами файлов сценариев,
    если номера FD превышают 1024. Этот вопрос будет рассмотрен в следующем выпуске Icecast. Эта опция недоступна в Win32.

    <on-disconnect>/home/icecast/bin/stream-stop</on-disconnect> Укажите программу, которая запускается при завершении исходного кода.
    Ему передается параметр, который является именем завершившейся точки монтирования. Обработка потока не дожидается завершения скрипта.
    Следует проявлять осторожность, поскольку существует небольшая вероятность того, что дескрипторы потоковых файлов будут перепутаны с дескрипторами файлов сценариев,
    если номера FD превышают 1024. Этот вопрос будет рассмотрен в следующем выпуске Icecast. Эта опция недоступна в Win32.
</mount>
-->

    <!-- 
    <mount type="default">
        <public>0</public>
        <intro>/server-wide-intro.ogg</intro>
        <max-listener-duration>3600</max-listener-duration>
        <authentication type="url">
                <option name="mount_add" value="http://auth.example.org/stream_start.php"/>
        </authentication>
        <http-headers>
                <header name="foo" value="bar" />
        </http-headers>
    </mount>
    -->

    <!-- Normal mounts -->
    <!--
    <mount type="normal">
        <mount-name>/example-complex.ogg</mount-name>

        <username>othersource</username>
        <password>hackmemore</password>

        <max-listeners>1</max-listeners>
        <dump-file>/tmp/dump-example1.ogg</dump-file>
        <burst-size>65536</burst-size>
        <fallback-mount>/example2.ogg</fallback-mount>
        <fallback-override>1</fallback-override>
        <fallback-when-full>1</fallback-when-full>
        <intro>/example_intro.ogg</intro>
        <hidden>1</hidden>
        <public>1</public>
        <authentication type="htpasswd">
                <option name="filename" value="myauth"/>
                <option name="allow_duplicate_users" value="0"/>
        </authentication>
        <http-headers>
                <header name="Access-Control-Allow-Origin" value="http://webplayer.example.org" />
                <header name="baz" value="quux" />
        </http-headers>
        <on-connect>/home/icecast/bin/stream-start</on-connect>
        <on-disconnect>/home/icecast/bin/stream-stop</on-disconnect>
    </mount>
    -->

    <!--
    <mount type="normal">
        <mount-name>/auth_example.ogg</mount-name>
		        <authentication type="command">
             <option name="listener_add" value="auth_verify"/>
        </authentication>
		или 
        для аутентификации url-адреса добавляемый url-адрес должен возвращать "icecast-auth-user:" http
        заголовок ответа для аутентификации пользователя. URL-адреса отправляются с параметрами по почте.
        обработчики - это количество параллельных запросов аутентификации для этого монтирования аутентификации.
        <authentication type="url">
		    <option name="username" value="admin"/>
            <option name="password" value="hackme"/>
            <option name="handlers"        value="3" />
            <option name="stream_auth"    value="http://myauthserver.com/scripts/auth_mount.php"/>
            <option name="mount_add"       value="http://myauthserver.net/notify_mount.php"/>
            <option name="mount_remove"    value="http://myauthserver.net/notify_mount.php"/>
            <option name="listener_add"    value="http://myauthserver.net/notify_listener.php"/>
            <option name="listener_remove" value="http://myauthserver.net/notify_listener.php"/>
            <option name="headers"         value="x-pragma,x-token"/>
            <option name="header_prefix"   value="ClientHeader."/>
        </authentication>
		для случая добавления прослушивателя вы возвращаете icecast 200 OK (в противном случае он рассматривает это как сбой.
		Другой заголовки ответов влияют на последующие действия.
        icecast-auth-user: 1 - просто пропустит слушателя,
        icecast-auth-user: with intro - просто пропустит слушателя, ожидает вводное содержимое в теле (и допустимый тип содержимого)
        Точка монтирования: /....  - отправляет слушателя на альтернативную точку монтирования на сервере, сохраняет соединение открытым

        если вы не отправляете заголовок icecast-auth-user, вы можете отправить
        Расположение: http://...   - возвращает прослушивателю ответ 302
        icecast-auth-message: .. - пользовательское сообщение для возврата прослушивателю, 403 в начале изменяет код ответа с 401
    </mount>
    -->

    <fileserve>1</fileserve>

    <!-- установите точку монтирования для источника shoutcast для использования, если нет, то по умолчанию
	указан параметр /stream, но вы можете изменить его здесь, Если есть альтернатива
	разыскивается или требуется продлени
    <shoutcast-mount>/live.nsv</shoutcast-mount>
    -->

    <paths>
        <!-- базовый каталог используется только в том случае, если включен chroot -->
        <!--<basedir>/usr/share/icecast2</basedir> -->
		<!--<basedir>/usr/local/share/icecast</basedir> -->
		<basedir>/usr/share/icecast</basedir>

        <!-- Обратите внимание, что если <chroot> включен ниже, то эти пути должны быть оба
	относитесь к новому root, а не к исходному корню root -->
       <!-- <logdir>/var/log/icecast2</logdir>
        <webroot>/usr/share/icecast2/web</webroot>
        <adminroot>/usr/share/icecast2/admin</adminroot>
        <pidfile>/usr/share/icecast2/icecast.pid</pidfile> -->
		
		<!--<logdir>/usr/local/var/log/icecast</logdir>
        <webroot>/usr/local/share/icecast/web</webroot>
        <adminroot>/usr/local/share/icecast/admin</adminroot>
		<pidfile>/usr/local/share/icecast/icecast.pid</pidfile> -->
		
	<!--<logdir>/var/log/icecast</logdir>
        <webroot>/usr/share/icecast/web</webroot>
        <adminroot>/usr/share/icecast/admin</adminroot>
	<pidfile>/usr/share/icecast/icecast.pid</pidfile>  -->

        <logdir>/var/lib/icecast/logs</logdir>
        <webroot>/var/lib/icecast/web</webroot>
        <adminroot>/var/lib/icecast/admin</adminroot>
        <pidfile>/var/lib/icecast/icecast.pid</pidfile>

    <!--<allow-ip>/path/to/ip_allowlist</allow-ip>
    <deny-ip>/path_to_ip_denylist</deny-ip>-->
	<!-- <deny-agents>/path/to/file-with-useragents</deny-agents> -->
    <!-- location of mime types files used for file serving -->
    <!-- <mime-types>/etc/mime.types</mime-types> -->
	<!--<ssl-certificate>/path/to/certificate.pem</ssl-certificate>
    <ssl-allowed-ciphers>ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS</ssl-allowed-ciphers> -->

        <!-- Aliases Псевдонимы: обрабатывайте запросы на путь "Источник source" как на путь "dest"
	    Может быть сделан специфичным для порта или связанного адреса с помощью "порта port"
	    и атрибуты "привязка-адрес bind-addres -->
        <!-- <alias source="/foo" destination="/bar"/> -->
        <!-- Псевдонимы: также могут быть использованы для простых перенаправлений, этот пример перенаправит все запросы на http://server:port/ на страница состояния -->
		<alias source="/" dest="/index.html"/>
        <!-- <alias source="/" destination="/status.xsl"/> -->
        <!-- Файл сертификата должен содержать как общедоступную, так и закрытую часть. Обе части должны быть закодированы в PEM.
        <ssl-certificate>/usr/share/icecast2/icecast.pem</ssl-certificate> -->
    </paths>

    <logging>
        <accesslog>access.log</accesslog>
        <errorlog>error.log</errorlog>
	<!-- <accesslog_ip>0<accesslog_ip> -->
        <playlistlog>playlist.log</playlistlog>
        <loglevel>1</loglevel> <!-- 4 Отладки, 3 Информации, 2 Предупреждения, 1 Ошибка -->
        <logsize>10000</logsize> <!-- Максимальный размер файла журнала -->
        <!-- Если logarchive включен (1), то при достижении logsize
	    файл журнала будет перемещен в [error|access|playlist].бревно.Метка даты,
	    в противном случае он будет перемещен в [error|access|playlist].бревно.старый.
	    По умолчанию используется неархивный режим (т. е. перезапись) -->
        <!-- <logarchive>1</logarchive> -->
    </logging>

    <security>
        <chroot>0</chroot>
        <changeowner>
	    <user>icecast</user>
           <!-- <user>icecast2</user>-->
            <group>icecast</group>
        </changeowner>
    </security>
</icecast>

icecast.xml.zip
icecast.xml.zip
(11.72 КБ) 30 скачиваний
Запускаем

Код: Выделить всё

icecast -b -c /etc/icecast.xml
Starting icecast2
Detaching from the console
Changed supplementary groups based on user: icecast.
Changed groupid to 439.
Changed userid to 466.

Проверяем
http://192.168.***.**:8000/
или
http://192.168.***.**:800/index.html
icecast-kh-icecast-2.4.0-kh20.zip
icecast-kh-icecast-2.4.0-kh20
(4.78 МБ) 29 скачиваний
количество слов: 3019
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 866
Стаж: 5 лет 9 месяцев
Откуда: Вологодская область
Поблагодарили: 41 раз
Контактная информация:

icecast

Сообщение Артём Мамзиков »

Установка из репозитория Debian GNU/Linux 12

Код: Выделить всё

apt-get install icecast2

Код: Выделить всё

icecast2 -v
Icecast 2.4.4

Файл конфигурации
icecast.zip
icecast.zip
(9.53 КБ) 31 скачивание
Русифицированный Веб-интерфейс
icecast2-rus.zip
icecast2-rus.zip
(28.17 КБ) 33 скачивания

Код: Выделить всё

<icecast>
    <!-- местоположение и администратор - это две произвольные строки, которые, например, видны
	на странице информации о сервере веб-интерфейса icecast
    (server_version.xsl). -->
    <location>Vol.Obl</location>
    <admin>AAMamzikov@localhost</admin>

    <!-- важный!
	Специально для неопытных пользователей:
	Начните с изменения всех паролей и перезапуска Icecast.
	Подробные инструкции по настройке приведены в документации.
	Она также доступна здесь: http://icecast.org/docs/
    -->

    <limits>
        <clients>800</clients>
        <sources>900</sources>
        <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-on-connect, но это позволяет быть более
	    конкретно о том, сколько лопнуть. Большинству людей это не понадобится
	    изменение по умолчанию 64К. Применяется для всех точек монтирования  -->
        <burst-size>65535</burst-size>
    </limits>

    <http-headers>
	<header name="Access-Control-Allow-Origin" value="*" />
	<header name="X-Robots-Tag" value="index, noarchive" />
	<header name="foo" value="bar" status="200" />
	<header name="Nelson" value="Ha-Ha!" status="404" />
    </http-headers>

    <authentication>
        <!-- Источники войдите в систему с именем пользователя 'source' -->
        <source-password></source-password>
        <!-- Реле войдите под именем пользователя'relay' -->
	<!--<relay-user>relay</relay-user>-->
        <relay-password></relay-password>

        <!-- Администратор входит в систему с именем пользователя, указанным ниже -->
        <admin-user>admin</admin-user>
        <admin-password>Пароль</admin-password>
    </authentication>

    <!-- установите точку монтирования для используемого источника shoutcast, если не указано значение по умолчанию
         указано значение /stream, но вы можете изменить его здесь, если требуется альтернатива
         или требуется расширение
    <shoutcast-mount>/live.nsv</shoutcast-mount>
    -->

    <!-- Раскомментируйте это, если вам нужны списки каталогов -->
    <!--
    <directory>
        <yp-url-timeout>15</yp-url-timeout>
        <yp-url>http://dir.xiph.org/cgi-bin/yp-cgi</yp-url>
    </directory>
    <directory>
        <yp-url-timeout>15</yp-url-timeout>
        <yp-url>http://www.oddsock.org/cgi-bin/yp-cgi</yp-url>
    </directory>
    -->

    <!-- Это имя хоста или IP-адрес, которое другие пользователи будут использовать для подключения к вашему серверу.
	Это влияет в основном на URL-адреса, сгенерированные Icecast для плейлистов и yp
	объявления. Вы должны правильно настроить его, чтобы списки YP работали!
    -->
    <hostname>192.168.175.1</hostname>

    <!-- Вы можете использовать эти два, если вам нужен только один слушатель -->
    <!--<port>8000</port> -->
    <!--<bind-address>127.0.0.1</bind-address>-->

    <!-- У вас может быть несколько элементов <listen-socket> -->
    <listen-socket>
        <port>8000</port>
        <!-- <bind-address>127.0.0.1</bind-address> -->
        <!-- <shoutcast-mount>/stream</shoutcast-mount> -->
        <bind-address>192.168.175.1</bind-address>
    </listen-socket>
    <!--
    <listen-socket>
        <port>8001</port>
    </listen-socket>
    -->
    <!--
    <listen-socket>
        <port>8443</port>
        <ssl>1</ssl>
    </listen-socket>
    -->


    <!-- Глобальные настройки заголовка.
         Заголовки, определенные здесь, будут возвращаться для каждого HTTP-запроса в Icecast.

         Заголовок ACAO делает Icecast общедоступным контентом/API по умолчанию
         Это упростит встраивание потоков (это необходимо для некоторых функций HTML5).
         Также это позволяет получить прямой доступ, например, к /status-json.xsl с других сайтов.
         Если вы этого не хотите, закомментируйте следующую строку или ознакомьтесь с CORS.
    -->
    <http-headers>
        <header name="Access-Control-Allow-Origin" value="*" />
    </http-headers>


    <!-- Ретрансляция
         Вам это не нужно, если у вас только один сервер.
         Пожалуйста, обратитесь к документации для получения подробного объяснения.
    -->
    <!--<master-server>127.0.0.1</master-server>-->
    <!--<master-server-port>8001</master-server-port>-->
    <!--<master-update-interval>120</master-update-interval>-->
    <!--<master-password>hackme</master-password>-->

    <!-- Попытка связи между серверами Icecast на Record -->
    <!-- <master-server>92.255.66.132</master-server> -->
    <!-- <master-server-port>8101</master-server-port> -->
    <!-- <master-update-interval>120</master-update-interval> -->
    <!-- <master-username>relay</master-username> -->
    <!-- <master-password></master-password> -->
    <!-- <relays-on-demand>1</relays-on-demand> -->
    
    <!--Ретранслятор главного сервера поддерживается только между серверами Icecast-->
    <!--<master-server>127.0.0.1</master-server>-->
    <!--<master-server-port>8001</master-server-port>-->
    <!--<master-update-interval>120</master-update-interval>-->
    <!--<master-username>relay</master-username>-->
    <!--<master-password>hackme</master-password>-->
    <!--<relays-on-demand>0</relays-on-demand>-->

    <!-- Установка этого параметра делает все реле relay доступными по требованию, если они не переопределены, это
	полезно для основных реле, у которых здесь нет определений <relay>.

	перенаправлений может быть несколько. В данном примере
	* server — имя сервера, с которого берется поток; port — сетевой порт, на котором удаленный сервер отдает поток;
	mount — точка мониторования на стороне удаленного сервера, с которого берем поток;
	local-mount — точка монтирования, которая будет использоваться нашим сервером для обращения к настраиваемому потоку;
	on-demand — если стоит 0, сервер всегда берет поток и проигрывает его, если 1 — только при наличие активных обращений.
	Значение по умолчанию равно 0 -->
    <!--<relays-on-demand>1</relays-on-demand>-->

<!--
<relay>
    <server>nashe1.hostingradio.ru</server>  Это IP-адрес DNS сервера, который содержит точку монтирования для ретрансляции.

    <port>8000</port>   Это TCP-порт для сервера, который содержит точку монтирования для ретрансляции

    <mount>/nashe-128.mp3</mount> Точка монтирования, расположенная на удаленном сервере. Если вы ретранслируете поток shoutcast, это должен быть /или /name.

    <local-mount>/Наше Радио</local-mount> Имя, используемое для локальной точки монтирования. Так будет называться монтировка на сервере ретрансляции.
    По умолчанию используется имя удаленной точки монтирования.

    <username>joe</username> Источник ретранслятора может потребовать аутентификации сам, если это так, укажите здесь имя пользователя.

    <password>soap</password>  Источник ретранслятора может потребовать аутентификации сам, если это необходимо, укажите здесь пароль.

    <relay-shoutcast-metadata>0</relay-shoutcast-metadata> Если вы ретранслируете поток Shoutcast, 
    вы можете указать этот индикатор, чтобы также ретранслировать метаданные (названия песен), которые являются частью потока данных Shoutcast.
    По умолчанию это включено, но удаленный сервер решает, будет ли он отправлять какие-либо. 1: включено 0,: отключено

        <on-demand>0</on-demand> Ретранслятор по запросу будет извлекать поток только в том случае, если есть слушатели, запрашивающие поток. 1: включено ,:0 выключенно
    (по умолчанию <relays-on-demand>). Это полезно в случаях, когда вы хотите ограничить расходы на полосу пропускания, когда никто не слушает.
</relay>
-->

    <!--
    <relay>
        <server>127.0.0.1</server>
        <port>8080</port>
        <mount>/example.ogg</mount>
        <local-mount>/different.ogg</local-mount>
        <on-demand>0</on-demand>

        <relay-shoutcast-metadata>0</relay-shoutcast-metadata>
    </relay>
    -->


	<relay>
<!--		<server>51.15.175.27</server>
		<port>80</port>
		<mount>/nashe-128.mp3</mount>-->
<!-- https://nashe1.hostingradio.ru/nashe-256 -->
		<server>5.101.51.181</server>
		<port>80</port>
		<mount>/nashe-256</mount>
		<local-mount>/nashe-radio</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
<!--		<server>95.216.21.120</server>
		<port>443</port>
		<mount>/radio_vanya-hi</mount>
		<server>stream03.pcradio.ru</server> -->
		<server>62.210.138.35</server>
                <port>443</port>
                <mount>/radio_vanya-hi</mount>
		<local-mount>/radiovanya-ivanovo</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
<!--		<server>23.105.253.228</server>
		<port>80</port>
		<mount>/dfm128.mp3</mount>-->
		<server>193.162.143.219</server>
		<port>8000</port>
		<mount>/dfm_vld_64.aac</mount>
		<local-mount>/dfm-radio</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
		<server>46.21.248.168</server>
		<port>8052</port>
		<mount>/europaplus256.mp3</mount>
		<local-mount>/europaplus-radio</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
		<server>23.111.104.132</server>
		<port>80</port>
		<mount>/rr_main96.aacp</mount>
		<local-mount>/radiorecordspb</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
<!--		<server>91.207.59.30</server>
		<port>80</port>
		<mount>/stream/air/aac/64/100</mount> -->
		<server>193.162.143.219</server>
		<port>8000</port>
		<mount>/avtoradio_vld_64.aac</mount>
		<local-mount>/autoradio</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
		<server>193.162.143.219</server>
		<port>8000</port>
		<mount>/dorozhnoe_nsb_64.aac</mount>
		<local-mount>/dorognoeradio</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
<!--		<server>23.105.253.212</server>
		<port>80</port>
		<mount>/rusradio128.mp3</mount>-->
		<server>193.162.143.219</server>
		<port>8000</port>
		<mount>/rusradio_vld_64.aac</mount>
		<local-mount>/rusradio</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
		<server>95.216.21.120</server>
		<port>443</port>
		<mount>/piterfm_1009-hi</mount>
		<local-mount>/piterfm</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

	<relay>
		<server>185.185.69.42</server>
		<port>9433</port>
		<mount>/marusya_default</mount>
		<local-mount>/marusya</local-mount>
		<on-demand>1</on-demand>
		<relay-shoutcast-metadata>1</relay-shoutcast-metadata>
	</relay>

    

    <!-- Точки монтирования
	Определяйте разделы <монтировать><mount> только в том случае, если вы хотите использовать расширенные параметры,
	такие как альтернативные имена пользователей или пароли
    <mount>
        <mount-name>/example-complex.ogg</mount-name>

        <username>othersource</username>
        <password>hackmemore</password>

        <max-listeners>1</max-listeners>
	<max-listener-duration>3600</max-listener-duration>
        <dump-file>/tmp/dump-example1.ogg</dump-file>
	<intro>/example_intro.ogg</intro>
        <fallback-mount>/example2.ogg</fallback-mount>
        <fallback-override>1</fallback-override>
        <fallback-when-full>1</fallback-when-full>
	<charset>ISO8859-1</charset>
	<public>1</public>
	<stream-name>My audio stream</stream-name>
	<stream-description>My audio description</stream-description>
	<stream-url>http://some.place.com</stream-url>
	<genre>classical</genre>
	<bitrate>64</bitrate>
	<type>application/ogg</type>
	<subtype>vorbis</subtype>
        <hidden>1</hidden>
	<burst-size>65536</burst-size>
	<mp3-metadata-interval>4096</mp3-metadata-interval>
        <no-yp>1</no-yp>
        <authentication type="htpasswd">
                <option name="filename" value="myauth"/>
                <option name="allow_duplicate_users" value="0"/>
        </authentication>
	<http-headers>
	    <header name="Access-Control-Allow-Origin" value="*" />
	    <header name="X-Robots-Tag" value="index, noarchive" />
	    <header name="foo" value="bar" status="200" />
	    <header name="Nelson" value="Ha-Ha!" status="404" />
	</http-headers>
        <on-connect>/home/icecast/bin/stream-start</on-connect>
        <on-disconnect>/home/icecast/bin/stream-stop</on-disconnect>
    </mount>

    <mount>
        <mount-name>/auth_example.ogg</mount-name>
        <authentication type="url">
            <option name="mount_add"       value="http://myauthserver.net/notify_mount.php"/>
            <option name="mount_remove"    value="http://myauthserver.net/notify_mount.php"/>
            <option name="listener_add"    value="http://myauthserver.net/notify_listener.php"/>
            <option name="listener_remove" value="http://myauthserver.net/notify_listener.php"/>
        </authentication>
    </mount>

    -->


    <!-- Настройки по умолчанию для всех монтирований, которые не имеют определенного <тип точки монтирования="обычный/нормальная" <mount type="normal">.
Монтирование типа «по умолчанию» может использоваться для указания общих значений для нескольких точек монтирования.
Обратите внимание, что точки монтирования по умолчанию не объединяются с другими блоками монтирования. 
Вы получаете эти значения только в том случае, если не type="normal"существует блока монтирования, соответствующего вашей точке монтирования.

    <mount-name>/example-complex.ogg</mount-name> Имя точки монтирования, для которой применяются эти настройки.
    НЕ ДОЛЖЕН использоваться в случае типа монтирования «по умолчанию».

     <username>othersource</username> Необязательное значение, которое задаст имя пользователя, 
    которое источник должен использовать для подключения с помощью этой точки монтирования.
    Не устанавливайте это значение, если вы не уверены, что исходные клиенты, подключающиеся к точке монтирования,
    можно настроить для отправки имени пользователя, отличного от source.
    Если это значение отсутствует, используется имя пользователя по умолчанию source.

    <password>hackmemore</password> Необязательное значение, которое задает пароль, который должен использовать источник для подключения
    с помощью этой точки монтирования. Существует также метод аутентификации на основе URL-адреса для источников, который можно использовать вместо этого.

    <max-listeners>1</max-listeners> Необязательное значение, которое задает максимальное количество слушателей, которые могут быть присоединены к этой точке монтирования.

    <max-listener-duration>3600</max-listener-duration> Необязательное значение, которое устанавливает продолжительность времени, 
    в течение которого слушатель будет оставаться подключенным к потоку. Компонент аутентификации может переопределить это.

    <dump-file>/tmp/dump-example1.ogg</dump-file> Необязательное значение, которое установит имя файла, которое будет дампом потока, проходящего через эту точку монтирования.
    Это имя файла обрабатывается с помощью strftime (3). Это позволяет использовать такие переменные, как %F.

    <intro>/example_intro.ogg</intro> Необязательное значение, указывающее файл, это содержимое будет отправлено новым слушателям при их подключении, но до отправки обычного потока.
    Убедитесь, что формат указанного файла соответствует формату потоковой передачи. Указанный файл добавляется в корневой каталог перед открытием.

    <fallback-mount>/example2.ogg</fallback-mount> запасной вариант Это необязательное значение указывает точку монтирования, в которую клиенты автоматически перемещаются,
    если источник выключается или не выполняет потоковую передачу во время подключения слушателя. Только одна может быть указана в каждом монтировании и 
    должна ссылаться на другую точку монтирования на том же сервере, который выполняет потоковую передачу в том же потоковом формате.
    Если клиенты не могут вернуться к другой точке монтирования из-за отсутствия резервного монтирования или указывает, что точка монтирования просто недоступна, 
    то эти клиенты будут отключены. Если клиенты возвращаются к точке монтирования, а резервное монтирование не осуществляет активную потоковую передачу,
    а само определяет резервное монтирование, то вместо этого эти клиенты могут быть перемещены туда.
    Этот многоуровневый откат позволяет клиентам каскадировать несколько точек монтирования.
    Резервное монтирование также может указывать на файл, расположенный в корневом веб-каталоге.
    Это полезно для воспроизведения предварительно записанного файла в случае прекращения потока. Он будет повторяться до тех пор, пока либо слушатель не отключится,
    либо поток не станет доступным и не вернет слушателей обратно. Как правило, формат файла должен соответствовать формату потока, в противном случае могут возникнуть проблемы
    с воспроизведением.
    Обратите внимание, что резервный файл не рассчитан по времени, поэтому будьте осторожны, если вы собираетесь передать это. Они хороши для подчиненных потоков, но не используют
    их в основных потоках, если вы это сделаете, тогда ретранслятор будет потреблять потоковые данные с большей скоростью, а слушатели на ретрансляторе в конечном итоге будут отключены.

    <fallback-override>1</fallback-override> резервное переопределение
    Когда этот параметр включен, это позволяет подключающемуся исходному клиенту или реле на этой точке монтирования переместить слушающих клиентов обратно из резервного монтирования.

    <fallback-when-full>1</fallback-when-full> резервный при заполнении
    Если установлено значение 1, это приведет к тому, что новые слушатели, когда будет достигнуто максимальное количество слушателей для точки монтирования,
    будут переходить к резервному монтированию, если оно указано.

    <charset>ISO8859-1</charset> Для потоков, отличных от Ogg, таких как MP3, метаданные, которые вставляются в поток, часто не имеют определенного набора символов. 
    Мы традиционно использовали UTF8, поскольку он позволяет использовать несколько языковых наборов на веб-страницах и в каталоге потоков, однако многие исходные клиенты для потоков
    типа MP3 использовали Latin1 (ISO 8859-1) или оставляли его для любого набора символов, который используется в источнике. клиентская система.
    Это несоответствие символов, как известно, вызывает проблему, поскольку движок статистики и серверы каталогов потоков хотят UTF8, поэтому теперь мы предполагаем Latin1 для потоков,
    отличных от Ogg (для обработки общего случая), но вы можете указать альтернативный набор символов с помощью этой опции.
    Исходные клиенты также могут указать charset=параметр для URL-адреса обновления метаданных, если они того пожелают.

    <public>1</public> Параметр по умолчанию для этого -1указывает, что именно исходный клиент или ретранслятор должен определять, следует ли объявлять эту точку монтирования. 
    Установка 0запретит любую рекламу, а установка 1заставит ее рекламировать. Если вы используете принудительную рекламу, вам может потребоваться установить другие параметры,
    перечисленные ниже, поскольку сервер YP может отказаться от рекламы, если предоставленной информации недостаточно.

    <stream-name>My audio stream</stream-name> Установка этого параметра добавит указанное имя в статистику (и, следовательно, YP) 
    для этой точки монтирования, даже если исходный клиент / реле предоставит ее.

    <stream-description>My audio description</stream-description> Установка этого параметра добавит указанное описание в статистику (и, следовательно, YP)
    для этой точки монтирования, даже если исходный клиент / реле предоставит ее.

    <stream-url>http://some.place.com</stream-url> Установка этого параметра добавит указанный URL в статистику (и, следовательно, YP) 
    для этой точки монтирования, даже если исходный клиент / реле предоставит ее. URL-адрес обычно предназначен для направления людей на веб-сайт.

    <genre>classical</genre> Установка этого параметра добавит указанный жанр в статистику (и, следовательно, YP) для этой точки монтирования, 
    даже если исходный клиент / реле предоставляет ее. Это может быть что угодно, использование определенных ключевых слов может помочь при поиске в каталогах YP.

    <bitrate>64</bitrate> Установка этого параметра добавит указанный битрейт в статистику (и, следовательно, YP) для этой точки монтирования, 
    даже если исходный клиент / реле предоставит ее. Это указано в кбит / с.

    <type>application/ogg</type> Установка этого параметра добавит указанный тип mime в статистику (и, следовательно, YP) для этой точки монтирования, 
    даже если исходный клиент / реле предоставляет ее. Маловероятно, что это понадобится.

    <subtype>vorbis</subtype> Установка этого параметра добавит указанный подтип в статистику (и, следовательно, YP) для этой точки монтирования.
    Подтип действительно помогает серверу YP идентифицировать компоненты типа. Пример настройки: vorbis / theora действительно указывают кодеки в потоке Ogg.

    <burst-size>65536</burst-size> Этот необязательный параметр позволяет указать размер пакета, который переопределяет размер пакета по умолчанию, определенный в пределах. Значение в байтах.

    <mp3-metadata-interval>4096</mp3-metadata-interval>  Этот необязательный параметр указывает, какой интервал в байтах существует между обновлениями метаданных в потоках, совместимых с shoutcast.
    Это применимо только к новым слушателям, подключающимся к этой точке монтирования, а не к существующим слушателям, возвращающимся к этой точке монтирования.
    По умолчанию используется либо жестко заданный сервер по умолчанию, либо значение, переданное от реле

    <hidden>1</hidden> Включите это, чтобы предотвратить отображение этого монтирования на страницах xsl. Это в основном для случаев, когда настроено локальное реле,
    и вы не хотите, чтобы источник локального реле отображался.

    <no-yp>1</no-yp>
    <authentication type="htpasswd">
    <option name="filename" value="myauth"/>
    <option name="allow_duplicate_users" value="0"/>

    </authentication> Это указывает на то, что для указанной точки монтирования потребуется аутентификация слушателя (или источника). 
    В настоящее время мы поддерживаем схему аутентификации на основе файлов ( type=htpasswd) и пересылку запросов аутентификации на основе URL.
    Точка монтирования, настроенная с помощью аутентификатора, будет отображать красный ключ рядом с именем точки монтирования на экранах администратора.
    Вы можете узнать больше об аутентификации слушателя и аутентификации источника на основе URL-адресов здесь .

    <http-headers> Этот элемент помещается в любом месте раздела монтирования конфигурации icecast.
    Он будет содержать <header>дочерние элементы, которые один за другим определяют фактические заголовки HTTP.

    header Этот тег определяет фактический заголовок, который будет отправлен HTTP-клиенту в ответ на каждый запрос для этой точки монтирования, 
    но в настоящее время только в том случае, если код состояния HTTP равен «200». Этот тег может содержать следующие атрибуты
    name является обязательным, и его значение определяет имя поля заголовка HTTP.
    value является обязательным, и его значение определяет значение поля заголовка HTTP.

	<header name="Access-Control-Allow-Origin" value="*" />
	<header name="X-Robots-Tag" value="index, noarchive" />
	<header name="foo" value="bar" status="200" />
	<header name="Nelson" value="Ha-Ha!" status="404" />
	</http-headers>

    <on-connect>/home/icecast/bin/stream-start</on-connect> Укажите программу, которая запускается при запуске исходного кода. Ему передается параметр, 
    который представляет собой имя запускаемой точки монтирования. Обработка потока не дожидается завершения скрипта.
    Следует проявлять осторожность, поскольку существует небольшая вероятность того, что дескрипторы потоковых файлов будут перепутаны с дескрипторами файлов сценариев,
    если номера FD превышают 1024. Этот вопрос будет рассмотрен в следующем выпуске Icecast. Эта опция недоступна в Win32.

    <on-disconnect>/home/icecast/bin/stream-stop</on-disconnect> Укажите программу, которая запускается при завершении исходного кода.
    Ему передается параметр, который является именем завершившейся точки монтирования. Обработка потока не дожидается завершения скрипта.
    Следует проявлять осторожность, поскольку существует небольшая вероятность того, что дескрипторы потоковых файлов будут перепутаны с дескрипторами файлов сценариев,
    если номера FD превышают 1024. Этот вопрос будет рассмотрен в следующем выпуске Icecast. Эта опция недоступна в Win32.
</mount>
-->

    <!-- 
    <mount type="default">
        <public>0</public>
        <intro>/server-wide-intro.ogg</intro>
        <max-listener-duration>3600</max-listener-duration>
        <authentication type="url">
                <option name="mount_add" value="http://auth.example.org/stream_start.php"/>
        </authentication>
        <http-headers>
                <header name="foo" value="bar" />
        </http-headers>
    </mount>
    -->

    <!-- Normal mounts -->
    <!--
    <mount type="normal">
        <mount-name>/example-complex.ogg</mount-name>

        <username>othersource</username>
        <password>hackmemore</password>

        <max-listeners>1</max-listeners>
        <dump-file>/tmp/dump-example1.ogg</dump-file>
        <burst-size>65536</burst-size>
        <fallback-mount>/example2.ogg</fallback-mount>
        <fallback-override>1</fallback-override>
        <fallback-when-full>1</fallback-when-full>
        <intro>/example_intro.ogg</intro>
        <hidden>1</hidden>
        <public>1</public>
        <authentication type="htpasswd">
                <option name="filename" value="myauth"/>
                <option name="allow_duplicate_users" value="0"/>
        </authentication>
        <http-headers>
                <header name="Access-Control-Allow-Origin" value="http://webplayer.example.org" />
                <header name="baz" value="quux" />
        </http-headers>
        <on-connect>/home/icecast/bin/stream-start</on-connect>
        <on-disconnect>/home/icecast/bin/stream-stop</on-disconnect>
    </mount>
    -->

    <!--
    <mount type="normal">
        <mount-name>/auth_example.ogg</mount-name>
        <authentication type="url">
            <option name="mount_add"       value="http://myauthserver.net/notify_mount.php"/>
            <option name="mount_remove"    value="http://myauthserver.net/notify_mount.php"/>
            <option name="listener_add"    value="http://myauthserver.net/notify_listener.php"/>
            <option name="listener_remove" value="http://myauthserver.net/notify_listener.php"/>
            <option name="headers"         value="x-pragma,x-token"/>
            <option name="header_prefix"   value="ClientHeader."/>
        </authentication>
    </mount>
    -->

    <fileserve>1</fileserve>

    <!-- установите точку монтирования для источника shoutcast для использования, если нет, то по умолчанию
	указан параметр /stream, но вы можете изменить его здесь, Если есть альтернатива
	разыскивается или требуется продлени
    <shoutcast-mount>/live.nsv</shoutcast-mount>
    -->

    <paths>
        <!-- базовый каталог используется только в том случае, если включен chroot -->
        <basedir>/usr/share/icecast2</basedir>

        <!-- Обратите внимание, что если <chroot> включен ниже, то эти пути должны быть оба
	относитесь к новому root, а не к исходному корню root -->
        <logdir>/var/log/icecast2</logdir>
        <webroot>/usr/share/icecast2/web</webroot>
        <adminroot>/usr/share/icecast2/admin</adminroot>
        <pidfile>/usr/share/icecast2/icecast.pid</pidfile>
    <!--
    <allow-ip>/path/to/ip_allowlist</allow-ip>
    <deny-ip>/path_to_ip_denylist</deny-ip>
    <ssl-certificate>/path/to/certificate.pem</ssl-certificate>
    <ssl-allowed-ciphers>ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS</ssl-allowed-ciphers>
    -->

        <!-- Aliases Псевдонимы: обрабатывайте запросы на путь "Источник source" как на путь "dest"
	    Может быть сделан специфичным для порта или связанного адреса с помощью "порта port"
	    и атрибуты "привязка-адрес bind-addres
          -->
        <!--
        <alias source="/foo" destination="/bar"/>
        -->
        <!-- Псевдонимы: также могут быть использованы для простых перенаправлений,
	    этот пример перенаправит все запросы на http://server:port/ to
	    страница состояния
        -->
        <alias source="/" destination="/status.xsl"/>
        <!-- The certificate file needs to contain both public and private part.
             Both should be PEM encoded.
        <ssl-certificate>/usr/share/icecast2/icecast.pem</ssl-certificate>
        -->
    </paths>

    <logging>
        <accesslog>access.log</accesslog>
        <errorlog>error.log</errorlog>
        <playlistlog>playlist.log</playlistlog>
        <loglevel>1</loglevel> !-- 4 Отладки, 3 Информации, 2 Предупреждения, 1 Ошибка -->
        <logsize>10000</logsize> <!-- Max size of a logfile -->
        <!--  Максимальный размер файла журнала -->
        <!-- Если logarchive включен (1), то при достижении logsize
	    файл журнала будет перемещен в [error|access|playlist].бревно.Метка даты,
	    в противном случае он будет перемещен в [error|access|playlist].бревно.старый.
	    По умолчанию используется неархивный режим (т. е. перезапись)
        -->
        <!-- <logarchive>1</logarchive> -->
    </logging>

    <security>
        <chroot>0</chroot>
        <changeowner>
            <user>icecast2</user>
            <group>icecast</group>
        </changeowner>
    </security>
</icecast>
Версия 2.4.4

Старт

Код: Выделить всё

icecast -b -c /etc/icecast2/icecast.xml
Starting icecast2
Detaching from the console
Changed supplementary groups based on user: icecast2.
Changed groupid to 106.
Changed userid to 104.
Или
service icecast2 start
service icecast2 status

http://192.168.175.1:8000/status.xsl
http://192.168.175.1:8000/admin/stats.xsl
service icecast2 stop
пути icecast2_2.4.4-4+b1_mipsel
Показать
\var\log\icecast2\
\usr\share\man\man1\
\usr\share\lintian\overrides\
\usr\share\icecast2\web\
\usr\share\icecast2\admin\
\usr\share\doc-base\
\usr\share\doc\icecast2\
\usr\share\doc\icecast2\img\
\usr\share\doc\icecast2\assets\img\
\usr\share\doc\icecast2\assets\font\
\usr\share\doc\icecast2\assets\css\
\usr\bin\
\etc\logrotate.d\
\etc\init.d\
\etc\icecast2\
\etc\icecast2\web\
\etc\icecast2\admin\
\etc\default\
Так как не принимается поток https
удаляем apt-get remove icecast2 либо можно оставить из исходного когда будет просто icecast без 2 если настроить разные порты можно запустить одновременно


Установка из исходного кода на Debian GNU/Linux 12 (bookworm)
Linux Keenetic-7717 4.9-ndm-5 #0 SMP Mon Nov 13 15:40:55 2023 mips GNU/Linux

Код: Выделить всё

apt-get install libogg-dev libvorbis-dev libxslt1-dev libxslt-dev libxml2-dev libcurl4-openssl-dev libtheora-dev libspeex-dev libssl-dev pkg-config po-debconf autoconf-archive openssl build-essential
Создать группу пользователей icecast
Создать пользователя icecast2
icecast-kh-icecast-2.4.0-kh22.zip
icecast-kh-icecast-2.4.0-kh22.zip
(5.27 МБ) 29 скачиваний
icecast-kh-icecast-2.4.0-kh22 > install-dop - тут лежат службы для запуска и автозапуска.
icecast-kh-rus.zip
icecast-kh-rus.zip
(489.53 КБ) 29 скачиваний

Код: Выделить всё

make clean
icecast-kh-icecast-2.4.0-kh22#./configure --prefix=/usr --bindir=/usr/bin --localstatedir=/var/lib/icecast2 --sysconfdir=/etc/icecast2 --mandir=/usr/share/man/man1 --docdir=/usr/share/doc/icecast2

Секрет здесь: —with-openssl
./configure --with-curl-config=/usr/bin/curl-config --with-openssl && make -j8 && make install
позже потребуются обе строки:
<ssl-private-key>privkey.pem</ssl-private-key>
<ssl_certificate>fullchain.pem</ssl_certificate>
прослушивающих сокетов в kh поддерживают как SSL, так и не-SSL, поэтому вам не нужен тег ssl, тег tls не используется в дереве kh, но tls обрабатывается автоматически.

или по умолчанию
icecast-kh-icecast-2.4.0-kh22#

Код: Выделить всё

./configure
Вывод успешного выполнения ./configure
Показать
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a race-free mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking whether make supports nested variables... (cached) yes
checking build system type... mipsel-unknown-linux-gnu
checking host system type... mipsel-unknown-linux-gnu
checking how to print strings... printf
checking whether make supports the include directive... yes (GNU style)
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether the compiler supports GNU C... yes
checking whether gcc accepts -g... yes
checking for gcc option to enable C11 features... none needed
checking whether gcc understands -c and -o together... yes
checking dependency style of gcc... gcc3
checking for a sed that does not truncate output... /usr/bin/sed
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for fgrep... /usr/bin/grep -F
checking for ld used by gcc... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B
checking the name lister (/usr/bin/nm -B) interface... BSD nm
checking whether ln -s works... yes
checking the maximum length of command line arguments... 1572864
checking how to convert mipsel-unknown-linux-gnu file names to mipsel-unknown-linux-gnu format... func_convert_file_noop
checking how to convert mipsel-unknown-linux-gnu file names to toolchain format... func_convert_file_noop
checking for /usr/bin/ld option to reload object files... -r
checking for file... file
checking for objdump... objdump
checking how to recognize dependent libraries... pass_all
checking for dlltool... no
checking how to associate runtime and link libraries... printf %s\n
checking for ar... ar
checking for archiver @FILE support... @
checking for strip... strip
checking for ranlib... ranlib
checking command to parse /usr/bin/nm -B output from gcc object... ok
checking for sysroot... no
checking for a working dd... /usr/bin/dd
checking how to truncate binary pipes... /usr/bin/dd bs=4096 count=1
checking for mt... no
checking if : is a manifest tool... no
checking for stdio.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for strings.h... yes
checking for sys/stat.h... yes
checking for sys/types.h... yes
checking for unistd.h... yes
checking for sys/time.h... yes
checking for dlfcn.h... yes
checking for objdir... .libs
checking if gcc supports -fno-rtti -fno-exceptions... no
checking for gcc option to produce PIC... -fPIC -DPIC
checking if gcc PIC flag -fPIC -DPIC works... yes
checking if gcc static flag -static works... yes
checking if gcc supports -c -o file.o... yes
checking if gcc supports -c -o file.o... (cached) yes
checking whether the gcc linker (/usr/bin/ld) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... yes
checking for g++... g++
checking whether the compiler supports GNU C++... yes
checking whether g++ accepts -g... yes
checking for g++ option to enable C++11 features... none needed
checking dependency style of g++... gcc3
checking how to run the C++ preprocessor... g++ -E
checking for ld used by g++... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking whether the g++ linker (/usr/bin/ld) supports shared libraries... yes
checking for g++ option to produce PIC... -fPIC -DPIC
checking if g++ PIC flag -fPIC -DPIC works... yes
checking if g++ static flag -static works... yes
checking if g++ supports -c -o file.o... yes
checking if g++ supports -c -o file.o... (cached) yes
checking whether the g++ linker (/usr/bin/ld) supports shared libraries... yes
checking dynamic linker characteristics... (cached) GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking for gcc... (cached) gcc
checking whether the compiler supports GNU C... (cached) yes
checking whether gcc accepts -g... (cached) yes
checking for gcc option to enable C11 features... (cached) none needed
checking whether gcc understands -c and -o together... (cached) yes
checking dependency style of gcc... (cached) gcc3
checking for special C compiler options needed for large files... no
checking for _FILE_OFFSET_BITS value needed for large files... 64
checking for fcntl.h... yes
checking for fnmatch.h... yes
checking for sys/timeb.h... yes
checking for sys/wait.h... yes
checking for alloca.h... yes
checking for malloc.h... yes
checking for glob.h... yes
checking for winsock2.h... no
checking for windows.h... no
checking for stdbool.h... yes
checking for signal.h... yes
checking for pwd.h... yes
checking for __func__... yes
checking for off_t... yes
checking for struct timespec... yes
checking for localtime_r... yes
checking for gmtime_r... yes
checking for FindFirstFile... no
checking for memmem... yes
checking for sigaction... yes
checking for fseeko... yes
checking for fnmatch... yes
checking for chroot... yes
checking for fork... yes
checking for poll... yes
checking for atoll... yes
checking for strtoll... yes
checking for strsep... yes
checking for strcasecmp... yes
checking for strncasecmp... yes
checking for getrlimit... yes
checking for gettimeofday... yes
checking for ftime... yes
checking for fsync... yes
checking for glob... yes
checking for pread... yes
checking for pipe2... yes
checking for setresuid... yes
checking for setresgid... yes
checking for struct signalfd_siginfo... yes
checking for uint32_t... yes
checking for SOCKET*... no
checking for library containing nanosleep... none required
checking for library containing clock_gettime... none required
checking for sys/socket.h... yes
checking for socklen_t... yes
checking for va_copy... va_copy
checking for sys/select.h... yes
checking for sys/uio.h... yes
checking for netinet/in.h... yes
checking for netinet/tcp.h... yes
checking for arpa/inet.h... yes
checking for netdb.h... yes
checking for winsock2.h inclusion... no
checking for library containing sethostent... none required
checking for library containing getnameinfo... none required
checking for endhostent... yes
checking for getaddrinfo... yes
checking for inet_aton... yes
checking for writev... yes
checking for struct sockaddr_storage.ss_family... yes
checking for inet_pton... yes
checking for xslt-config... /usr/bin/xslt-config
checking for xsltSaveResultToString... yes
checking for libogg... ok
checking for libvorbis... ok
checking for libtheora... ok
checking for libspeex... ok
checking for kate_decode_init in -lkate... no
checking for the pthreads library -lpthreads... no
checking whether pthreads work without any flags... yes
checking for joinable pthread attribute... PTHREAD_CREATE_JOINABLE
checking if more special flags are required for pthreads... no
checking for pthread_spin_lock... yes
checking for gcc options needed to detect all undeclared functions... none needed
checking for curl-config... /usr/bin/curl-config
checking for curl/curl.h... yes
checking for libcurl... yes
checking whether CURLOPT_NOSIGNAL is declared... yes
checking for curl_global_init... yes
checking for pkg-config... /usr/bin/pkg-config
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating conf/Makefile
config.status: creating src/Makefile
config.status: creating src/avl/Makefile
config.status: creating src/httpp/Makefile
config.status: creating src/thread/Makefile
config.status: creating src/log/Makefile
config.status: creating src/net/Makefile
config.status: creating src/timing/Makefile
config.status: creating doc/Makefile
config.status: creating web/Makefile
config.status: creating web/images/Makefile
config.status: creating admin/Makefile
config.status: creating windows/Makefile
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing libtool commands
/icecast-kh-icecast-2.4.0-kh22#
вывод команды make успешного выполнения
Показать
/icecast-kh-icecast-2.4.0-kh22# make
GIT_VERSION=20240317154134
make all-recursive
make[1]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22»
Making all in conf
make[2]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/conf»
make[2]: Цель «all» не требует выполнения команд.
make[2]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/conf»
Making all in doc
make[2]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/doc»
make[2]: Цель «all» не требует выполнения команд.
make[2]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/doc»
Making all in web
make[2]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/web»
Making all in images
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/web/images»
make[3]: Цель «all» не требует выполнения команд.
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/web/images»
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/web»
make[3]: Цель «all-am» не требует выполнения команд.
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/web»
make[2]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/web»
Making all in admin
make[2]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/admin»
make[2]: Цель «all» не требует выполнения команд.
make[2]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/admin»
Making all in src
make[2]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src»
Making all in avl
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/avl»
CC libiceavl_la-avl.lo
CCLD libiceavl.la
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/avl»
Making all in thread
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/thread»
CC libicethread_la-thread.lo
CCLD libicethread.la
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/thread»
Making all in httpp
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/httpp»
CC libicehttpp_la-httpp.lo
CCLD libicehttpp.la
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/httpp»
Making all in net
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/net»
CC libicenet_la-sock.lo
CC libicenet_la-resolver.lo
CCLD libicenet.la
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/net»
Making all in log
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/log»
CC log.lo
CCLD libicelog.la
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/log»
Making all in timing
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/timing»
CC libicetiming_la-timing.lo
CCLD libicetiming.la
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/timing»
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src»
CC cfgfile.o
CC main.o
CC logging.o
CC sighandler.o
CC connection.o
CC global.o
CC util.o
CC slave.o
CC source.o
CC stats.o
CC refbuf.o
CC client.o
CC params.o
CC xslt.o
CC fserve.o
CC event.o
CC admin.o
CC md5.o
CC format.o
CC format_ogg.o
CC format_mp3.o
CC format_midi.o
CC format_flac.o
CC format_ebml.o
CC format_opus.o
CC auth.o
CC auth_htpasswd.o
CC auth_url.o
CC format_kate.o
CC format_skeleton.o
CC mpeg.o
CC flv.o
CC yp.o
CC format_vorbis.o
CC format_speex.o
CC format_theora.o
CC auth_cmd.o
CCLD icecast
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src»
make[2]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src»
make[2]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22»
make[2]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22»
make[1]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22»

/icecast-kh-icecast-2.4.0-kh22#

Код: Выделить всё

make install
Успешная установка вывод
Показать
GIT_VERSION=20240317155051
make install-recursive
make[1]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22»
Making install in conf
make[2]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/conf»
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/conf»
make[3]: Цель «install-exec-am» не требует выполнения команд.
/usr/bin/mkdir -p '/usr/share/icecast/doc'
/usr/bin/install -c -m 644 icecast.xml.dist icecast_minimal.xml.dist icecast_shoutcast_compat.xml.dist '/usr/share/icecast/doc'
make install-data-hook
make[4]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/conf»
/bin/bash /root/icecast-kh-icecast-2.4.0-kh22/build-aux/install-sh -d /etc/icecast2
test -f /etc/icecast2/icecast.xml || \
/usr/bin/install -c -m 644 icecast.xml.dist /etc/icecast2/icecast.xml
make[4]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/conf»
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/conf»
make[2]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/conf»
Making install in doc
make[2]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/doc»
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/doc»
make[3]: Цель «install-exec-am» не требует выполнения команд.
/usr/bin/mkdir -p '/usr/share/doc/icecast'
/usr/bin/install -c -m 644 index.html icecast2_admin.html icecast2_basicsetup.html icecast2_config_file.html icecast2_faq.html icecast2_glossary.html icecast2_introduction.html icecast2_relay.html icecast2_stats.html icecast2_win32.html icecast2_yp.html icecast2_listenerauth.html '/usr/share/doc/icecast'
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/doc»
make[2]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/doc»
Making install in web
make[2]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/web»
Making install in images
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/web/images»
make[4]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/web/images»
make[4]: Цель «install-exec-am» не требует выполнения команд.
/usr/bin/mkdir -p '/usr/share/icecast/web/images'
/usr/bin/install -c -m 644 icecast.png key.png tunein.png '/usr/share/icecast/web/images'
make[4]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/web/images»
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/web/images»
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/web»
make[4]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/web»
make[4]: Цель «install-exec-am» не требует выполнения команд.
/usr/bin/mkdir -p '/usr/share/icecast/web'
/usr/bin/install -c -m 644 status.xsl status2.xsl style.css auth.xsl server_version.xsl 7.xsl adminbar.html statusbar.html admin.html index.html favicon.ico '/usr/share/icecast/web'
make[4]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/web»
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/web»
make[2]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/web»
Making install in admin
make[2]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/admin»
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/admin»
make[3]: Цель «install-exec-am» не требует выполнения команд.
/usr/bin/mkdir -p '/usr/share/icecast/admin'
/usr/bin/install -c -m 644 listclients.xsl listmounts.xsl moveclients.xsl response.xsl logs.xsl showlog.xsl xspf.xsl viewxml.xsl stats.xsl manageauth.xsl updatemetadata.xsl managerelays.xsl '/usr/share/icecast/admin'
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/admin»
make[2]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/admin»
Making install in src
make[2]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src»
Making install in avl
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/avl»
make[4]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/avl»
make[4]: Цель «install-exec-am» не требует выполнения команд.
make[4]: Цель «install-data-am» не требует выполнения команд.
make[4]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/avl»
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/avl»
Making install in thread
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/thread»
make[4]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/thread»
make[4]: Цель «install-exec-am» не требует выполнения команд.
make[4]: Цель «install-data-am» не требует выполнения команд.
make[4]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/thread»
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/thread»
Making install in httpp
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/httpp»
make[4]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/httpp»
make[4]: Цель «install-exec-am» не требует выполнения команд.
make[4]: Цель «install-data-am» не требует выполнения команд.
make[4]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/httpp»
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/httpp»
Making install in net
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/net»
make[4]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/net»
make[4]: Цель «install-exec-am» не требует выполнения команд.
make[4]: Цель «install-data-am» не требует выполнения команд.
make[4]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/net»
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/net»
Making install in log
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/log»
make[4]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/log»
make[4]: Цель «install-exec-am» не требует выполнения команд.
make[4]: Цель «install-data-am» не требует выполнения команд.
make[4]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/log»
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/log»
Making install in timing
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/timing»
make[4]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src/timing»
make[4]: Цель «install-exec-am» не требует выполнения команд.
make[4]: Цель «install-data-am» не требует выполнения команд.
make[4]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/timing»
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src/timing»
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src»
CC cfgfile.o
CC main.o
CC stats.o
CCLD icecast
make[4]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22/src»
/usr/bin/mkdir -p '/usr/bin'
/bin/bash ../libtool --mode=install /usr/bin/install -c icecast '/usr/bin'
libtool: install: /usr/bin/install -c icecast /usr/bin/icecast
make[4]: Цель «install-data-am» не требует выполнения команд.
make[4]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src»
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src»
make[2]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22/src»
make[2]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22»
make[3]: вход в каталог «/root/icecast-kh-icecast-2.4.0-kh22»
make[3]: Цель «install-exec-am» не требует выполнения команд.
/usr/bin/mkdir -p '/usr/share/doc/icecast'
/usr/bin/install -c -m 644 README AUTHORS COPYING NEWS TODO '/usr/share/doc/icecast'
make[3]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22»
make[2]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22»
make[1]: выход из каталога «/root/icecast-kh-icecast-2.4.0-kh22»
Процесс установки Icecast 2.4.0-kh22 завершен успешно. Программа была скомпилирована и установлена на вашей системе. Все необходимые файлы, включая конфигурационные файлы, документацию и изображения, были размещены в соответствующих каталоги

После установки Icecast вы можете скопировать файлы веб-интерфейса в /usr/share/icecast2/web вручную или настроить веб-сервер для обслуживания веб-интерфейса из этой директории.

Старт

Код: Выделить всё

icecast -b -c /etc/icecast/icecast.xml
Starting icecast
Detaching from the console
Changed supplementary groups based on user: icecast.
Changed groupid to 106.
Changed userid to 104.

Код: Выделить всё

icecast -v
Icecast 2.4.0-kh22-20240317202713

http://192.168.175.1:8000/index.html
http://192.168.175.1:8000/admin.html
количество слов: 5352
Ответить Вложения 16 Пред. темаСлед. тема

Вернуться в «Потоковое цифровое аудио и видеовещание»