You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Liquidsoap对接Icecast时,PLS文件中HTTP音频源无法工作的问题

解决Liquidsoap加载PLS文件中HTTP音频源的问题

我来帮你排查这个问题——你遇到的核心问题是PLS文件格式不符合规范,加上Liquidsoap的playlist.safe在解析格式错误的PLS时触发了内部断言错误,导致流媒体启动失败。我们一步步来解决:

问题根源分析

首先看你的PLS文件内容:

[playlist]
File2=http://media.friskyradio.com.s3.amazonaws.com/2dc/2DCAnni_1Yr_Rob_Keith_003.mp3
NumberOfEntries=4

这里有两个明显的格式错误:

  1. PLS规范要求条目从File1开始编号,你直接用了File2,缺少起始条目;
  2. NumberOfEntries=4声明了4个条目,但实际只有1个URL,数量不匹配。

这种格式错误会导致Liquidsoap的PLS解析器出错,触发日志里的Assertion failed!(来自sources/playlist.ml),进而导致整个流启动失败。另外,你脚本里还有个小问题:jingles_pls变量在使用前没有定义,这也会引发错误。

修复步骤

1. 修正PLS文件格式

按照PLS标准规范调整你的文件,确保条目编号从File1开始,且NumberOfEntries和实际条目数一致。比如如果只有1个音频源,修改为:

[playlist]
File1=http://media.friskyradio.com.s3.amazonaws.com/2dc/2DCAnni_1Yr_Rob_Keith_003.mp3
NumberOfEntries=1

如果有多个源,补全File1到FileN,并同步修改NumberOfEntries的值。

2. 调整Liquidsoap脚本

先修正脚本里未定义的变量问题,然后优化PLS加载逻辑:

# 修正变量名与值的匹配(可选,避免混淆)
classic_mp3_high_mount = "classic_aac_low"
classic_pls_path = "./pls/classic.pls"
# 确保jingles_pls先定义(比如指定路径)
jingles_pls_path = "./pls/jingles.pls"

set("server.telnet", true)
set("log.file.path", "./log/streaming.log")

classic_request = request.queue(id="classic_queue")
# 显式指定PLS的MIME类型,避免自动检测出错
classic_pls = playlist.safe(mode="normal", mime_type="audio/x-scpls", classic_pls_path)
jingles_pls = playlist.safe(mode="random", mime_type="audio/x-scpls", jingles_pls_path)

classic_stream = fallback([classic_request, classic_pls, jingles_pls])
aac_low_out = output.icecast(%mp3(bitrate=320), 
                             host=host, 
                             mount=classic_mp3_high_mount, 
                             port=port, 
                             password=password, 
                             classic_stream)

3. 替代方案:手动解析PLS(如果上述方法仍有问题)

如果Liquidsoap的PLS解析器还是对远程URL处理有问题,可以手动读取PLS文件提取URL,再用input.http或动态播放列表加载:

classic_pls_path = "./pls/classic.pls"

# 读取PLS文件并提取所有URL
pls_content = file.read(classic_pls_path)
# 过滤出以File开头的行,分割出URL部分
urls = list.map(
  fun(line) -> string.split(separator="=", line).2,
  list.filter(
    fun(line) -> string.starts_with(line, "File"),
    string.split(separator="\n", pls_content)
  )
)

# 使用提取的URL创建播放列表
classic_pls = playlist(urls, mode="normal")

这种方法绕过了Liquidsoap内置的PLS解析器,直接用原始URL构建播放列表,更适合远程音频源的场景。

验证效果

修正后重新启动Liquidsoap,日志应该不会再出现断言错误,PLS里的HTTP音频源会正常加载播放。如果还有问题,可以检查Icecast连接参数,或者用input.http()单独测试PLS里的URL是否能正常播放,排除源本身的问题。

内容的提问来源于stack exchange,提问作者Anton Bohomaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:09:52