
用 Liquidsoap 脚本 10 行搭起一个网络电台【免费下载链接】liquidsoapLiquidsoap is a statically typed scripting general-purpose language with dedicated operators and backend for all thing media, streaming, file generation, automation, HTTP backend and more.项目地址: https://gitcode.com/gh_mirrors/li/liquidsoap跑一个小网络电台只需要一个 Liquidsoap 进程不必堆一整套媒体服务器组件。Liquidsoap 是面向媒体流处理的脚本语言从播放列表读歌、做交叉淡入淡出、编码、推流到 Icecast 或 HLS。全部写在一个几十行的 .liq 脚本里文件坏了流也不断。它解决什么问题Liquidsoap 是一个通用的音视频流生成器核心抽象是源source一条正在播放的数据流。你用源构造函数playlist 等造出源再用切换、过渡算子fallback、crossfade 等把它们组合最后交给某个输出output.*数据出口按某种编码推出去。不用自己写调度、编码、断线重连这些底层逻辑直接摆算子就行一个进程还能同时输出 MP3、Ogg、HLS 等多种编码。 5 分钟跑起来有 Docker 的话一条命令拉官方镜像docker pull savonet/liquidsoap:v2.3.1在当前目录放一个 music.m3u每行一个文件路径和一个 radio.liqmusic playlist(/data/music.m3u) output.file(/data/out.mp3, %ffmpeg(formatmp3, %audio(b128k)), mksafe(music))把播放列表读出来整份编码成 MP3 落盘。docker run --rm -v $(pwd):/data savonet/liquidsoap:v2.3.1 /data/radio.liq挂载当前目录进容器执行脚本。跑完后目录里会多出一个能播放的 out.mp3——播放列表被从头播了一遍并编码写入这就是最小可运行的 Liquidsoap 流。 核心机制一图看懂Liquidsoap 脚本就是一张数据流图数据从源比如 playlist出发经过一串算子单向流动mksafe 是保活算子源坏了就补静音避免输出静默中断最后由输出持续拉走、编码、发出去。整条链上只有一个方向输出驱动源被动拉数据。图crossfade 两轨音量切换曲线上图是两首歌做交叉淡入淡出时的音量曲线旧曲old track淡出、新曲new track淡入中间交叉。整个过渡只由一个算子 crossfade 完成你不需要写任何音频插值代码。三个高频场景把播放列表变成 24 小时网络电台最常用随机播音乐、偶尔插一段台呼、轨与轨之间交叉淡化推给 Icecast 服务器。music playlist(/data/music.m3u) jingles playlist(/data/jingles.m3u) radio random([jingles.{weight 1}, music.{weight 4}]) radio crossfade(radio) output.icecast(%vorbis, hostlocalhost, port8000, passwordhackme, mountradio.ogg, mksafe(radio))平均每四首歌插一段台呼整条流以 Ogg 编码输出。踩坑提示Icecast 的 password 要用 icecast.xml 里的 source 密码来源密码不是 admin 密码用错会连接失败反复重连。想让玩家在浏览器里直接听再加一路 HLS 输出即可。输出 HLS 给网页播放HLS 是走 HTTP 的小分段.ts流式协议适合网页播放器。output.file.hls(/data/hls, [(aac, %ffmpeg(formatmpegts, %audio(codecaac, b128k)))], mksafe(playlist(/data/music.m3u)))m3u8 和 ts 分段文件会写进 /data/hls。踩坑提示hls 目录必须挂在一个 HTTP 服务nginx、caddy 等下才能被播放器访问忘了这一步播放器只会显示空白。音频场景聊完了下面看看直播进来怎么办。直播输入断了自动回退直播流随时可能断用 fallback 在直播和自动播放之间自动切换。live input.http(http://localhost:8000/live.aac) auto playlist(/data/music.m3u) output.icecast(%vorbis, hostlocalhost, port8000, passwordhackme, mountlive.ogg, fallback([live, mksafe(auto)]))直播恢复后会自动接管回来。踩坑提示fallback 的最后一个源必须不会断auto 是 fallible 的记得包一层 mksafe。 踩坑与排障现象启动就报That source is fallible!→原因output 不接受可能断流的源普通 playlist 就是 fallible 的 →解法mksafe(源)或fallback([源, single(backup.ogg)])包一层。现象跑脚本报一串 type error提到 int 和 float →原因类型严格无小数点的数字默认是 int →解法写小数点比如13.而不是13。现象日志刷We must catchup x.xx!输出不断被重置 →原因内部时钟落后通常是多路编码同时跑把 CPU 打满 →解法减少并行编码路数或让多个输出共享一次编码doc/content/cookbook.md 的 Transitions/Encoding 章节有现成写法。现象Unable to decode file→原因文件内容与期望媒体类型不符比如给要求视频的算子塞了纯音频文件 →解法先用ffprobe 文件确认它包含期望的音/视频轨。能延伸做什么元数据与回调on_track、metadata.map 让你在每首歌切换时跑自定义逻辑发通知、写数据库细节见 doc/content/metadata.md。按时段编排switch 配合谓词可以按钟点切换不同播放列表doc/content/scheduling.md 里有完整示例。视频流处理字幕叠加、水印、转码都支持参考 doc/content/video.md。图测试样例的视频字幕叠加效果继续深入先把 doc/content/quick_start.md 通读一遍然后照着 doc/content/liq/ 目录里的示例脚本逐个跑从 basic-radio.liq 开始每改一个参数观察一次行为。再往后按需求翻 doc/content/cookbook.md 和 doc/content/faq.md 解决具体问题。卡住的时候把报错原文去 faq.md 里搜一遍常见错误基本都有对应条目和修法。【免费下载链接】liquidsoapLiquidsoap is a statically typed scripting general-purpose language with dedicated operators and backend for all thing media, streaming, file generation, automation, HTTP backend and more.项目地址: https://gitcode.com/gh_mirrors/li/liquidsoap创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考