使用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
这里有两个明显的格式错误:
- PLS规范要求条目从
File1开始编号,你直接用了File2,缺少起始条目; 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
相关产品推荐
相关产品推荐

