ОсновноеRadiotalkПользовательское
Общие вопросы по интернет радио вещанию
6   •   Посмотреть все темы

настройка и запуск liquidsoap

 

25
yakoff @yakoff
кратко о проделанном:

sudo apt-get dist-upgrade
// E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
sudo apt-get dist-upgrade --fix-missing

apt-get install make
sudo apt-get install g++


// Установка библиотек:

apt-get install libshout-dev
apt-get install libmp3lame-dev
apt-get install libxml2-dev

apt-get install libxslt1-dev
apt-get install libvorbis-dev

cd /tmp
wget [url]http://curl.haxx.se/download/curl-7.45.0.tar.gz[/url]
tar -zxvf curl-7.45.0.tar.gz
cd curl-7.45.0
./configure
make
make install


// Установка icecast-2.4.2:

// идем в темп
cd ..
// качаем исходник, тк желаем более свежую версию, чем в репозитариях
wget [url]http://downloads.xiph.org/releases/icecast/icecast-2.4.2.tar.gz[/url]
tar -zxvf icecast-2.4.2.tar.gz
cd icecast-2.4.2
./configure
make
make install

// кажется установилось без ошибок
// настраиваем /usr/local/etc/icecast.xml


// сохраняемся и устанавливаем liquidsoap (тк впервые, то из репозитариев)

apt-get install liquidsoap
//установилса, кажется, liquidsoap (1.1.1-6ubuntu2)

// создаем файл конфигурации:
/usr/bin/liquidsoap.xml


вот тут-то я и затупил.. не могу запустить liquidsoap... не знаю как, сижу и плачу!

upd:
погодьте! мужчины не плачут, так, минутная слабость. нашел тестовый конфиг!


upd2: Нет, не выходит.. что делать? - паниковать!

вот стандартный краденый отсюда ********** конфиг:
#!/usr/bin/liquidsoap
# Log dir
set("log.file.path","/tmp/basic-radio.log")

# Music
myplaylist = playlist("~/radio/music.m3u")
# Some jingles
jingles = playlist("~/radio/jingles.m3u")
# If something goes wrong, we'll play this
security = single("~/radio/sounds/default.ogg")

# Start building the feed with music
radio = myplaylist
# Now add some jingles
radio = random(weights = [1, 4],[jingles, radio])
# And finally the security
radio = fallback(track_sensitive = false, [radio, security])

# Stream it out
output.icecast(%vorbis,
host = "localhost", port = 8000,
password = "hackme", mount = "basic-radio.ogg",
radio)


сохранил его как /etc/liquidsoap/11.liq
запускаю:
liquidsoap 11.liq

а он мне, собака:
- At line 1, char 1-3: The result of evaluating this term would be dropped, but
it does not have type unit or active_source. Use ignore(...) if you meant
to drop it, otherwise this is a sign that your script does not do
what you intend.

редактирую в notepad++.. что ему не нравится???

Отредактировано yakoff - 28.10.2015
382
Grigorij @gyurgin_1
И что прямо вот как в примере в домашней папке пользователя в /radio лежат правильные плейлисты , музыка, джинглы на месте, в iecast поток именно так настроен?

25
yakoff @yakoff
gyurgin_1 пишет:

И что прямо вот как в примере в домашней папке пользователя в /radio лежат правильные плейлисты , музыка, джинглы на месте, в iecast поток именно так настроен?

О чем Вы?!

и директории нет, и плейлистов нет, и как правильно их написать я не знаю, и джинглов пока нет, и поток пока НИКАК не настроен, но:
конфиги разные ставил.. некоторые затачивал под себя, некоторые нет.
на одни пишет - At line 1, char 1-3: The res..., на другие - At line 1, char 1-4: The res..., на третьи : - At line 1, char 8-9: The res...разве это не ругань на неверный синтаксис, мусор в первой строке, или чего подобное? он жа (liquidsoap) даже логов не пишет и не доходит до всего прочего, споткнувшись и убившись на первой строке!

382
Grigorij @gyurgin_1
А смысл запускать заведомо неверный конфиг? И запомните сразу - пока конфиг не пройдет проверку - лога не увидите. И надеюсь запускали не под рутом?

