我正在研究 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 行为的最佳方法是什么吗?非常感谢!!
经过几个小时的阅读和测试,找到了实现相同功能的方法。
这是(我不确定代码是否优化得很好,任何提示表示赞赏)。对于LiquidSoap 2.x。