MainRadiotalkCustom
Общие вопросы по интернет радио вещанию
6   •   Посмотреть все темы

Liquidsoap: Buffer emptied, buffering needed

 

419
gyurgin_ @gyurgin_
Самое простое что в голову пришло - ставим mplayer apt-get install mplayer и как то так: http_live = input.external(restart=true, restart_on_error=true, buffer=0.2, max=10., "mplayer -really-quiet -format s16le -ao pcm:file=/dev/stdout -vc null -vo null 'http://regress78.com:8025/source.mp3' 2>/dev/null") или url = "http://regress78.com:8025/source.mp3"
http_live = input.external(restart=true, restart_on_error=true, buffer=0.2, max=10., "mplayer -really-quiet -format s16le -ao pcm:file=/dev/stdout -vc null -vo null #{quote(url)} 2>/dev/null")
чтобы не напутать с экранированием url, хотя если url прямой то можно и не экранировать, это я больше по привычке.
Я бы лично использовал ffmpeg, но как ставить его и от дистрибутива зависит и от потребностей конечных, а так - по той же схеме: http_live = input.external(restart=true, restart_on_error=true, buffer=0.2, max=10., "ffmpeg -i #{quote(url)} -f wav - ")
Да, прошу обратить внимание - тогда точно надо строить конфиг по той схеме что у Вас была первоначально, ну оно и понятно - внешнему плееру пофиг, есть или нет поток, задача есть - он работает.

96
solariz @solariz
К сожалению обрывы все равно происходят. даже чаще, чем прежде. (
Привожу лог-файл и полный конфиг тестового сервера, где всё это безобразие и происходит.
**********

419
gyurgin_ @gyurgin_
Да ну, зачем этот тройной fallback, harbor.input выкинуть, оставить live_http, операции с метаданными навесить можно на него, поток формируем так: radio = mksafe(fallback(track_sensitive=false, transitions=[src_Xfade, src_Xfade], [
strip_blank(max_blank=10., threshold=-45., live_http),
music
]))

Да, mplayer прекрасно скушает ogg, если надо конечно, у меня просто для проверки под рукой чтоб быстро включить был только Traktor.
Для начала давайте так пробовать.

96
solariz @solariz
gyurgin_ пишет:

Да ну, зачем этот тройной fallback, harbor.input выкинуть, оставить live_http,

да это без проблем, просто с самого начала так и было...

Сейчас все это сделал: обрывы остаются, логи в файле.
**********

419
gyurgin_ @gyurgin_
Я вобще не вижу работы input.external, что то в этом роде должно быть 2016/11/04 19:13:22 [source:4] Source input.external_13770 gets up.
2016/11/04 19:13:22 [input.external_13770:3] Starting process
.

96
solariz @solariz
input.external есть. вот, прилагаю лог с началом работы до самого сбоя:
**********

419
gyurgin_ @gyurgin_
Вот оно как оказывается))
Надо попробовать отключить запись для начала, где то я такое уже видел, в другом немного обличье, но не суть...
И что за железо, какой liquidsoap, чего я сразу не спросил, ума не приложу.

96
solariz @solariz
gyurgin_ пишет:

Вот оно как оказывается))
Надо попробовать отключить запись для начала, где то я такое уже видел, в другом немного обличье, но не суть...
И что за железо, какой liquidsoap, чего я сразу не спросил, ума не приложу.

Запись отключил - все равно разрывы: **********

