资讯详情

Monibuca HLS 直播与点播实战:从TS分片到fMP4无缝播放

📅 2026/10/4 4:08:14 | 华诺云谱 👁 阅读
Monibuca HLS 直播与点播实战:从TS分片到fMP4无缝播放
Monibuca HLS 直播与点播实战从TS分片到fMP4无缝播放【免费下载链接】monibucaMonibuca简称 m7s是一款纯 Go 开发的开源流媒体服务器开发框架。项目地址: https://gitcode.com/langhuihui/monibucaMonibuca简称 m7s是一款纯 Go 开发的开源流媒体服务器其内置的HLS 插件能让任何进入服务器的流瞬间获得 HTTP Live Streaming 播放能力实时 TS 分片、内存滚动缓存、录像存储、按时间段点播还支持将录像导出为 fMP4 实现低首屏延迟的无缝播放。本文将带你从零理解 TS 分片原理到配置直播、拉流、录像再到时间范围点播与 fMP4 点播的完整实战路径。一、3 分钟看懂 HLS 直播原理HLSHTTP Live Streaming的核心思想非常直观把连续的音视频流切成一个个几秒长的 TS 文件Media Segment再用一个.m3u8播放列表文件记录这些分片的顺序和时长。播放器周期性拉取最新的 m3u8发现新分片就下载播放——这就是直播的由来。Monibuca 的实现完全遵循这套思路实时切片plugin/hls/pkg/writer.go 中的HLSWriter订阅流的音视频帧按配置的时长如 5s在关键帧处切开封装成标准 MPEG-TS内存缓存完成的分片放入滚动窗口默认保留 3 个已完成 1 个进行中分片请求 m3u8 时直接从内存返回零磁盘 IO播放列表plugin/hls/pkg/m3u8.go 按 RFC 8216 规范生成#EXTM3U、#EXT-X-VERSION、#EXTINF等标签无观众自动回收15 秒无人读取分片后切片任务自动停止释放内存。 Monibuca 采用核心 插件架构HLS 作为协议插件与 RTMP、RTSP、WebRTC 等并列任何协议的流进入服务器后都可以被任意协议的插件转封装输出。二、快速启动一条正则开启 HLS 直播HLS 插件的核心配置只有一个onpub.transform正则映射格式为{分片时长} x {窗口大小}hls: onpub: transform: ^live/.: 5s x 3 # live/ 开头的所有流5秒分片保留3个分片窗口这行配置生效后的效果配置项含义建议值5sTS 分片时长2~6s越短延迟越低3播放列表窗口已完成的分片数2~6越大越抗弱网配置完成后任何发布到live/xxx的流立即可通过以下地址播放http://{host}:8080/hls/live/xxx.m3u8直播列表http://{host}:8080/hls/live/xxx/{segment}.tsTS 分片内置播放器开箱即验Monibuca 在 plugin/hls/index.go 中把 hls.js 演示页面打包进了二进制无需任何额外部署http://{host}:8080/hls/index.html—— 全功能 Demohttp://{host}:8080/hls/basic-usage.html—— 入门示例http://{host}:8080/hls/metrics.html—— 延迟、缓冲等指标可视化浏览器打开即播是新手验证配置最快的方式 ✅流还没推上来用 timeout 等它上线请求 m3u8 时可附加?timeout30s参数插件会先内部订阅等待流上线最长 30 秒再返回播放列表避免流还没到、列表却是空的。处理逻辑见 plugin/hls/index.go 的ServeHTTP。三、拉取远端 HLS 流把别人家的直播变成自己的如果你要转推第三方平台的 HLS 流比如央视、地方电视台只需配置pull或在管理界面创建拉流任务hls: pull: live/apple-demo: url: https://example.com/stream.m3u8 relaymode: mix # remux默认重封装/ relay原样转发/ mix两者都要一个典型示例见 example/8080/pull_hls.yaml。拉流器会自动解析主播放列表、跟进多码率分支、下载最新 TS 分片并在 Monibuca 内重新发布为内部流——之后再走 RTMP、WebRTC 分发都畅通无阻。四、录像与点播按时间段回看直播4.1 启动录像两种姿势方式一配置式复用record配置hls: onpub: record: ^live/.: filepath: record/$0 # $0 自动替换为流路径 fragment: 1m # 每 1 分钟一个 TS 文件方式二REST API 动态启停适合业务系统按需录制# 启动录像30s 分片返回任务 ID curl -X POST http://localhost:8080/hls/api/record/start/live/demo?fragment30s # 停止录像 curl -X POST http://localhost:8080/hls/api/record/stop/{id}实现位于 plugin/hls/index.go 的API_record_start/API_record_stop。4.2 时间范围点播m3u8 里的时光机启用数据库后所有录像都会登记到RecordStream元数据表。此时点播接口就变成了时间查询接口GET /vod/live/demo.m3u8?start2026-10-01T08:00:00end2026-10-01T09:00:00 GET /vod/live/demo.m3u8?range1759286400-1759290000插件会从数据库查出该时间段内的录像记录动态拼出一份带#EXT-X-ENDLIST点播结束标记的 m3u8。核心逻辑在 plugin/hls/index.go 的vod处理函数。4.3 TS 时间段下载浏览器下载整个时间段的历史 TS一个请求搞定GET /hls/download/live/demo.ts?start1759286400end1759290000插件会把该时间段内多个 TS 文件拼接下发并智能跳过分片间的重复 PAT/PMT 头如果库里只有 MP4 录像还会自动调用 MP4 解复用器实时转封装成 TS 输出。五、fMP4 无缝播放把首屏延迟打下来传统 HLS 有个经典痛点TS 封装笨重、必须等整个分片下载完才能播首屏慢。fMP4fragmented MP4分片 MP4则是现代答案——分片更小、无需等待、支持 Range 请求。Monibuca 的 MP4 插件plugin/mp4/pkg/内置了完整的 fMP4 封装器moof/mfra等动态 box 的实现在 plugin/mp4/pkg/box/moof.go 与 plugin/mp4/pkg/box/mfro.go封装原理可延伸阅读 doc/fmp4.md。fMP4 点播接口长这样GET /vod/fmp4.m3u8?start...end...注意路径中的fmp4.m3u8这个魔法文件名——插件据此把recordType切到fmp4生成的播放列表不再指向 TS而是指向数据库中的 fMP4 录像记录#EXTINF:90.000,2026-10-01T08:00:0008:00 /mp4/download/live/demo.fmp4?id42每个条目直接落到单条录像记录的下载接口播放器hls.js 原生支持 fMP4边下边播首屏延迟和内存占用都显著优于 TS 方案。 一句话总结TS 分片 直播标配fMP4 点播利器Monibuca 用一套 m3u8 路由同时兼容两种封装。六、进阶LL-HLS 把延迟压到 2 秒以内普通 HLS 的延迟下限受分片时长约束5s 分片 ≈ 10~15s 延迟。Monibuca 另注册了LL-HLS 插件plugin/hls/llhls.go基于 gohlslib 直接输出低延迟分片llhls: onpub: transform: ^live/.: 1s x 7 # 1秒最小分片保留7个访问地址http://{host}:8080/llhls/live/demo/index.m3u8打开http://{host}:8080/llhls/live/demo/index.html甚至能用原生video标签直接播Safari 内置 LL-HLS 支持默认总时移 2 秒接近 RTMP 的延迟体验对比一览方案访问前缀典型延迟适用场景标准 HLS/hls/{stream}.m3u810~15s弱网友好、CDN 分发LL-HLS/llhls/{stream}/index.m3u82s互动直播、监控回看点播/vod/{stream}.m3u8?startend即点即播历史录像回放七、常见问题速查 m3u8 返回空确认发布者在线且onpub.transform正则匹配流路径加?timeout30s给自动订阅留时间。 分片刚生成就被清理窗口太小。把5s x 3调大到5s x 6或拉流任务改用relaymode: mix。 点播下载 404点播依赖数据库定位录像文件——先确认数据库已启用且RecordStream表有对应记录。 跨域播放失败/hls是标准 HTTP 接口跨域需自行在反向代理配置 CORS。八、总结能力接口 / 配置源码位置直播输出/hls/{stream}.m3u8plugin/hls/pkg/writer.go远端拉流hls.pullplugin/hls/pkg/pull.go录像启停/hls/api/record/start|stopplugin/hls/index.go时间范围点播/vod/{stream}.m3u8?startendplugin/hls/index.gofMP4 点播/vod/fmp4.m3u8plugin/mp4/pkg/muxer.go低延迟 LL-HLS/llhls/{stream}/index.m3u8plugin/hls/llhls.goMonibuca 把 HLS 直播、TS 分片、录像点播、fMP4 无缝播放、LL-HLS 低延迟全部装进一个轻量 Go 二进制里配置几行 YAML 即可上线。更多细节欢迎翻阅 plugin/hls/README_CN.md 完整插件文档。【免费下载链接】monibucaMonibuca简称 m7s是一款纯 Go 开发的开源流媒体服务器开发框架。项目地址: https://gitcode.com/langhuihui/monibuca创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