25
yakoff @yakoff
и под рутом и под нерутом.. и заполненный, и краденый, и по дефолту - результат один. ругается одинаковыми словами.
А смысл запускать заведомо неверный конфиг?

Дык как же верный конфиг то запустить? где-ж его взять? я ж как котенок слепой во все, что движется тычусь!

у меня конфиг по дефолту вообще фееричен:
#
# A simple radio script to get started
# Filenames need to be edited in playlist() and single() sources
#

message =
"The Savonet team thanks you for using liquidsoap, " ^
"and we hope you'll enjoy it!"

# Then we setup our icecast output function.
# Possible options and values are bitrate=64, samplerate=11025, ...
out = output.icecast(%vorbis,host="localhost")

out(mount="demo.ogg",
# The scheduler plays a randomized playlist, or the .ogg file
# if the playlist fails to stream anything. The playlist can be made
# of remote URIs.
add([
# Comment out the next line if you don't have speech synthesis enabled.
delay(10.,single("say:"^message)),
# We add another output without the synthesized messages. It is not started
# but you can turn it on using the server:
# > telnet localhost 1234
# > novoice.ogg.start
out(start=false,mount="novoice.ogg",
fallback([ playlist("/your/favorite.m3u"),
# The out(..) needs the single(..) to be infallible,
# which requires a valid audio filename.
single("/some/file.ogg") ]))
],
weights=[5,1]))
какой-то странный.. - ни путей, ни паролей, ничего нет... в icec как-то попроще было. как его запускать?
впрочем, пробовал - переименовывал и та-же ошибка.
и как связать его с iecast?
к тому-же директории не соответствуют описанным здесь, я же написал, что в панике запускал.

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

ЧТО писать в конфиге iecast? (в разделе mount)

как то так. есть объемные мануалы по настройке, например **********, но обрывающиеся на самом интересном месте.

в общем вопросы актуальные на данный момент следующие:
как составлять плейлист? (можно пример листа)
под кем запускать liquidsoap? создать конкретного пользователя?)
чем отличается конфиг liquidsoap версии 111 от конфигов других версий?

Самый главный: что по минимуму должно быть в конфигах liquidsoap и iecast для запуска радио?

Отредактировано yakoff - 29.10.2015
25
yakoff @yakoff
поспал.. переписал конфиг..
#!/usr/local/bin/liquidsoap

# создаём переменные быстрого исправления в одном месте по необходимости
# базовая информация о выводимом потоке
out = output.icecast(
# хост с icecast
host = "127.0.0.1",

# его порт
port = 8000,

# логин
user = "source",

# и пароль
password = "my_icecast2_password",

# название
name = "Интернет-радио",

# жанр
genre = "Rock",

# ссылка на сайт
url = "http://site",

# кодировка
encoding = "UTF-8"
)

# включаем telnet-сервер
set("server.telnet.bind_addr","127.0.0.1")
set("server.telnet",true)

# _____________________________________
# Описание файловой структуры нашего радиосервера.
# Переменные можно не использовать, а писать сразу полные пути к плейлистам, но при изменении названия одной из папок, придётся править довольно много строк в конфигурации. Как показала практика, такой подход удобнее.

# абсолютный путь к рабочей директории
wd = "/home/botanica/web/my_domen.com/public_html"

# путь к папке с аудиофайлами
pl = "#{wd}/src/my_domen.com-radio"

# техническая папка
#tech = "#{pl}"

# логи
set("log.file.path","#{wd}/log/liquidsoap.log") # путь к файлу лога
set("log.level", 4) # уровень логирования

# папка с программами
progr_dir = "#{pl}/programs"

# папка с изменяющимся эфиром
#ef = "#{pl}/efir"

# папки соответствующих эфиров
#ni = "#{ef}/night"
#mo = "#{ef}/morning"
#da = "#{ef}/daytime"
#ev = "#{ef}/evening"

