Re: liquidsoap

пишет nivs:

Какая ось, что, куда и как транслируется, что делаете с потоком, желательно весь конфиг. Как кодируете, через что?

Linux version 3.2.0-29-virtual (buildd@allspice) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) )

Скрипты liq. Скажу честно,их писал мой можно сказать предшественник,поэтому я особо не вникал,разобрался только с тем,как что настраивать,чтобы получить,что я хотел.

library.liq:

# This function is called when
# a new metadata block is passed in
# the stream.
def apply_metadata(m) =
  title = m["title"]
  artist = m["artist"]
  print("Now playing: #{title} by #{artist}")
end

# функция для воспроизведения рекламы во время проигрывания музыки
def smooth_add(~delay=0.75,~p=0.,~normal,~special)
  d = delay
  fade.final = fade.final(duration=d*1.)
  fade.initial = fade.initial(duration=d*4.)
  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="lin",normal)),
                    sequence([blank(duration=d),c(q,special)])]),
             fun(special,normal)->
               add(normalize=false,
                   [c(p,normal),
                    c(q,fade.initial(type="lin",normal))])
           ])
end

И один из скриптов для запуска радио (подобных файлов много):

#!/usr/bin/liquidsoap
set("init.daemon.pidfile.path","/home/sa/radio/pids/bravo_20.pid")
set("init.daemon",true)
set("log.file.path","/home/sa/radio/logs/bravo_20.log")
set("tag.encodings", ["UTF-8"])
set("log.level",3)

%include "library.liq"

def get_request() =
  uri = list.hd(get_process_lines("/home/sa/radio/php/bravo_20.php"))
  request.create(uri)
end

s = request.dynamic(id="s",get_request)

s = on_metadata(apply_metadata,s)

rek = single("/opt/mp3/reklama/bravo_20_00.mp3")
s = smooth_add(normal=s,special=switch([({ 0m0s },rek)]))

rek = single("/opt/mp3/reklama/bravo_20_05.mp3")
s = smooth_add(normal=s,special=switch([({ 5m0s },rek)]))

rek = single("/opt/mp3/reklama/bravo_20_10.mp3")
s = smooth_add(normal=s,special=switch([({ 10m0s },rek)]))

rek = single("/opt/mp3/reklama/bravo_20_15.mp3")
s = smooth_add(normal=s,special=switch([({ 15m0s },rek)]))

rek = single("/opt/mp3/reklama/bravo_20_20.mp3")
s = smooth_add(normal=s,special=switch([({ 20m0s },rek)]))

rek = single("/opt/mp3/reklama/bravo_20_25.mp3")
s = smooth_add(normal=s,special=switch([({ 25m0s },rek)]))

rek = single("/opt/mp3/reklama/bravo_20_30.mp3")
s = smooth_add(normal=s,special=switch([({ 30m0s },rek)]))

rek = single("/opt/mp3/reklama/bravo_20_35.mp3")
s = smooth_add(normal=s,special=switch([({ 35m0s },rek)]))

rek = single("/opt/mp3/reklama/bravo_20_40.mp3")
s = smooth_add(normal=s,special=switch([({ 40m0s },rek)]))

rek = single("/opt/mp3/reklama/bravo_20_45.mp3")
s = smooth_add(normal=s,special=switch([({ 45m0s },rek)]))

rek = single("/opt/mp3/reklama/bravo_20_50.mp3")
s = smooth_add(normal=s,special=switch([({ 50m0s },rek)]))

rek = single("/opt/mp3/reklama/bravo_20_55.mp3")
s = smooth_add(normal=s,special=switch([({ 55m0s },rek)]))

# We output the stream to an icecast
# server, in ogg/vorbis format.
output.icecast(%mp3(id3v2=true,bitrate=128),id="icecast",
               fallible=true,mount="bravo_20",
               name="какое-то имя",
               description="_",
               host="localhost", password="********",
               s)

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

rek = single("/opt/mp3/reklama/bravo_20_35.mp3")
s = smooth_add(normal=s,special=switch([({ 35m0s },rek)]))

и им подобные)
Когда их до шести (примерно) все отлично. На десяти процесс начинает отъедать 25% процессорного времени через часов пять (то есть когда он начнег глючить и валиться). Двенадцать вставляемых джинглов (как в приведенном мной примере - всего через полчаса). Канал вообще без джинглов играет уже около месяца без всяких проблем. Ну то есть проблемы нарастают лавинообразно от количества добавляемых вставок - видимо где-то тут и есть проблема. Я так думаю, что проблема в функции smooth_add - знатоки,посмотрите на нее пожалуйста,потому что я происходящее в ней пока что очень слабо понимаю. sad