Hetzner:2 vCores/2GB/Ubuntu 16.04
Liquidsoap 1.2.1+scm (git://github.com/savonet/liquidsoap.git@5868347049c598a4984b91a410cc2d9efae7ebc2:20160811:152237)

Типичная картина загрузки:

419
gyurgin_ @gyurgin_
Да вроде нормально все, однако в логах вот 2016/11/04 19:38:43 [source:4] Garbage collected add_9285.
2016/11/04 19:38:43 [source:4] Garbage collected fade_out_9284.
2016/11/04 19:38:43 [source:4] Garbage collected sequence_9283.
2016/11/04 19:38:43 [source:4] Garbage collected fade_in_9282.
2016/11/04 19:38:43 [source:4] Garbage collected blank_9281.
2016/11/04 19:38:43 [source:4] Garbage collected replay_metadata_9280.
2016/11/04 19:38:43 [source:4] Garbage collected empty_9279.
2016/11/04 19:48:40 [input.external_9181:4] End of track.

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

96
solariz @solariz
вот без ladspa обрыв: **********

419
gyurgin_ @gyurgin_
Пошаманил немного, вот что получилось radio = audio_to_stereo(request.dynamic(
id="STREAM_PLAY", {request.create(
"bar:foo", indicators=get_process_lines("/usr/bin/perl /home/solariz/getsong.pl"))})
)
radio = crossfade(start_next=3.,fade_out=2.,fade_in=1.,radio)
url = "http://regress78.com:8025/source.mp3" # если айскаст местный то ********** будет лучше
live_http = input.http(id="Live_Input", buffer=.1, max=5., new_track_on_metadata=true, poll_delay=1., timeout=1., url)
live_http = buffer.adaptative(buffer=.2, limit=3., max=10., reset=true, mksafe(live_http))
live_http = strip_blank(max_blank=5., threshold=-45., min_noise=.3, live_http)
radio = fallback(track_sensitive=false, transitions=[src_Xfade, src_Xfade], [live_http, radio])
radio = ladspa.fastlookaheadlimiter(input_gain=0.0, limit=-2.5, release_time=2.0, radio)
radio = mksafe(ladspa.dysoncompress(release_time=1.0, radio))

Добавил buffer.adaptative, он экспериментальный и с input.harbor завалит весь скрипт, с input.external использовать можно, но http шустрее будет. Далее, важнейший параметр для strip_blank: "min_noise" - предохраняет от ложных срабатываний, в общем без него тоже "детский сад", потом, music убрал, сразу radio - меньше sources - меньше нагрузка, ну ги де-то что-то по мелочи.
В общем, пробуем - надо этот шайтан конфиг добивать уже))

96
solariz @solariz
С этим дьявольским buffer.adaptive прерываний не замечено, но зато явно слышны артефакты, так как с потоком все равно беда...
Ниже приведена часть лога во время проигрывания песни:

2016/11/05 09:25:58 [source:4] Source blank_9299 gets down.
2016/11/05 09:26:00 [source:4] Garbage collected add_9280.
2016/11/05 09:26:00 [source:4] Garbage collected fade_out_9279.
2016/11/05 09:26:00 [source:4] Garbage collected sequence_9278.
2016/11/05 09:26:00 [source:4] Garbage collected fade_in_9277.
2016/11/05 09:26:00 [source:4] Garbage collected blank_9276.
2016/11/05 09:26:00 [source:4] Garbage collected empty_9275.
2016/11/05 09:30:09 [decoder.ogg:5] Reached last page of logical stream 100f8fca
2016/11/05 09:30:09 [decoder.ogg:5] All data from stream 100f8fca has been decoded
2016/11/05 09:30:09 [decoder.ogg:5] Found a ogg logical stream, serial: 6590700b
2016/11/05 09:30:09 [decoder.ogg:5] Trying ogg/flac format
2016/11/05 09:30:09 [decoder.ogg:5] Trying ogg/speex format
2016/11/05 09:30:09 [decoder.ogg:5] Trying ogg/dirac (schroedinger implementation) format
2016/11/05 09:30:09 [stderr:3] notification: Speex header too small
2016/11/05 09:30:09 [decoder.ogg:5] Trying ogg/theora format
2016/11/05 09:30:09 [decoder.ogg:5] Trying ogg/vorbis format
2016/11/05 09:30:09 [decoder.ogg:5] ogg/vorbis format detected for stream 6590700b
2016/11/05 09:30:11 [Live_Input:4] End of track.
2016/11/05 09:35:02 [Live_Input:4] End of track.
2016/11/05 09:35:02 [Live_Input:4] Buffer emptied, buffering needed.
2016/11/05 09:35:02 [mksafe:3] Switch to safe_blank with forgetful transition.
2016/11/05 09:35:02 [Live_Input:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:35:02 [safe_blank:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:35:02 [mksafe:3] Switch to Live_Input with transition.
2016/11/05 09:35:02 [safe_blank:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:35:02 [Live_Input:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:35:03 [source:4] Garbage collected empty_9314.
2016/11/05 09:35:40 [Live_Input:4] End of track.
2016/11/05 09:35:40 [Live_Input:4] Buffer emptied, buffering needed.
2016/11/05 09:35:40 [mksafe:3] Switch to safe_blank with forgetful transition.
2016/11/05 09:35:40 [Live_Input:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:35:40 [safe_blank:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:35:40 [mksafe:3] Switch to Live_Input with transition.
2016/11/05 09:35:40 [safe_blank:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:35:40 [Live_Input:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:35:45 [source:4] Garbage collected empty_9315.
2016/11/05 09:36:13 [decoder.ogg:5] Reached last page of logical stream 6590700b
2016/11/05 09:36:14 [decoder.ogg:5] All data from stream 6590700b has been decoded
2016/11/05 09:36:14 [decoder.ogg:5] Found a ogg logical stream, serial: 15014acb
2016/11/05 09:36:14 [decoder.ogg:5] Trying ogg/flac format
2016/11/05 09:36:14 [decoder.ogg:5] Trying ogg/speex format
2016/11/05 09:36:14 [decoder.ogg:5] Trying ogg/dirac (schroedinger implementation) format
2016/11/05 09:36:14 [stderr:3] notification: Speex header too small
2016/11/05 09:36:14 [decoder.ogg:5] Trying ogg/theora format
2016/11/05 09:36:14 [decoder.ogg:5] Trying ogg/vorbis format
2016/11/05 09:36:14 [decoder.ogg:5] ogg/vorbis format detected for stream 15014acb
2016/11/05 09:36:14 [Live_Input:4] End of track.
2016/11/05 09:36:20 [Live_Input:4] End of track.
2016/11/05 09:36:20 [Live_Input:4] Buffer emptied, buffering needed.
2016/11/05 09:36:20 [mksafe:3] Switch to safe_blank with forgetful transition.
2016/11/05 09:36:20 [Live_Input:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:36:20 [safe_blank:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:36:21 [mksafe:3] Switch to Live_Input with transition.
2016/11/05 09:36:21 [safe_blank:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:36:21 [Live_Input:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:36:21 [source:4] Garbage collected empty_9316.
2016/11/05 09:36:44 [Live_Input:4] End of track.
2016/11/05 09:36:44 [Live_Input:4] Buffer emptied, buffering needed.
2016/11/05 09:36:44 [mksafe:3] Switch to safe_blank with forgetful transition.
2016/11/05 09:36:44 [Live_Input:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:36:44 [safe_blank:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:36:44 [mksafe:3] Switch to Live_Input with transition.
2016/11/05 09:36:44 [safe_blank:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:36:44 [Live_Input:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:36:48 [Live_Input:4] End of track.
2016/11/05 09:36:48 [Live_Input:4] Buffer emptied, buffering needed.
2016/11/05 09:36:48 [mksafe:3] Switch to safe_blank with forgetful transition.
2016/11/05 09:36:48 [Live_Input:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:36:48 [safe_blank:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:36:48 [mksafe:3] Switch to Live_Input with transition.
2016/11/05 09:36:48 [safe_blank:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:36:48 [Live_Input:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:36:49 [source:4] Garbage collected empty_9318.
2016/11/05 09:36:49 [source:4] Garbage collected empty_9317.
2016/11/05 09:36:59 [Live_Input:4] End of track.
2016/11/05 09:36:59 [Live_Input:4] Buffer emptied, buffering needed.
2016/11/05 09:36:59 [mksafe:3] Switch to safe_blank with forgetful transition.
2016/11/05 09:36:59 [Live_Input:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:36:59 [safe_blank:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:36:59 [mksafe:3] Switch to Live_Input with transition.
2016/11/05 09:36:59 [safe_blank:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:36:59 [Live_Input:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:00 [Live_Input:4] End of track.
2016/11/05 09:37:00 [Live_Input:4] Buffer emptied, buffering needed.
2016/11/05 09:37:00 [mksafe:3] Switch to safe_blank with forgetful transition.
2016/11/05 09:37:00 [Live_Input:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:00 [safe_blank:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:00 [mksafe:3] Switch to Live_Input with transition.
2016/11/05 09:37:00 [safe_blank:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:00 [Live_Input:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:00 [Live_Input:4] End of track.
2016/11/05 09:37:00 [Live_Input:4] Buffer emptied, buffering needed.
2016/11/05 09:37:00 [mksafe:3] Switch to safe_blank with forgetful transition.
2016/11/05 09:37:00 [Live_Input:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:00 [safe_blank:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:00 [mksafe:3] Switch to Live_Input with transition.
2016/11/05 09:37:00 [safe_blank:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:00 [Live_Input:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:01 [Live_Input:4] End of track.
2016/11/05 09:37:01 [Live_Input:4] Buffer emptied, buffering needed.
2016/11/05 09:37:01 [mksafe:3] Switch to safe_blank with forgetful transition.
2016/11/05 09:37:01 [Live_Input:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:01 [safe_blank:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:01 [mksafe:3] Switch to Live_Input with transition.
2016/11/05 09:37:01 [safe_blank:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:01 [Live_Input:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:03 [source:4] Garbage collected empty_9322.
2016/11/05 09:37:03 [source:4] Garbage collected empty_9321.
2016/11/05 09:37:03 [source:4] Garbage collected empty_9320.
2016/11/05 09:37:03 [source:4] Garbage collected empty_9319.
2016/11/05 09:37:05 [Live_Input:4] End of track.
2016/11/05 09:37:05 [Live_Input:4] Buffer emptied, buffering needed.
2016/11/05 09:37:05 [mksafe:3] Switch to safe_blank with forgetful transition.
2016/11/05 09:37:05 [Live_Input:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:05 [safe_blank:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:05 [mksafe:3] Switch to Live_Input with transition.
2016/11/05 09:37:05 [safe_blank:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:05 [Live_Input:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:37:08 [source:4] Garbage collected empty_9323.
2016/11/05 09:37:28 [Live_Input:4] End of track.

419
gyurgin_ @gyurgin_
Так извините, он то что есть в буфере пытается натянуть на дырки, играйте с параметром limit.

96
solariz @solariz
а вот и переключение (

2016/11/05 09:51:29 [Live_Input:4] End of track.
2016/11/05 09:51:29 [Live_Input:4] Buffer emptied, buffering needed.
2016/11/05 09:51:29 [mksafe:3] Switch to safe_blank with forgetful transition.
2016/11/05 09:51:29 [Live_Input:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:51:29 [safe_blank:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:51:29 [mksafe:3] Switch to Live_Input with transition.
2016/11/05 09:51:29 [safe_blank:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:51:29 [Live_Input:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:51:30 [blank_9386:4] Activations changed: static=[], dynamic=[].
2016/11/05 09:51:30 [source:4] Source blank_9386 gets down.
2016/11/05 09:51:32 [source:4] Garbage collected empty_9401.
2016/11/05 09:51:35 [Live_Input:4] End of track.
2016/11/05 09:51:35 [Live_Input:4] Buffer emptied, buffering needed.
2016/11/05 09:51:35 [mksafe:3] Switch to safe_blank with forgetful transition.
2016/11/05 09:51:35 [Live_Input:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:51:35 [safe_blank:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:51:35 [mksafe:3] Switch to Live_Input with transition.
2016/11/05 09:51:35 [safe_blank:4] Activations changed: static=[], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:51:35 [Live_Input:4] Activations changed: static=[mksafe:buffer_9196:buffer_9196], dynamic=[mksafe:buffer_9196:buffer_9196].
2016/11/05 09:51:36 [source:4] Garbage collected empty_9402.

96
solariz @solariz
gyurgin_ пишет:

Так извините, он то что есть в буфере пытается натянуть на дырки, играйте с параметром limit.


да, сейчас поэкспеременитрую, конечно же.
А нет предположений, все же, почему в принципе такая ерунда происходит из-за удаленного управления? Хоть бы предположений...

419
gyurgin_ @gyurgin_
Да я уже давно ничем таким не пользуюсь, как минимум подсаживает канал который я так понимаю не особо жирный.

96
solariz @solariz
gyurgin_ пишет:


live_http = input.http(id="Live_Input", buffer=.1, max=5., new_track_on_metadata=true, poll_delay=1., timeout=1., url)
live_http = buffer.adaptative(buffer=.2, limit=3., max=10., reset=true, mksafe(live_http))

А почему такие маленькие значения buffer?
Такая идеология использования buffer.adaptative?

419
gyurgin_ @gyurgin_
Какая к черту идеология, опечатка блин)) Там где input.http в принципе так и задумывалось, а вот buffer.adaptative начинаем крутить от единицы, ну слушать надо, а то и двоить начнет.

96
solariz @solariz
А можем ли мы попытаться смоделировать ситуацию...
Ты писал, что у тебя traktor. Ты можешь подрубиться к компу, где стоит traktor откуда-нибудь тимвьювером или rdp или все равно чем и немного потранслировать на мой тестовый сервер?
А я логи посмотрю и поток послушаю...

на всякий случай:
telegram: **********
skype: solariz9

96
solariz @solariz
Итак на данном этапе разрывов нет. Зато имеют место быть артефакты. Даже без удаленного управления. Эксперементировал с разными значениями buffer и limit. Нормально работает только os x + traktor