# папки с музыкой
#mus_ni_dir = "#{ni}/music"
#mus_mo_dir = "#{mo}/music"
#mus_da_dir = "#{da}/music"
#mus_ev_dir = "#{ev}/music"
mus_dir = "#{wd}/sto/my_domen.com-radio/music"

# папки с джинглами
#jin_ni_dir = "#{ni}/jingles"
#jin_mo_dir = "#{mo}/jingles"
#jin_da_dir = "#{da}/jingles"
#jin_ev_dir = "#{ev}/jingles"
jin_dir = "#{wd}/sto/my_domen.com-radio/jingles"

# плейлисты с программами. Обратите внимание - до этого указывались пути к папкам, а здесь - к простым текстовым файлам.
#1_prog_pl = "#{progr_dir}/1_prog.pl"
#2_prog_pl = "#{progr_dir}/2_prog.pl"
prog_pl = "#{progr_dir}/prog.pl"


# _____________________________________
# Создаём объекты типа "source", в нашем случае это аудиоисточники.
# Здесь атрибут "reload" позволяет раз в 360 секунд перечитывать плейлист по пути, указанному далее.
# По умолчанию, музыка проигрывается рандомно, атрибут <code>mode = "normal"</code> указывает на проигрывание по порядку.

# загружаем плейлисты, джинглы, вставки, программы
mus = playlist (reload = 360, "#{mus_dir}")
jin = playlist (reload = 360, "#{jin_dir}")
prog = playlist (reload = 360, "#{prog_pl}", mode = "normal")

# _____________________________________
# смешиваем вставки и потоки

all = rotate (weights = [1, 1], [mus, jin])

#_______________________________________________________________________
# конфигурируем расписание эфира

radio = switch (track_sensitive = true,
[
({ (1w21h - 1w22h) or (3w21h - 3w22h) or (5w21h - 5w22h)}, prog),
({ 2h - 1h }, all),
])

#_______________________________________________________________________

# добавляем crossfade
radio = crossfade(start_next=1., fade_out=1., fade_in=1., radio)
radio = mksafe(radio)

# и, наконец, запускаем вещалки с разным качеством

#out(
# %vorbis.abr(samplerate = 44100, channels = 2, bitrate = 128, max_bitrate = 192, min_bitrate = 96),
# description = "Average vorbis 96-128-192 Kbps",
# mount = "HabraRadio_vorbis_avg_128",
# mksafe(radio)
#)

#out(
# %mp3(bitrate = 320, id3v2 = true),
# description = "MP3 320 Kbps",
# mount = "HabraRadio_320",
# mksafe(radio)
#)

out(
%mp3(bitrate = 192, id3v2 = true),
description = "MP3 192 Kbps",
mount = "HabraRadio_192",
mksafe(radio)
)


и, о чудо, вроде как ошибки посыпались! значит работает!
часть ошибок пофиксил, а вот эта не поддается: strange error flushing buffer ...


вот то, что в логах.
2015/10/28 17:25:41 [dynamic.loader:3] Could not find dynamic module for fdkaac encoder.
2015/10/28 17:25:41 [dynamic.loader:3] Could not find dynamic module for aacplus encoder.

не подскажете как потеряльцев установить?

upd
This env variable will force liquidsoap to look for the module where
you tell it to!

щто ани говорят???

Отредактировано yakoff - 29.10.2015
382
Grigorij @gyurgin_1
Вам не надо пока.

25
yakoff @yakoff
поверю.
но что за ошибка тогда?
strange error flushing buffer ...


и вот следующий непорядок:
2015/10/28 18:07:12 [request:3] Nonexistent file or ill-formed URI "/home/my_domen/web/my_domen.tk/public_html/sto/my_domen.tk-radio/programms/\208\159\208\176\209\128\208\176\208\180\208\190\208\186\209\129\209\139 \208\189\208\176\209\131\208\186\208\184/01_01_01.mp3"!

причем файл "01_01_01.mp3" лежит непосредственно в "/home/my_domen/web/my_domen.tk/public_html/sto/my_domen.tk-radio/programms/"

что за белиберда: "\208\159\208\176\209\128\208\176\208\180\208\190\208\186\209\129\209\139 \208\189\208\176\209\131\208\186\208\184"?