Re: liquidsoap

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

В общем,как оказалось,все упирается в процедуру smooth_add - когда она запускается в одном скрипте несколько раз,через некоторое время начинаются серьезные проблемы (я немного выше писал,какие). Соответственно,надо было как-то исхитриться,чтобы запускалась она один раз,но при каждом запуске играла бы разные файлы.

Решение оказалось очень простое. Напомню,что было раньше:

...
]rek = single("/opt/mp3/reklama/bravo_20_00.mp3")
s = smooth_add(normal=s,special=switch([({ 0m0s },rek)]))

rek = single("/opt/mp3/reklama/bravo_20_05.mp3")
s = smooth_add(normal=s,special=switch([({ 5m0s },rek)]))

rek = single("/opt/mp3/reklama/bravo_20_10.mp3")
s = smooth_add(normal=s,special=switch([({ 10m0s },rek)]))
...

Подобное было заменено на:

...
def get_request_reklama() =
  uri = list.hd(get_process_lines("/home/sa/radio/php/bravo_20_rek.php"))
  request.create(uri)
end

rek = request.dynamic(id="s",get_request_reklama)
s = smooth_add(normal=s,special=switch([({ 0m0s or 5m0s or 10m0s or 15m0s },rek)]))
...

Содержимое вызываемого php-файла:#!/usr/bin/php -q

#!/usr/bin/php -q
<?php
$d = date( 'i', mktime() );
echo "/opt/mp3/reklama/bravo_20_" . $d . ".mp3";
?>

В итоге получается,что за каждым рекламным роликом скрипт лезет в php-файл,который ему выдает имя файла рекламы,который надо играть и именно он игрался. Текущее время узнаем в php-файле (ну,меня интересовали только минуты) - я,признаться,сломал моск,пока до меня дошло,что это можно делать в самом пхп-файле,потому что не мог сообразить,как из smooth_add передавать время. smile

Есть,правда,и пару недостатков:
1. Если запустить liq-скрипт,он сразу же полезет в php-файл спросить имя файла и будет спрашивать,пока не прочитает реально существущее имя файла. То есть если запустить liq на седьмой,к примеру,минуте часа,то три минуты liquidsoap будет гадить в логи жалобой "нет такого файла!". Как решить - пока не думал,ну скорее всего просто проверять в php-файле наличие нужного файла и,если его нет, прибавлять минуту и искать опять. И так до нахождения нужного.
2. Очень интересная проблема: имя следующего файла liquidsoap берет перед окончанием проигрывания предыдущего (впрочем,кто играл файлы через динамическую выдачу скриптами,это наверняка замечали по логам). То есть проиграв рекламу на 10 минуте, он тут же вызывает пхп-скрипт,который смотрит на время и говорит "играть файл 10 минуты!". LiquidSoap проверяет наличие файла,говорит "prepared file ...." и откладывает его проигрывание до времени Ч - то есть до 15-й минуты. Короче,возникает сдвиг на один шаг.
Как лечить,пока не решил - либо переименовывать блоки со сдвигом на один (плохая идея),либо в php-файле искать следующий,а не отдавать тот,который надо по времени (хорошая идея). О,пока писал это,понял,что идея хороша еще и тем,что автоматически решит пункт 1. smile

P.S. Короче,если кому пригодится - отлично. smile

Re: liquidsoap

Кстати,подумалось,что если вдруг надо джинглы подгружать динамически,то это отличный метод - потому что из php файла можно подключаться например к mysql и оттуда вычитывать,что будем отдавать. А чтобы можно было динамически включать/отключать проигрывание,то опять же,можно задать вызов php-файла хоть каждую минуту и в случае,если пока играть ничего не надо,отдавать пустоту.
Ну это так,просто теоретизирование. smile

Re: liquidsoap

А,еще вопрос возник - иногда (непредсказуемо) бывает, что один mp3 не доигрывает до конца и запускается новый. В логах ничего на эту тему не пишется,все как будто штатно,но трек обрывается за пару секунд до своего конца и начинается следующий - это банально слышно ушами. sad

755

Re: liquidsoap

пишет БлядскоеВК:

А,еще вопрос возник - иногда (непредсказуемо) бывает, что один mp3 не доигрывает до конца и запускается новый. В логах ничего на эту тему не пишется,все как будто штатно,но трек обрывается за пару секунд до своего конца и начинается следующий - это банально слышно ушами. sad

