Liquidsoap:从外部脚本读取下一个音频时无需预排队

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 中,当当前音频还剩 10 秒时,它会运行 PHP 脚本。换句话说,当还剩 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)

相关内容