ОсновноеRadiotalkПользовательское
Технологии вещания, софт, скрипты
6   •   Посмотреть все темы

liquidsoap

 

6245
Тарас @tarasian666
request.dynamic не предназначен для очереди заказов, не знаю будет ли так работать

9
Harper @Harper
Странно но оно работает )

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 маунт, хотя играет только нонстоп. Как побороть?

6245
Тарас @tarasian666
Никак

20
Marko @namikiri
Здравствуйте!
Решил перейти на 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
6245
Тарас @tarasian666
попробуйте через mksafe fallback сделать и track_sensitive=false

20
Marko @namikiri
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. или нужно в виде переменной его делать?


6245
Тарас @tarasian666
radio = mksafe(fallback(track_sensitive=false, [live, radio]))

а потом radio в output вставить

20
Marko @namikiri
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)

6245
Тарас @tarasian666
а в каком формате идет стрим на харбор?

6245
Тарас @tarasian666
может ему еще название маунта не нравится судя по логам, может убрать или добавить слеш (не в liquidsoap)

20
Marko @namikiri
tarasian666 пишет:

а в каком формате идет стрим на харбор?

MP3@128kbps, частота auto.
Пробовал убирать/добавлять слэш, пробовал менять частоту дискретизации, безрезультатно.
Мне кажется, здесь проблема в запросах HTTP или конфигурации liquidsoap, а не в форматах, ведь на форматы заругался бы MAD, накрайняк модуль source/decode/encode, но никак не харбор, ведь харбор просто принимает данные и отдаёт их источнику.

6245
Тарас @tarasian666
конфигурация вроде впорядке, у меня с такой же работает, только логи отключены

20
Marko @namikiri
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
20
Marko @namikiri
Проблема решена.
Спасибо, tarasian666, за попытки помочь мне.
От безысходности обновил дистрибутив Ubuntu, снёс собранный руками liquidsoap и поставил его из репозиториев.
Всё работает идеально, MP3 поддерживается из коробки, скрипт был написан правильно.

888
Falcon @Falcon
Добрый день. Такой вопрос:
Есть два инпута, их надо смикшировать. У первого инпута понизить громкость до 20%, и на него наложить второй инпут со 100% громкостью. Желательно сделать "врезку" красивым кроссфейдом.
Подскажите, как сие можно реализовать?
Читал про функцию smooth_add(~delay=0.5,~p=0.2,~normal,~special), но не уверен, что она подойдет.
Спасибо.

Отредактировано Falcon - 30.01.2014
6245
Тарас @tarasian666
есть функция mix
насчет врезки с кросфейдом незнаю как там получится, я делал такое внешне через telnet скриптом - плавное изменение громкостей двух потоков

3
second8prize @second8prize
Добрый день.

Пишу скрипт, который показывал бы текущий трек.
Обычно предлагается следующее решение, каждый заданный интервал времени запрашивать с помощью AJAX сервер Icecast и забирать от туда информацию.

Есть ли возможность отправить такой запрос напрямую из php в liquidsoap и получить ответ о том, сколько будет еще длиться текущий трек. Или хотя бы когда он начался?

Насколько понимаю, нужно работать с telnet запросами. Но как их правильно настроить я не разобрался.

Буду очень благодарен за любую помощь.

6245
Тарас @tarasian666
Возможность есть, настраивать ничего не надо, только включить telnet в liqauidsoap set("server.telnet",true)

название трека <id стрима>.metadata и парсить то что с rid=0
сколько осталось <id стрима>.remaining
осталось только сделать telnet клиент на php и парсить данные )

3
second8prize @second8prize
Спасибо за ответ.

если адрес ip-adress:port/mountpoint , то <id стрима> - это mountpoint ? наверное, не так все-таки.

или это radio = playlist(...) или <id стрима> - это radio

6245
Тарас @tarasian666
если id не задан то выбирает mountpoint или название переменной "плейлиста" помоему