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

liquidsoap

 

89
Azat @azatxaker
Настройка телнета есть в документации.

67
nivs @nivs
Не эти настройки. Чтобы было, чем управлять, надо с конфигом повозиться. Всякие там mix() , request.queue() и прочее, я про них говорю.

6245
Тарас @tarasian666
Всякие там mix() , request.queue() и прочее

они не имеют отношения именно к telnet, telnet просто управляет всем что вписано в конфиг. А что вписывать в конфиг документация есть

67
nivs @nivs
Я о том и говорю - чтобы было, чем управлять. Да, есть в документации, вот и буду тыкаться.

8
Денис @БлядскоеВК
Народ,во-первых спасибо за советы - я этот топик на тот момент весь прочитал,когда мне по работе пришлось столкнуться с liquidsoup'ом. Особенно спасибо tarasian666 - в основном в ваших постах находил ответы на все вопросы. Благодарю!

А теперь по сути - чего я зарегистрировался,собственно...

Не сталкивались ли вы с такой проблемой: все играет,все ОК,джинглы вставляются,плейлисты играются (правда,я там не средствами liquidsoup все сделал,а выдача треков у меня происходит через ображение к php-crhbgne),короче все прекрасно. Но возникла проблему,к которой я не знаю,с которой к этой проблеме подойти...

У меня играет около 10 каналов одновременно. Каждый кушает своих несколько процентов процессора. Но вот один из них внезапно начал зашкаливать. В процессе разборок выяснилось,что проблема в джинглах - их поставлено 12 штук (каждые пять минут играет другой джингл). Стартует этот поток на 10 процентах загрузки,за полчаса выростает до 50-60 и поток начинает тупить и тормозить. Перезапускать каждые полчаса liq-поток - плохая идея. :)

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

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

Может кто-то натолкнет на мысль? Надеюсь :)

P.S. Сорри за ник - форум взял его из Вконтакта (авторизировался через последнего),а поменять нельзя. :( Знал бы,не пользовался опенИД... :( Если модераторы смогут мне его помнять,скажу спасибо. :)

67
nivs @nivs
Ну первым в голову приходит именно пережатие. Если Liquidsoap на линуксе, то можно малюсенький скриптец написать, который бы парсил папку, куда пользователи складируют MP3, и делал перекодировку в папку, которую ест ваш создатель плейлистов. Лично я бы думал в эту сторону.

6245
Тарас @tarasian666
Чем больше разница битрейтов тем больше нагрузка, думаю тут nivs прав

8
Денис @БлядскоеВК
ОК,файлы пережали,однако ситуация изменилась настолько,что проблема с критичной загрузкой появляется не через полчаса,а через минут 40. :(

32
Kiss @Kiss
Простите за флуд,ник ЗАЧЕТ ))))))))

67
nivs @nivs
БлядскоеВК, подробнее про систему напишите. Какая ось, что, куда и как транслируется, что делаете с потоком, желательно весь конфиг. Как кодируете, через что?

8
Денис @БлядскоеВК
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 - знатоки,посмотрите на нее пожалуйста,потому что я происходящее в ней пока что очень слабо понимаю. :(

8
Денис @БлядскоеВК
Так как советов мне никто тут не дал,пришлось разбираться самому методом проб и ошибок. :)
Выкладываю результаты,вдруг у кого тоже будет подобная проблема.

В общем,как оказалось,все упирается в процедуру 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 передавать время. :)

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

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

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

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

398
ubuntu-studio @ubuntu-studio
БлядскоеВК пишет:

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


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

8
Денис @БлядскоеВК
ubuntu-studio пишет:

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

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

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

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

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

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

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

11
Sanka @Sanka
aPhone пишет:

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


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