Проверьте свойство трека.
Битрейд должен быть постоянный а не переменный.
Из-за этого могут возникать таки проблемы

Windows 2003 Server --> Digispot Djin --> CDDXP(TuneInSender) --> Edcast --> IceCast

Re: liquidsoap

пишет ubuntu-studio:

Битрейд должен быть постоянный а не переменный.
Из-за этого могут возникать таки проблемы

Я вначале тоже на это подумал. smile
Постоянный...

757

Re: liquidsoap

Возможно трек "битый", бывает что даже не все плееры видят это и играют его нормально

Re: liquidsoap

Все,народ,вопрос снят,извините. smile
Проблема оказалась в браузерном проигрываетеле - на некоторых компах иногда бывают глюки. Сам поток идет отличный,нареканий нет.
Пойду искать на вашем форуме,если есть,ветку про Uppod - проблема таки в нем.

А ликвидсуп однозначно рулит. smile

P.S. Всем приятных выходных!! smile

759

Re: liquidsoap

Приветствую. Скажите, как лучше сделать:
на одном серве стоит суп, на другом музыка. Как забирать супом с другого серва?
Через что лучше? фтп, смб или еще что-то?

BelRadio - радио Белгорода online

Меняюсь ссылками, баннерами на главной и внутренних, пишите в ЛС

760

Re: liquidsoap

пишет aPhone:

Приветствую. Скажите, как лучше сделать:
на одном серве стоит суп, на другом музыка. Как забирать супом с другого серва?
Через что лучше? фтп, смб или еще что-то?

можно по сети подмонтировать папку одного сервера к другой.

761

Re: liquidsoap

Через FTP не получится. Если среди машин есть винда - то да, лучше SMB. Если нету - лучше NFS. Если не в локальной сети - гонять это под openVPN.

762

Re: liquidsoap

Умеет ли это мыло брать имя артиста и название трека из файла и обновлять по эти данным метадату для потоков, к примеру каждые 10сек?

Radiodev - coming soon.

763

Re: liquidsoap

Брать из файла умеет, но обновлять по времени - незнаю как

764

Re: liquidsoap

пишет tarasian666:

Брать из файла умеет, но обновлять по времени - незнаю как

Интересно было бы узнать на примере "как" умеет smile

Radiodev - coming soon.

765

Re: liquidsoap

http://savonet.sourceforge.net/on2_part2.html
Custom metadata

766

Re: liquidsoap

Ребята, использую в данный момент liquidsoap для перекодирования потока mp3 в aac+ и ogg.
Всё нормально, но у OGG есть такая особенность, если его воспроизводить в популярных браузерах и некоторых клиентах, то при смене тэга, клиент считает что поток прервался и не переподключается. Исходя из логов liquidsoap поток действительно обрывается и начинается заново.

Вопрос: Как принудительно отключить вывод тэгов у OGG потока?

Вот что имеем на данный момент:

Конфиг

#!/usr/bin/liquidsoap
# Log dir
set("log.file.path","/var/log/liquidsoap/basic.log")
set("log.stdout",true)
set("log.level",4)
url=mksafe(input.http("ht.tp://xxx:8000/mp3"))

#AAC+
output.icecast(%aacplus(channels=2, samplerate=44100, bitrate=64),
        mount = "aac",
        host = "localhost", port = 8000, password = "hackme",
        genre="Rock",
        description="Rock, Ukrainian Rock",
        name="xxx Rock",
        url="xxx",
url)

#OGG
output.icecast(%vorbis (channels=2, samplerate=44100, quality=0.4),
        icy_metadata="false",
        mount = "liqogg",
        host = "localhost", port = 8000, password = "hackme",
        genre = "Rock",
        description = "Ogg 128kb\s",
        name = "Ogg 128kb\s",
        url = "xxx",
url)

Лог, который собственно и говорит нам о том что поток действительно обрывается

