跳转到内容

HLS 协议

HLS(HTTP Live Streaming)是 Apple 提出的基于 HTTP 的流媒体协议。通过将直播流切割为 TS 片段并生成 M3U8 播放列表,HLS 具有极佳的 CDN 兼容性和设备覆盖率,是大规模分发的首选协议。

属性
传输层HTTP(共享引擎 HTTP 端口)
推流❌ 不支持
拉流✅ 支持
延迟5-30 秒(取决于切片时长)
Feature Flaghls
Cargo.toml
[features]
hls = ["dep:plugin-hls"]
hls:
enable: true
segment_duration: 6
max_segments: 5
output_dir: "./hls"
write_to_disk: true
配置项类型默认值说明
enablebooltrue是否启用 HLS 插件
segment_durationu646TS 切片时长(秒)
max_segmentsusize5播放列表保留的最大切片数
output_dirstring"./hls"切片文件输出目录
write_to_diskbooltrue是否将切片写入磁盘
http://host:port/hls/{streamPath}/index.m3u8
http://host:port/hls/{streamPath}/{sequence}.ts

示例:

http://localhost:8080/hls/live/test/index.m3u8
http://localhost:8080/hls/live/test/0.ts
Terminal window
ffplay http://localhost:8080/hls/live/test/index.m3u8
  1. 打开 VLC,选择 媒体打开网络串流
  2. 输入 URL:http://localhost:8080/hls/live/test/index.m3u8
  3. 点击 播放

使用 hls.js 在浏览器中播放:

<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<video id="player" controls></video>
<script>
const video = document.getElementById('player');
if (Hls.isSupported()) {
const hls = new Hls();
hls.loadSource('http://localhost:8080/hls/live/test/index.m3u8');
hls.attachMedia(video);
hls.on(Hls.Events.MANIFEST_PARSED, () => video.play());
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
// Safari 原生支持
video.src = 'http://localhost:8080/hls/live/test/index.m3u8';
video.play();
}
</script>

HLS 插件提供录制 API,可以将流录制为 HLS 格式(M3U8 + TS 文件):

Terminal window
# 开始录制
curl -X POST http://localhost:8080/hls/record/start/live/test
# 停止录制
curl -X POST http://localhost:8080/hls/record/stop/live/test
# 查看录制列表
curl http://localhost:8080/hls/record/list
# 查看录制状态
curl http://localhost:8080/hls/record/status/live/test
# 查询历史录像
curl http://localhost:8080/hls/record/records
  1. 订阅流:当首次请求 HLS 播放列表时,插件自动订阅对应的流
  2. 切片生成:从流中持续读取帧数据,按 segment_duration 切割为 TS 片段
  3. 播放列表更新:每生成一个新切片,自动更新 M3U8 播放列表
  4. 滑动窗口:保留最近 max_segments 个切片,旧切片自动清理
  5. 存储策略:切片同时保存在内存和磁盘(取决于 write_to_disk 配置)

HLS 的延迟主要由以下因素决定:

总延迟 ≈ segment_duration × (max_segments - 1) + 播放器缓冲

优化建议:

# 低延迟配置
hls:
segment_duration: 2
max_segments: 3

此配置下理论最低延迟约 4-6 秒。

Terminal window
# 1. 通过 RTMP 推流
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://localhost:1935/live/test
# 2. 通过 HLS 拉流
ffplay http://localhost:8080/hls/live/test/index.m3u8
# 3. 也可以同时通过其他协议拉流
ffplay http://localhost:8080/flv/live/test.flv

联系我们

微信公众号:不卡科技 微信公众号二维码
腾讯频道:流媒体技术 腾讯频道二维码
QQ 频道:p0qq0crz08 QQ 频道二维码
QQ 群:751639168 QQ 群二维码