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)