2012/12/30 17:48:47 [ht.tp_4618:4] End of track.
2012/12/30 17:48:47 [ogg.muxer:4] liqogg: Setting end of track 309b8ec1.
2012/12/30 17:48:47 [ogg.muxer:4] liqogg: Every ogg logical tracks have ended: setting end of stream.
2012/12/30 17:48:47 [ogg.muxer:4] liqogg: Starting new sequentialized ogg stream.
2012/12/30 17:48:47 [ogg.muxer:4] liqogg: Starting all streams
2012/12/30 17:51:43 [ht.tp_4618:3] New metadata chunk: ? -- Nemo - Р~Sлубина.
2012/12/30 17:51:47 [ht.tp_4618:4] End of track.
2012/12/30 17:51:47 [ogg.muxer:4] liqogg: Setting end of track 1982f4c8.
2012/12/30 17:51:47 [ogg.muxer:4] liqogg: Every ogg logical tracks have ended: setting end of stream.
2012/12/30 17:51:47 [ogg.muxer:4] liqogg: Starting new sequentialized ogg stream.
2012/12/30 17:51:47 [ogg.muxer:4] liqogg: Starting all streams
2012/12/30 17:55:27 [ht.tp_4618:3] New metadata chunk: ? -- JAM ROLL - Р~WдравсС~BРІСѓР№, Р~RРѕС~B Рё СЏ.
2012/12/30 17:55:31 [ht.tp_4618:4] End of track.
2012/12/30 17:55:31 [ogg.muxer:4] liqogg: Setting end of track 32b87d6e.
2012/12/30 17:55:31 [ogg.muxer:4] liqogg: Every ogg logical tracks have ended: setting end of stream.
2012/12/30 17:55:31 [ogg.muxer:4] liqogg: Starting new sequentialized ogg stream.
2012/12/30 17:55:31 [ogg.muxer:4] liqogg: Starting all streams

Из документации понял что достаточно строки

icy_metadata="false"

в вещателе, но увы, в конфиге есть, но изменений нет.

767

Re: liquidsoap

drop_metadata

768

Re: liquidsoap

tarasian666, куда прописать?

769

Re: liquidsoap

в конфиг )

http://savonet.sourceforge.net/doc-svn/ … p_metadata

770

Re: liquidsoap

Таким образом я отрежу тэги и на aac+ потоке, а мне это не к чему.
Тем более по вашей же ссылке, на сколько я понял, тэги обрезаются только когда воспроизводятся файлы, у меня же input http

Отредактировано dimetrius (30-12-2012 19:18:23)

771

Re: liquidsoap

если правильно вставить то нет

772

Re: liquidsoap

Так сложно на примере моего конфига показать куда именно прописать?

773

Re: liquidsoap

А можно сделать несколько плейлистов, чтобы они выполнялись строго по условию:
Плейлист 1 - воспроизводит музыку из папки "2222", через каждые 2 трека джинглы
Плейлист - 2 рекламный,

1. Запуск Плейлиста 2 в ХХ:30 - проигрывание всех треков из папки "1111" -
2. Запуск основного плейлиста 1.

?????

Отредактировано Апекс (30-12-2012 19:30:36)

774

Re: liquidsoap

пишет dimetrius:

Так сложно на примере моего конфига показать куда именно прописать?

так сложно почитать разок документацию?

output.icecast(%vorbis (channels=2, samplerate=44100, quality=0.4),
        icy_metadata="false",
        mount = "liqogg",
        host = "localhost", port = 8000, password = "hackme",
        genre = "Rock",
        description = "Ogg 128kb\s",
        name = "Ogg 128kb\s",
        url = "xxx",
drop__metadata(url))

Апекс можно

775

Re: liquidsoap

tarasian666, спасибо, но...
прописал в параметры вывода OGG, а по факту обрезались тэги на обоих потоках.

UPD. Заметил что на AAC+ потоке тэги иногда есть, но не всегда. Хотя в потоке, который перекодируется, тэги есть.

Вот что в конфиге на данный момент

#!/usr/bin/liquidsoap

# Log dir
set("log.file.path","/var/log/liquidsoap/basic.log")
set("log.stdout",true)
set("log.level",4)

# Input HT.TP
url=mksafe(input.ht.tp("ht.tp://ua.xxx.net:8000/mp3"))

#AAC+
output.icecast(%aacplus(channels=2, samplerate=44100, bitrate=64),
        mount = "aac",
        host = "localhost", port = 8000, password = "hackme",
        genre="Rock",
        description="xxx",
        name="xxx",
        url="ht.tp://xxx.net",
url)

#OGG
output.icecast(%vorbis (channels=2, samplerate=44100, quality=0.4),
        mount = "ogg",
        host = "localhost", port = 8000, password = "hackme",
        genre = "Rock",
        description = "xxx",
        name = "xxx",
        url = "ht.tp://xxx.net",
drop_metadata(url))

Отредактировано dimetrius (30-12-2012 21:57:03)