如何用Liquidsoap检测Icecast MP3流BPM并定时保存至本地文件?
使用Liquidsoap检测Icecast MP3流BPM并定时写入文件的解决方案
1. 更新Dockerfile以添加依赖
Liquidsoap的BPM检测功能依赖libsoundtouch库,官方镜像可能未预装,需在Dockerfile中添加安装步骤:
FROM savonet/liquidsoap:8101608 # 安装BPM检测所需的依赖库 RUN apt-get update && apt-get install -y --no-install-recommends \ libsoundtouch1 \ && rm -rf /var/lib/apt/lists/* # 复制脚本到镜像内 COPY script.liq /usr/src/app/script.liq # 启动命令 CMD ["liquidsoap", "/usr/src/app/script.liq"]
2. 编写Liquidsoap脚本(script.liq)
脚本需完成三个核心操作:拉取Icecast流、检测BPM、每10秒写入文件:
# 替换为你的Icecast流地址 stream_url = "http://你的Icecast服务器地址:端口/流路径.mp3" # 拉取Icecast流 input_stream = input.http(stream_url) # 启用BPM检测(检测结果会附加到流的元数据中) bpm_stream = bpm(input_stream) # 定义写入BPM到文件的函数 def write_bpm() = # 获取当前流的元数据 current_meta = source.metadata(bpm_stream) # 提取BPM值(未检测到时显示N/A) bpm_val = list.assoc("bpm", current_meta, "N/A") # 写入到本地文件(每次覆盖内容) file.write("/usr/src/app/current_bpm.txt", bpm_val ^ "\n") end # 设置定时任务:每10秒执行一次写入操作 thread.run.every(10., write_bpm) # 保持流处理活跃(Liquidsoap要求至少有一个输出才能维持源运行) output.dummy(bpm_stream)
关键说明
- BPM检测需要一定的音频数据积累,前几次写入可能显示
N/A,等待数秒后会输出有效数值。 - 若需要持久化保存BPM文件,可在Docker运行时挂载本地目录到
/usr/src/app/,避免容器销毁后丢失数据。 output.dummy仅用于维持流的处理进程,不会重新广播流;若需要转发处理后的流,可替换为output.icecast等输出模块。
内容的提问来源于stack exchange,提问作者Jannik
相关产品推荐
相关产品推荐

