Liquidsoap: нет предварительной очереди при чтении следующего аудио из внешнего скрипта.

Я изучаю Liquidsoap, чтобы попытаться заменить им мой нынешний SAM Broadcaster. Поэтому я пытаюсь воспроизвести то же самое функционирование.

Мои аудио получаются из PHP-скрипта, который выполняет всю логику управления джинглами, песнями, рекламными роликами, смешанными сетами и т. д. Мой скрипт возвращает только одну строку, например: /songs/820.mp3 или /jingles/id1.mp3

В LS я использую «request.dynamic.list», и мне удалось получить файл сценария PHP. Недавно я узнал, что request.dynamic.list фактически добавляет в очередь «следующую песню». Таким образом, в очереди всегда будет аудио. Когда файл действительно воспроизводится, выполнение PHP добавляет «следующий» в очередь, и это вызывает у меня проблемы (например, шоу, которое должно начинаться ровно в 8 вечера).

      [11-Oct-2021 19:23:34] Generator: /mnt/2869.mp3 <------ request.dynamic.list to queue
[11-Oct-2021 19:23:34 ] Notify: /mnt/626.mp3 <------- actual song (read before), from on_metadata
[11-Oct-2021 19:27:19] Generator: /mnt/623.mp3 <-------- finished "626"
[11-Oct-2021 19:27:19] Notify: /mnt/2869.mp3 <-------- new song starting, but the PHP script for it ran 4 minutes before...

Я обнаружил, что в request.dynamic.list есть параметр «prefetch». Видимо это то, что мне нужно, никакой расширенной очереди.

      source = request.dynamic.list(prefetch=0,get_music)

Работает (думаю), но теперь не знаю как, только при первом запуске добавить в очередь первый звук :)

В SAM он запускает PHP-скрипт, когда до окончания текущего звука остается 10 секунд. Другими словами, когда остается 10 секунд, он запускает сценарий, буферизует следующий MP3 и затухает (что никогда не превышает 5 секунд, поэтому это работает).

Все локально, поэтому PHP-скрипт возвращается за миллисекунды и является безошибочным.

Я хотел сделать что-то подобное. Есть идеи, как лучше всего воспроизвести поведение SAM? Большое спасибо!!

1 ответ

После нескольких часов чтения и тестирования я нашел способ добиться того же функционирования.

Вот (я не уверен, что код хорошо оптимизирован, любые советы приветствуются). Для LiquidSoap 2.x.

      musics = request.dynamic.list(prefetch=0,fun()->[])

radio = musics
radio = cue_cut(radio)
radio = crossfade(fade_in=0.,fade_out=0.,radio)
radio = mksafe(radio)
radio = fallback(track_sensitive=false,[radio])

def analis() =
  rest=source.remaining(radio)
  if rest!=infinity and rest<10. and list.length(musics.queue())==0 then
     nov=process.read("/bin/php /root/generator.php")
     ignore(musics.add(request.create(nov)))
  end
  3.
end

thread.run.recurrent(delay=0.,analis)
Другие вопросы по тегам