901

Re: liquidsoap

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

902

Re: liquidsoap

Странно но оно работает )

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

903

Re: liquidsoap

Никак

904

Re: liquidsoap

Здравствуйте!
Решил перейти на 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)

Няя :3

905

Re: liquidsoap

попробуйте через mksafe fallback сделать и track_sensitive=false

906

Re: liquidsoap

пишет 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. или нужно в виде переменной его делать?
Няя :3

907

Re: liquidsoap

radio = mksafe(fallback(track_sensitive=false, [live, radio]))

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

908

Re: liquidsoap

пишет 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)
Няя :3

909

Re: liquidsoap

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

910

Re: liquidsoap

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

911

Re: liquidsoap

пишет tarasian666:

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

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

Няя :3

912

Re: liquidsoap

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

913

Re: liquidsoap

пишет 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)

Няя :3

914

Re: liquidsoap

Проблема решена.
Спасибо, tarasian666, за попытки помочь мне.
От безысходности обновил дистрибутив Ubuntu, снёс собранный руками liquidsoap и поставил его из репозиториев.
Всё работает идеально, MP3 поддерживается из коробки, скрипт был написан правильно.

Няя :3

915

Re: liquidsoap

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

Отредактировано Falcon (30-01-2014 13:42:07)

http://radioheart.ru/banners/radioheart_400x40_banner.jpg
RadioHeart.ru: Функциональный радио хостинг с автодиджеем и нонстопом, а так же быстрый виртуальный хостинг. Возможность создать радио за 5 минут, подключить автодиджей и нонстоп.
Отзывы о хостинге

916

Re: liquidsoap

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

917

Re: liquidsoap

Добрый день.

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

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

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

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

918

Re: liquidsoap

Возможность есть, настраивать ничего не надо, только включить telnet в liqauidsoap

set("server.telnet",true)

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

919

Re: liquidsoap

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

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

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

920

Re: liquidsoap

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

921

Re: liquidsoap

пишет 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 айскаста и опрашиваем.

922

Re: liquidsoap

По совету 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)

923

Re: liquidsoap

пишет 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 часов вещания с момента запуска, основной звук начинает "хрипеть", то есть его уровень явно выходит за первоначальный постепенно. Таким образом чем далее, тем слушать уже не возможно...

Может кто в курсе, как правильно поправить функцию? Как с ней уже только не мучился.
Синтаксис этой функции в полной мере так пока и не удалось побороть... sad

Radiodev - coming soon.

924

Re: liquidsoap

Привет! Кто подскажет как в эту конструкцию включить харбор, все перелопатил вдоль и поперек этой темы, ну не получается((

#!/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)

925

Re: liquidsoap

Никто не сталкивался с такой проблемой?
Когда используется 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 - при смене треков, может включиться джингл...

Radiodev - coming soon.