Отредактировано yakoff - 29.10.2015
382
Grigorij @gyurgin_1
Слуайте, да хватит уже, берите стартовый пример, везде пропишите абсолютные пути, вместо плейлистов папки, настройте Icecast и вещайте на здоровье.

25
yakoff @yakoff
спасибо за помощь

Отредактировано yakoff - 29.10.2015
25
yakoff @yakoff
содержимое start_liquidsoap:
#!/usr/bin/liquidsoap
# где будут логи
#set("log.file.path","/tmp/test.log")
set("log.file.path","/home/my_domen/web/my_domen.tk/public_html/log/my_domen.tk-radio/liquidsoap.log")

# загружаем плейлист
#myplaylist = playlist("/home/user/radio/music.m3u")
myplaylist = playlist("/home/my_domen/web/my_domen.tk/public_html/src/my_domen.tk-radio/jingles_playlist.txt")

#запускаем вещалку
output.icecast(%vorbis,
host = "localhost", port = 8000,
password = "my_pass", mount = "live", myplaylist)


содержимое "/home/my_domen/web/my_domen.tk/public_html/srcmy_domen.tk-radio/jingles_playlist.txt":
/home/my_domen/web/my_domen.tk/public_html/sto/my_domen.tk-radio/jingles/111/23.mp3
/home/my_domen/web/my_domen.tk/public_html/sto/my_domen.tk-radio/jingles/111/22.mp3
/home/my_domen/web/my_domen.tk/public_html/sto/my_domen.tk-radio/jingles/111/37.mp3
/home/my_domen/web/my_domen.tk/public_html/sto/my_domen.tk-radio/jingles/111/81.mp3
/home/my_domen/web/my_domen.tk/public_html/sto/my_domen.tk-radio/jingles/111/75.mp3



содержимое icecast 2.xml:
<icecast>
<location>Orgrimmar</location>
<admin>___________@mail.ru</admin>


<limits>
<clients>100</clients>
<sources>2</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-size>65535</burst-size>
</limits>

<authentication>
<!-- Sources log in with username 'source' -->
<source-password>my_pass</source-password>
<!-- Relays log in with username 'relay' -->
<relay-password>my_pass</relay-password>

<!-- Admin logs in with the username given below -->
<admin-user>admin</admin-user>
<admin-password>my_pass</admin-password>
</authentication>
<hostname>***.***.***.***</hostname>

<!-- You may have multiple <listener> elements -->
<listen-socket>
<port>8000</port>
<!-- <bind-address>127.0.0.1</bind-address> -->
<!-- <shoutcast-mount>/stream</shoutcast-mount> -->
</listen-socket>

<http-headers>
<header name="Access-Control-Allow-Origin" value="*" />
</http-headers>


<mount>
<mount-name>/live</mount-name>
<!--mount-name>/jingles</mount-name>
<fallback-mount>/nonstop</fallback-mount-->
<charset>utf-8</charset>
<fallback-override>1</fallback-override>
</mount>




<fileserve>1</fileserve>

<paths>
<!-- basedir is only used if chroot is enabled -->
<basedir>/usr/local/share/icecast</basedir>

<!-- Note that if <chroot> is turned on below, these paths must both
be relative to the new root, not the original root -->
<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> -->
<alias source="/" destination="/status.xsl"/>
<!-- The certificate file needs to contain both public and private part.
Both should be PEM encoded.
<ssl-certificate>/usr/local/share/icecast/icecast.pem</ssl-certificate>
-->
</paths>

<logging>
<accesslog>access.log</accesslog>
<errorlog>error.log</errorlog>
<!-- <playlistlog>playlist.log</playlistlog> -->
<loglevel>4</loglevel> <!-- 4 Debug, 3 Info, 2 Warn, 1 Error -->
<logsize>10000</logsize> <!-- Max size of a logfile -->
<!-- If logarchive is enabled (1), then when logsize is reached
the logfile will be moved to [error|access|playlist].log.DATESTAMP,
otherwise it will be moved to [error|access|playlist].log.old.
Default is non-archive mode (i.e. overwrite)
-->
<!-- <logarchive>1</logarchive> -->
</logging>

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


