Skip to content

HTTP Streaming zh

pingo edited this page Mar 28, 2026 · 3 revisions

English | 中文

HTTP 流媒体模块

HTTP 流媒体模块通过单一 HTTP 监听器提供 HLS、DASH、HTTP-FLV、HTTP-TS 和 HTTP-FMP4 等多种流媒体分发方式。WebSocket 流媒体也共享此监听器。

配置

http_stream:
  enabled: true
  listen: ":8080"
  cors: true
  # tls: null
  hls:
    segment_duration: 6
    playlist_size: 5
  dash:
    segment_duration: 6
    playlist_size: 30
  llhls:
    enabled: false
    part_duration: 0.2
    segment_count: 4
    container: fmp4
字段 类型 默认值 说明
enabled bool true 是否启用 HTTP 流媒体模块
listen string :8080 监听地址和端口
cors bool true 是否启用 CORS 跨域头
tls *bool nil TLS 覆盖(参见 服务器与 TLS 配置

URL 格式

格式 URL 路径 Content-Type
HLS 播放列表 /live/stream1.m3u8 application/vnd.apple.mpegurl
HLS TS 分片 /live/stream1/{N}.ts video/mp2t
LL-HLS 播放列表 /live/stream1.m3u8 application/vnd.apple.mpegurl
LL-HLS 部分分片 /live/stream1/{MSN}.{part}.m4s video/mp4
LL-HLS 初始化分片 /live/stream1/init.mp4 video/mp4
DASH MPD /live/stream1.mpd application/dash+xml
DASH 视频分片 /live/stream1/v{N}.m4s video/mp4
DASH 音频分片 /live/stream1/a{N}.m4s video/mp4
DASH 视频初始化 /live/stream1/init.mp4 video/mp4
DASH 音频初始化 /live/stream1/audio_init.mp4 video/mp4
HTTP-FLV /live/stream1.flv video/x-flv
HTTP-TS /live/stream1.ts video/mp2t
HTTP-FMP4 /live/stream1.mp4 video/mp4

示例

http://localhost:8080/live/stream1.m3u8
http://localhost:8080/live/stream1.mpd
http://localhost:8080/live/stream1.flv
http://localhost:8080/live/stream1.ts
http://localhost:8080/live/stream1.mp4

HLS

配置

字段 类型 默认值 说明
hls.segment_duration float 6 每个 TS 分片的目标时长(秒)
hls.playlist_size int 5 m3u8 播放列表中保留的最大分片数

使用 FFplay 播放:

ffplay http://localhost:8080/live/stream1.m3u8

使用场景

  • 兼容性最强,支持几乎所有浏览器和移动设备
  • 适合大规模 CDN 分发
  • 典型延迟:15-30 秒(取决于分片时长和播放列表大小)

LL-HLS(低延迟 HLS)

字段 类型 默认值 说明
llhls.enabled bool false 启用 LL-HLS 模式(替代普通 HLS 的 .m3u8 请求)
llhls.part_duration float 0.2 目标部分分片时长(秒),对应 PART-TARGET
llhls.segment_count int 4 滑动窗口中保留的完整分片数量
llhls.container string fmp4 容器格式:fmp4(推荐)或 ts/mpegts

启用后,.m3u8 请求将返回 LL-HLS 播放列表(HLS 版本 9),包含部分分片、阻塞式播放列表重载、增量更新和预加载提示。普通 HLS 和 LL-HLS 互斥 — 设置 llhls.enabled: true 使用 LL-HLS,设置为 false 使用普通 HLS。

容器别名: mpegtsmpeg-ts 会自动规范化为 ts

LL-HLS 特性:

  • EXT-X-PART — 部分分片(约 200ms),实现亚秒级延迟
  • CAN-BLOCK-RELOAD — 服务端等待新内容可用后再返回响应
  • EXT-X-PRELOAD-HINT — 客户端预加载尚未生成的下一个部分分片
  • EXT-X-SKIP — 增量播放列表更新,减少带宽
  • 目标延迟:默认设置下约 2 秒

支持的播放器: Safari(原生支持)、hls.js 1.0+(需启用 lowLatencyMode: true

# 在配置中启用 LL-HLS 后:
ffplay http://localhost:8080/live/stream1.m3u8

DASH

DASH 使用 SegmentTimeline 模式,为每个分片提供精确的时间信息。视频和音频分离为独立的 AdaptationSet,各自拥有初始化分片和媒体分片。

  • 使用 SegmentTimeline 和显式的每段时间信息实现精确播放
  • 服务器等待至少 3 个分片就绪后才返回 MPD,以确保稳定的分片时长计算
  • DASH 分片在 MPD 中使用 1 基序号,映射到内部 0 基序列号

配置

字段 类型 默认值 说明
dash.segment_duration float 6 每个 fMP4 分片的目标时长(秒)
dash.playlist_size int 30 MPD 清单中保留的最大分片数

使用 FFplay 播放:

ffplay http://localhost:8080/live/stream1.mpd

使用场景

  • 现代浏览器通过 MSE (Media Source Extensions) 原生播放
  • 支持自适应比特率切换
  • 典型延迟:10-20 秒

HTTP-FLV / HTTP-TS / HTTP-FMP4

这三种格式使用 HTTP 分块传输编码(chunked transfer)实现持续流式传输,客户端建立 HTTP 长连接后持续接收数据。

格式 说明
HTTP-FLV FLV 容器格式,广泛用于国内直播平台,可配合 flv.js 在浏览器播放
HTTP-TS MPEG-TS 容器格式,直接输出 TS 流
HTTP-FMP4 分片 MP4 格式,可配合 MSE 在浏览器播放,兼容性好

使用 FFplay 播放:

ffplay http://localhost:8080/live/stream1.flv
ffplay http://localhost:8080/live/stream1.ts
ffplay http://localhost:8080/live/stream1.mp4

所有分块传输格式均受益于 GOP 缓存 -- 新订阅者立即收到最近的关键帧组,实现即时启动播放。

使用场景

  • HTTP-FLV:低延迟浏览器播放(配合 flv.js),延迟约 1-3 秒
  • HTTP-TS:需要 TS 格式输出的场景
  • HTTP-FMP4:现代浏览器通过 MSE 播放,延迟约 1-3 秒

Clone this wiki locally