Re: liquidsoap
request.dynamic не предназначен для очереди заказов, не знаю будет ли так работать
Первый русскоязычный форум посвященный интернет-радиовещанию
Страницы Назад 1 … 35 36 37 38 39 … 53 Далее
Чтобы отправить ответ, вы должны войти или зарегистрироваться
request.dynamic не предназначен для очереди заказов, не знаю будет ли так работать
Странно но оно работает )
req = request.dynamic({request.create("bar:foo", indicators=get_process_lines("php get_req.php "))})
# Start building the feed with music
radio = fallback(track_sensitive = false, [req, myplaylist])
Это для liquidsoap
<?php
$host = "localhost";
$user = "user";
$base = "base";
$pass = "pass";
$link = mysql_connect($host, $user, $pass) or die();
mysql_select_db($base) or die();
$query = 'SELECT * FROM `requests` LIMIT 1 ORDER by date ASC';
$result = mysql_query($query) or die();
$line = mysql_fetch_array($result, MYSQL_ASSOC);
if(!empty($line) && $line != 0){
echo $line['path'];
mysql_query('DELETE FROM `request` WHERE `id` = '.$line['id'].' LIMIT 1') or die();
}
mysql_free_result($result);
mysql_close($link);
?>
Это для скрипта запроса
З.Ы. Такой вот вопрос появился. При HUP рестарте айскаста - в статусе начниает показываться /live маунт, хотя играет только нонстоп. Как побороть?
Здравствуйте!
Решил перейти на Liquidsoap (перед этим был mpd), всё настроил, скрипт написал, всё работает, кроме злосчастного harbor.
Вот полный скрипт радио:
set("harbor.bind_addr","0.0.0.0")
set("harbor.max_connections",5) # пробовал
set("harbor.verbose",true) # полный вывод логов
set("log.file.path","./debug.log") # и в файло пишем
set("log.level",5) # пишем всё что думаем
set("log.stdout",true) # в stdout для отладки
# Jingle Injection
def smooth_add(~delay=0.5,~p=0.2,~normal,~special)
d = delay
fade.final = fade.final(duration=d*2.)
fade.initial = fade.initial(duration=d*2.)
q = 1. - p
c = amplify
fallback(track_sensitive=false,
[special,normal],
transitions=[
fun(normal,special)->
add(normalize=false,
[c(p,normal),
c(q,fade.final(type="sin",normal)),
sequence([blank(duration=d),c(q,special)])]),
fun(special,normal)->
add(normalize=false,
[c(p,normal),
c(q,fade.initial(type="sin",normal))])
])
end
# Music
music = mksafe(audio_to_stereo(playlist("/home/service/audio/jtrance/music/")))
music = crossfade(start_next=2.,fade_out=3.,fade_in=1.,music)
# Some jingles
jingles = mksafe(audio_to_stereo(playlist("/home/service/audio/jtrance/jingle/")))
jingles = amplify(2., jingles)
# Start building the feed with music
radio = random([music])
# Mixing music and jingles
radio = smooth_add(p=0.05, delay=0.3, normal=radio, special=switch([({0h0m or 0h30m }, jingles)]))
#Тот самый харбор
live = input.harbor("stream",port=8080,password="AZAZAazazaAZAZA",debug=true,logfile="./harbor.log")
# Stream it out
#Constant J-Trance Feed
output.icecast(%mp3(bitrate=128),
host = "localhost", port = 8000,
name = "NyanServer :: Japanese Electronic Music",
url="убрал ссылку. не отправлялось",
genre = "Trance, JTrance, Electronic, Anime, Japanese, Vocaloid",
description = "J-Trance and Japanese Electronic Music",
password = "***stream pass***",
mount = "jtrance",
# Radio stream
radio)
#Live feed
output.icecast(%mp3(bitrate=128),
host = "localhost", port = 8000,
name = "NyanServer Live :3",
url="убрал ссылку",
genre = "Kosherbient",
description = "NyanServer :3",
password = "***stream pass***",
mount = "stream",
# Radio stream
fallback([live,radio]))
Прекрасно играют оба потока (/jtrance и /stream), однако запланировано, чтобы при подключении к /stream через harbor можно было бы вещать RJ-ю, а после отключения вернуться на "исходную".
При попытке подключиться к харбору на порт 8080 в логах сыплется вот это:
2014/01/08 13:42:24 [harbor:4] New client on port 8080: router
2014/01/08 13:42:24 [harbor:4] Header: content-type, value: audio/mpeg.
2014/01/08 13:42:24 [harbor:4] Header: Authorization, value: Basic c291cmNlOkFaQVpBYXphemFBWkFaQU==.
2014/01/08 13:42:24 [harbor:4] Header: ice-name, value: My Station name.
2014/01/08 13:42:24 [harbor:4] Header: ice-description, value: My station description.
2014/01/08 13:42:24 [harbor:4] Header: ice-url, value: тут ссылка
2014/01/08 13:42:24 [harbor:4] Header: ice-genre, value: Various.
2014/01/08 13:42:24 [harbor:4] Header: ice-public, value: 1.
2014/01/08 13:42:24 [harbor:4] Header: ice-bitrate, value: 128.
2014/01/08 13:42:24 [harbor:4] Header: ice-audio-info, value: ice-samplerate=44100;ice-bitrate=128;ice-channels=2.
2014/01/08 13:42:24 [harbor:4] Requested username: source, password: AZAZAazazaAZAZA.
2014/01/08 13:42:24 [harbor:4] Client logged in.
2014/01/08 13:42:24 [harbor:4] SOURCE request on /stream.
2014/01/08 13:42:24 [harbor:4] Adding source on mountpoint "/stream" with type "audio/mpeg".
2014/01/08 13:42:24 [harbor:4] Returned 500 for '/stream': File "tools/harbor.ml", line 354, characters 31-37: Assertion failed
То есть он как бы принимает поток, но потом ВНЕЗАПНО рвёт его с ошибкой 500. В том файле, который он сказал, содержится код на OCaml, который я править не рискнул:
let protocol =
match hprotocol with
| `Http_10 -> "HTTP/1.0"
| `Http_11 -> "HTTP/1.1"
| _ -> assert false
Ругается на последнюю строчку в нём.
Пробовал подключатсья другими источниками (EDCast, ezstream) — жидкое мыло посылает всех с ошибкой 500.
Может быть кто-нибудь знает как побороть проблему?
Мыло собирал сам, вот configure:
---------------------------------------------------------------- Installation
prefix : /usr/local
exec_prefix : ${prefix}
binary : ${exec_prefix}/bin
configuration : ${prefix}/etc/liquidsoap
logging : ${prefix}/var/log/liquidsoap
PIDs : ${prefix}/var/run/liquidsoap
logrotate conf : ${prefix}/etc/logrotate.d
man page : ${datarootdir}/man/man1
doc : ${datarootdir}/doc
-------------------------------------------------------------------- Features
* Supported input formats
- Vorbis : yes
- Theora : no (requires theora)
- Speex : no (requires speex)
- Dirac : no (requires schroedinger)
- Flac (native) : no (requires flac)
- Flac (ogg) : no (requires flac.ogg)
- MP3 : yes
- AAC : no (requires faad)
- text-to-speech : requires text2wave (festival) and sox at runtime
- XML playlists : no (requires xmlplaylist)
- Lastfm : no (requires lastfm)
* Supported output formats
- Vorbis : yes
- MP3 : yes
- MP3 (fixed-point) : no (requires shine)
- AAC : no (requires voaacenc)
- AAC+ : detected at runtime
- FDK-AAC : yes
- SPEEX : no (requires speex)
- Opus : no (requires opus)
- Theora : no (requires theora)
- Dirac : no (requires schroedinger)
* Tags
- Taglib (ID3 tags) : yes
- Vorbis : yes
- charset detection : yes
* Input / output
- Icecast/Shoutcast : yes
- AO : yes
- OSS : yes
- ALSA : no (requires alsa)
- Portaudio : no (requires portaudio)
- Pulseaudio : no (requires pulseaudio)
- JACK : no (requires bjack)
- GStreamer : no (requires gstreamer)
* Audio manipulation
- Samplerate : yes
- SoundTouch : no (requires soundtouch)
- LADSPA : yes
* Video manipulation
- Gavl : no (requires gavl)
- FFmpeg : no (requires ffmpeg)
- frei0r : no (requires frei0r)
- camlimages : no (requires camlimages)
* MIDI manipulation
- DSSI : no (requires dssi)
* Visualization
- Graphics : yes
- SDL : no (requires sdl)
- GD : no (requires gd)
* Additional libraries
- wget URI resolver : requires wget at runtime
- dynlink : yes
- inotify : no (requires inotify)
- lo : no (requires lo)
- magic : no (requires magic)
- yojson : no (requires yojson)
- windows service : no (requires winsvc)
* Graphical interfaces
- Python GUI : no
Сталкивался ли кто-нибудь с таким? Как решить? Чего не хватает в configure? Если нет, куда писать разработчикам? Mailing Lists я не понимаю (да, школота, ребёнок веб-два-ноль и так далее, слышали, знаем), а внятных контактов у них нет.
Отредактировано namikiri (08-01-2014 14:05:53)
попробуйте через mksafe fallback сделать и track_sensitive=false
пишет tarasian666:
попробуйте через mksafe fallback сделать
#Live feed output.icecast(%mp3(bitrate=128), host = "localhost", port = 8000, name = "NyanServer Live :3", url="убрал ссылку", genre = "Kosherbient", description = "NyanServer :3", password = "***stream pass***", mount = "stream", # Radio stream fallback([live,radio])) # вот fallback на live. или нужно в виде переменной его делать?
radio = mksafe(fallback(track_sensitive=false, [live, radio]))
а потом radio в output вставить
пишет tarasian666:
radio = mksafe(fallback(track_sensitive=false, [live, radio]))
а потом radio в output вставить
Сделал всё так, как Вы сказали. Та же ошибка в логах.
radio = mksafe(fallback(track_sensitive=false, [live,radio]))
output.icecast(%mp3(bitrate=128),
host = "localhost", port = 8000,
name = "NyanServer Live :3",
url="http://nyanserver.com",
genre = "Kosherbient",
description = "NyanServer :3",
password = "32resfasfaewfewfewrferf",
mount = "stream",
# Radio stream
radio)
может ему еще название маунта не нравится судя по логам, может убрать или добавить слеш (не в liquidsoap)
пишет tarasian666:
а в каком формате идет стрим на харбор?
MP3@128kbps, частота auto.
Пробовал убирать/добавлять слэш, пробовал менять частоту дискретизации, безрезультатно.
Мне кажется, здесь проблема в запросах HTTP или конфигурации liquidsoap, а не в форматах, ведь на форматы заругался бы MAD, накрайняк модуль source/decode/encode, но никак не харбор, ведь харбор просто принимает данные и отдаёт их источнику.
конфигурация вроде впорядке, у меня с такой же работает, только логи отключены
пишет tarasian666:
конфигурация вроде впорядке, у меня с такой же работает, только логи отключены
Какая у Вас версия liquidsoap? Вот моя:
root@srv-main:/home/namikiri# liquidsoap --version
Liquidsoap 1.1.1+scm (@:20140107:154214)
Copyright (c) 2003-2013 Savonet team
Liquidsoap is open-source software, released under GNU General Public License.
See <http://liquidsoap.fm> for more information.
Собирал из git, ОС Ubuntu 12.10. А, да, ещё, какая у Вас версия OCaml? Моя:
root@srv-main:/home/namikiri# ocaml -version
The Objective Caml toplevel, version 3.12.1
На всякий случай:
Linux srv-main 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:32:08 UTC 2012 i686 i686 i686 GNU/Linux
Отредактировано namikiri (08-01-2014 16:22:21)
Проблема решена.
Спасибо, tarasian666, за попытки помочь мне.
От безысходности обновил дистрибутив Ubuntu, снёс собранный руками liquidsoap и поставил его из репозиториев.
Всё работает идеально, MP3 поддерживается из коробки, скрипт был написан правильно.
Добрый день. Такой вопрос:
Есть два инпута, их надо смикшировать. У первого инпута понизить громкость до 20%, и на него наложить второй инпут со 100% громкостью. Желательно сделать "врезку" красивым кроссфейдом.
Подскажите, как сие можно реализовать?
Читал про функцию smooth_add(~delay=0.5,~p=0.2,~normal,~special), но не уверен, что она подойдет.
Спасибо.
Отредактировано Falcon (30-01-2014 13:42:07)
есть функция mix
насчет врезки с кросфейдом незнаю как там получится, я делал такое внешне через telnet скриптом - плавное изменение громкостей двух потоков
Добрый день.
Пишу скрипт, который показывал бы текущий трек.
Обычно предлагается следующее решение, каждый заданный интервал времени запрашивать с помощью AJAX сервер Icecast и забирать от туда информацию.
Есть ли возможность отправить такой запрос напрямую из php в liquidsoap и получить ответ о том, сколько будет еще длиться текущий трек. Или хотя бы когда он начался?
Насколько понимаю, нужно работать с telnet запросами. Но как их правильно настроить я не разобрался.
Буду очень благодарен за любую помощь.
Возможность есть, настраивать ничего не надо, только включить telnet в liqauidsoap
set("server.telnet",true)
название трека <id стрима>.metadata и парсить то что с rid=0
сколько осталось <id стрима>.remaining
осталось только сделать telnet клиент на php и парсить данные )
Спасибо за ответ.
если адрес ip-adress:port/mountpoint , то <id стрима> - это mountpoint ? наверное, не так все-таки.
или это radio = playlist(...) или <id стрима> - это radio
если id не задан то выбирает mountpoint или название переменной "плейлиста" помоему
пишет second8prize:
Или хотя бы когда он начался?
Может быть metadata update у icecast запросить проще (это ведь и есть старт трека)?
Делаем xsl файлик
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="yes" method="text" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="no" encoding="UTF-8" /><xsl:strip-space elements="*"/>
<xsl:template match = "/icestats" >
<xsl:for-each select="source">
<xsl:value-of select="metadata_updated" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
, пихаем его в web root айскаста и опрашиваем.
По совету tarasian666 поднял telnet сервер у liquidsoap.
На этой же машине установил http + php.
Написал скрипт, который отправляет запросы telnet (<mountpoint>.remaining и <mountpoint>.metadata) и возвращает примерно вот что:
Time: 211.42
2014/02/13 17:28:08 => Amon DГјГјl II - Good bye my love
2014/02/13 17:23:22 => The Walkmen - Save The Last Dance For Me (feat. Ian Svenonius)
2014/02/13 17:17:37 => Moderat - Therapy
2014/02/13 17:13:08 => The Black Ryder - To Never Know You
2014/02/13 17:08:59 => Wolfmother - 10,000 Feet
2014/02/13 17:06:24 => Tinkerbell's Fairydust - In My Magic Garden [12/1967]
2014/02/13 17:03:00 => Polvo - Lantern
2014/02/13 16:59:16 => Truckfighters - Loose
2014/02/13 16:55:09 => Mercury Rev - Vermillion
2014/02/13 16:52:03 => The Black Box Revelation - 5 O'Clock Turn Back The Time
При первом обращении к web-странице Аякс асинхронно вызывает скрипт, считывает интервал времени до конца текущего трека и вставляет на нее полученную информацию. Следующий раз вызов скрипта происходит через время, полученное в первом обращении.
Отредактировано second8prize (13-02-2014 17:47:28)
пишет Falcon:
Добрый день. Такой вопрос:
Есть два инпута, их надо смикшировать. У первого инпута понизить громкость до 20%, и на него наложить второй инпут со 100% громкостью. Желательно сделать "врезку" красивым кроссфейдом.
Подскажите, как сие можно реализовать?
Читал про функцию smooth_add(~delay=0.5,~p=0.2,~normal,~special), но не уверен, что она подойдет.
Спасибо.
Функция есть в коробке.
Её можно не объявлять по идее, а просто использовать к примеру:
radio = smooth_add(normal=radio,special=switch([({ 5m0s or 15m0s or 30m0s }, promo)]))
У меня же попутный вопрос, касаемо smooth_add.
def smooth_add(~delay=0.5,~p=0.2,~normal,~special)
d = delay
fade.final = fade.final(duration=d*2.)
fade.initial = fade.initial(duration=d*2.)
q = 1. - p
c = amplify
fallback(track_sensitive=false,
[special,normal],
transitions=[
fun(normal,special)->
add(normalize=false,
[c(p,normal),
c(q,fade.final(type="sin",normal)),
sequence([blank(duration=d),c(q,special)])]),
fun(special,normal)->
add(normalize=false,
[c(p,normal),
c(q,fade.initial(type="sin",normal))])
])
end
Можно видоизменять данную функцию, её дефолтные параметры фейда и выполнения.
Так вот. По дефолту наложение происходит таким образом, что основной играемый звук, притухает, затем воспроизводится наложение и звук возвращается в исходное положение.
Отвечает за уровень наложения - p=0.2
Чем ниже значение, тем громче наложение и тише основной сорс.
В моём случае пытаюсь добиться того, чтобы основной звук не притухал, а поверх накладывался джингл с полным звуком, без всяких фейдов.
В итоге если снижать значение p=0.2 - джингл становится громче, основной звук - тише. Повышать - джингл не слышно.
Среднее 0.5 - то же не то.
Получается только так достичь результата:
def smooth_add(~delay=0.1,~p=0.5,~normal,~special)
d = delay
fade.final = fade.final(duration=d*2.)
fade.initial = fade.initial(duration=d*2.)
#q = 1. - p
c = amplify
fallback(track_sensitive=false,
[special,normal],
transitions=[
fun(normal,special)->
add(normalize=false,
[c(1.,normal),
c(1.,fade.final(type="sin",normal)),
sequence([blank(duration=d),c(1.,special)])]),
fun(special,normal)->
add(normalize=false,
[c(p,normal),
c(1.,fade.initial(type="sin",normal))])
])
end
Более менее работает, как нужно, но выходит неприятность спустя несколько часов.
Когда проходит 3-6 часов вещания с момента запуска, основной звук начинает "хрипеть", то есть его уровень явно выходит за первоначальный постепенно. Таким образом чем далее, тем слушать уже не возможно...
Может кто в курсе, как правильно поправить функцию? Как с ней уже только не мучился.
Синтаксис этой функции в полной мере так пока и не удалось побороть...
Привет! Кто подскажет как в эту конструкцию включить харбор, все перелопатил вдоль и поперек этой темы, ну не получается((
#!/usr/bin/liquidsoap
set("log.file.path","/var/data/test.log")
set("log.level",3)
# Загрузка плейлиста 1
myplaylist = mksafe(playlist(reload=3000, '/var/data/music'))
# Загрузка джинглов
jingles = mksafe(playlist("/var/data/promo"))
radio = myplaylist
radio = rotate(weights = [1, 4],[jingles, radio])
# включение telnet-сервера
set("server.telnet.bind_addr","127.0.0.1")
set("server.telnet.port",1231)
set("server.telnet",true)
# Пропускать тишину во всех плейлистах
# Cut blanks (bonus-tracks)
s = skip_blank(length=5.)
# Настройка crossfade
# radio = normalize( radio )
radio = smart_crossfade(start_next=2.0,fade_out=3.0,fade_in=3.0,radio)
# Запуск основного потока mp3
output.icecast(%mp3,description = "MP3",
host = "localhost", port = 80,
password = "PASSWD", mount = "test", radio,
name = "NAME", url = "http://site.com", genre = "GENRE",)
И еще вопрос, что и куда надо писать в конфиге, что бы request.push, т.е. управление очередью через telnet работало?
Спасибо)
Отредактировано tazman_555 (18-02-2014 14:51:35)
Никто не сталкивался с такой проблемой?
Когда используется switch для ротации source плейлистов, не срабатывает включение джинглов после определенного количества треков.
radio = rotate(weights = [1, 4],[jingles, radio])
То есть, имеем следующее:
# source плейлисты
general_list = smart_crossfade(start_next=3.,fade_out=2.3,fade_in=0.7, playlist(reload=3600,"~/GEN"))
ps_list = smart_crossfade(start_next=5.,fade_in=6.,fade_out=3., conservative=false, high=-28., medium=-48., mksafe(input.http("http://trololo.ru/stream")))
....
...
mix_list = smart_crossfade(start_next=3.,fade_out=2.3,fade_in=0.7, playlist(reload=3600,"~/MIX"))
relax_list = smart_crossfade(start_next=3.,fade_out=2.3,fade_in=0.7, playlist(reload=3600,"~/RELAX"))
jingle_list = playlist(reload=600,mode="random","~/jingles")
general = rotate(weights = [1, 4],[jingle_list, general_list])
#расписание эфира первое - высший приоритет
default = switch(track_sensitive=false,
[
({ (2w) and 0h - 1h }, ps_list),
({ 7h - 8h or 12h -13h }, mix_list),
...
......
({ 0h - 1h or 2h - 7h or 8h - 12h or 13h - 17h or 18h - 23h }, general),
({ true }, general)
])
.... далее используется crossfade и mksafe которые так же пробовал убирать, не помогло
..
Треки играют одни за одним, джинглы - нет.
rotate, random - одно и тоже. Причём при запуске мыла, первым играет джингл, но дальше после опр.количества треков - нет.
Ещё интересный момент. Если через telnet дать команду [mount].skip - при смене треков, может включиться джингл...
Страницы Назад 1 … 35 36 37 38 39 … 53 Далее
Чтобы отправить ответ, вы должны войти или зарегистрироваться