пытаюсь запустить liquidsoap:
liquidsoap /home/my_domen/web/my_domen.tk/public_html/src/my_domen.tk-radio/start_liquidsoap

liquidsoap ругается:
Invalid value at line 8, char 22-110: That source is fallible.

в чем может быть дело? содержимое jingles_playlist.txt?

Отредактировано yakoff - 29.10.2015
382
Grigorij @gyurgin_1
Вот здесь #запускаем вещалку
output.icecast(%vorbis,
host = "localhost", port = 8000,
password = "my_pass", mount = "live", myplaylist)
сделайте #запускаем вещалку
output.icecast(%vorbis,
host = "localhost", port = 8000,
password = "my_pass", mount = "live", mksafe(myplaylist))

Liquidsoap просто не любит сюрпризов и всегда хочет подстраховаться.

25
yakoff @yakoff
Хм-м-м!)))
Вроде запустилось!
Ошибок не выдает!
правда и потока по адресу ********** не вижу.. порт открыт в файерволе. сейчас будем посмотреть))
Спасибо!

25
yakoff @yakoff
В общем у меня опять тупняки.
выдержка из логов liquidsoap:
2015/10/30 16:17:19 [live:3] Connecting mount live for source@***.***.***.***...
2015/10/30 16:17:19 [live:2] Connection failed: could not write data to host: Connection refused in write()
2015/10/30 16:17:19 [live:3] Will try again in 3.00 sec.


предполагаю, что "source@***.***.***.***" source - это пользователь, под которым liquidsoap пытается законнектиться к icecast.
в конфиге имеется запись:
<source-password>my_pass</source-password>, то есть пароль совпадает.

а чего ему записать не дают?? куда и что он пишет, и как ему помочь?

382
Grigorij @gyurgin_1
Издеваться изволите? Не получается с liquidsoap - зайдите просто с рабочего компьютера и проверьте.
Да - по умолчанию - source, но на это наплевать там по дефолту "source" то есть пишем в выхлоп
output.icecast(%mp3(bitrate=192), host="127.0.0.1", mount="поток без слеша", port=порт, password="пароль", mksafe(myplaylist))
И не путайте типы переменных - это совсем тупо.

4
Maksimum @Maksimum
Всем здрасьте! Прошу помощи. В общем, сделал расписание через switch. Две часовые отбивки (одна стандартная, а другая выходит только в полночь и полдень), и два блока (~ на 20й и 50й минуте). Остальное - музыка. Запустил, порадовался что всё выходит как надо, но... эта собака отыграет час-два и на расписание забивает, т.е. в эфире начинает играть только музыка. Кто-нибудь сталкивался с подобной проблемой?

25
yakoff @yakoff
покажи код, если не сложно.
и версию liquidsoap укажи.

4
Maksimum @Maksimum
Версия 1.0.1, из репозитория

Думаю, весь конфиг нет смысла кидать, вот фрагмент

music = rotate(weights = [1, 2],[jingles, songs])

efir = fallback(
[switch ([
({00h57m00s-01h03m59s or 01h57m00s-02h03m59s or 02h57m00s-03h03m59s or 03h57m00s-04h03m59s or 04h57m00s-05h03m59s or 05h57m00s-06h03m59s or 06h57m00s-07h03m59s or 07h57m00s-08h03m59s or 08h57m00s-09h03m59s or 09h57m00s-10h03m59s or 10h57m00s-11h03m59s or 13h57m00s-14h03m59s or 14h57m00s-15h03m59s or 15h57m00s-16h03m59s or 16h57m00s-17h03m59s or 17h57m00s-18h03m59s or 18h57m00s-19h03m59s or 19h57m00s-20h03m59s or 20h57m00s-21h03m59s or 21h57m00s-22h03m59s or 22h57m00s-23h03m59s},clock),
({11h57m00s-12h03m59s or 23h57m00s-00h03m59s},clock_special),
({17m00s-23m59s},special1),
({47m00s-53m59s},special2)
]), music
])