跳转到内容

直播与 HLS/FLV

livestream 控制 RTMP 推流/拉流、HLS 分片、HTTP-FLV 连接、直播内存缓存和直播文件存储。

如果你只使用点播媒体 Provider,这一页大部分配置可以保持默认。

直播能力包含推流入口、实时包分发、FLV 播放、HLS remux、HLS 存储、跨节点 publisher registry。它和点播 Provider/proxy 是两个不同路径:点播主要处理外部媒体 URL 和 Range proxy,直播主要处理正在产生的数据流。

SyncTV 直播流水线图,展示 RTMP 推流进入 StreamHub,分发到 HTTP-FLV 与 HLS remuxer,HLS 写入 memory/file/OSS 存储后由 playlist 和 segment 路由读取。 SyncTV 直播流水线图,展示 RTMP 推流进入 StreamHub,分发到 HTTP-FLV 与 HLS remuxer,HLS 写入 memory/file/OSS 存储后由 playlist 和 segment 路由读取。
直播数据先进入 RTMP/StreamHub,再按播放协议分流:HTTP-FLV 直接面向低延迟播放,HLS remuxer 生成 playlist/segment 并写入选择的 HLS backend。

RTMP ingest

推流端通过 RTMP 连接进入,认证阶段会把 publisher 注册到本节点或共享 registry。

StreamHub

直播包在进程内分发给 FLV session、HLS remuxer 和内部拉流/代理逻辑。

HTTP-FLV

适合低延迟观看。客户端保持长连接,服务端持续写 FLV chunk,并通过写超时保护慢客户端。

HLS

适合通用播放器和 CDN/对象存储形态。延迟更高,但对客户端兼容性和多副本扩展更友好。

协议优点代价适合场景
HTTP-FLV延迟低、链路短、服务端直接推 chunk长连接多,弱网慢客户端需要严格超时互动直播、房间内同步观看
HLS播放器兼容性强,天然按 playlist/segment 拉取,可配共享存储延迟高于 FLV,需要管理分片存储移动端、通用播放器、多副本、对象存储

memory 是默认值,分片只存在当前进程内。它最简单,适合单副本、开发环境和低流量多副本。

限制:进程重启会丢分片;多副本下非 publisher 节点需要通过 HLS gRPC proxy 到 publisher 节点读取 playlist/segment。它可以工作,但不适合作为高并发生产 HLS 的首选。

  1. Publisher 通过 RTMP 连接到任意一个 SyncTV 节点。
  2. 认证通过后,节点把 room_id/media_id -> node_id/api_address 注册到 publisher registry。集群模式下 registry 使用 Redis。
  3. 本节点 StreamHub 开始接收直播包;HTTP-FLV 可以直接从本节点订阅,HLS remuxer 持续生成分片。
  4. HLS 分片写入 memoryfileoss backend。
  5. 观众请求如果落到非 publisher 节点,该节点通过共享 registry 找到 publisher owner。HTTP-FLV 走跨节点拉流/relay;HLS playlist/segment 可以通过 HLS gRPC proxy 从 publisher 节点读取。
  6. 如果 HLS backend 是 file + hls_shared_storage=trueoss,任意节点也可以直接从共享 backend 读取分片,减少对 publisher 节点的回源压力。

默认值:1935

作用:RTMP 推流端口。

OBS 推流地址通常类似:

rtmp://your-domain:1935/live/<stream-key>

如果服务器已经有其他 RTMP 服务占用 1935,可以改成别的端口。

默认值为空。

作用:返回给推流客户端的公开 RTMP 主机名。

什么时候需要设置:

  • 集群内部 server.advertise_host 是 Pod IP。
  • 真实用户需要通过公网域名或 LoadBalancer 推流。

示例:

livestream:
public_rtmp_host: "live.example.com"

如果为空,SyncTV 会尝试使用 server.advertise_host

默认值:2

GOP 是视频编码中的一组帧。GOP 缓存可以让新连接的观众更快开始播放,不必等下一个关键帧。

普通部署保持默认即可。

默认值:100

作用:限制所有直播流 GOP 缓存占用的总内存。

调大场景:

  • 同时直播流很多。
  • 视频码率高。
  • 新观众经常加入,想提升起播体验。

调小场景:

  • 服务器内存有限。

默认值:300

作用:拉流空闲多久后自动停止。

如果你有长时间无人观看但希望保持拉流的场景,可以调大。否则保持默认能节省上游和本机资源。

默认值:10

拉流失败最多重试多少次。

默认值:1000

第一次失败后等待多久再重试。

默认值:30000

重试等待时间最多增长到多少。

上游直播源短暂断线时,SyncTV 会自动重试。等待时间会逐步变长,避免持续高频请求上游。

默认值:10485760,也就是 10 MB。

作用:限制单个 FLV tag 最大大小,防止异常流导致内存占用过高。

不建议随意调大。除非你明确知道上游会产生更大的合法 tag。

默认值:memory

可选值:

作用适用场景
memoryHLS 分片保存在当前进程内存里单副本、临时直播、开发环境
fileHLS 分片写入 livestream.hls_storage_path单副本文件存储,或多副本共享文件系统
ossHLS 分片写入 S3 兼容对象存储多副本、Kubernetes、跨节点共享

规范值是 memoryfileoss。原始 YAML/env 解析也接受 filesystem 作为 file 别名,接受 s3object_storage 作为 oss 别名;Helm values 只允许使用规范值。

集群模式可以使用 memory。非 publisher 节点会通过 HLS gRPC proxy 到 publisher 节点读取 playlist/segment。这个模式适合小规模部署或验证环境;生产高并发 HLS 推荐使用:

  • file,并且 hls_storage_path 是所有副本可读写的共享文件系统。
  • oss,并配置 livestream.hls_oss.*

默认值:0,表示使用内置默认。

作用:限制 hls_storage_backend=memory 时的 HLS 分片内存占用。0 使用内置默认,当前内置默认是 512 MB。

默认值:false

作用:声明 hls_storage_backend=filehls_storage_path 是否所有副本都能访问。

这个字段只适用于 file backend。oss backend 天然是共享存储,不需要设置 hls_shared_storage。在 memoryoss backend 下把 hls_shared_storage 设置为 true 会被配置校验拒绝。

多副本部署时,如果 HLS 文件写在本地磁盘,非 publisher 节点会通过 HLS gRPC proxy 向 publisher 节点读取。为了减少跨节点回源、降低 publisher 节点压力并获得更清晰的故障边界,生产多副本文件 backend 推荐:

livestream:
hls_storage_backend: "file"
hls_shared_storage: true
hls_storage_path: "/var/lib/synctv/hls"

并确保这个路径是 NFS、RWX PVC、CSI volume 等所有副本可见的共享文件系统。不要把 Pod 本地 emptyDir/tmp 或本机磁盘声明为共享存储;如果它只是本地路径,保持 hls_shared_storage=false

默认值为空。

作用:hls_storage_backend=file 时的 HLS 分片存储路径。相对路径会相对 data_dir

示例:

data_dir: "/var/lib/synctv"
livestream:
hls_storage_backend: "file"
hls_storage_path: "livestream/hls"

实际路径:

/var/lib/synctv/livestream/hls

hls_storage_backend=oss 时,SyncTV 使用 S3 兼容对象存储保存 HLS 分片。

livestream:
hls_storage_backend: "oss"
hls_oss:
endpoint: "https://s3.example.com"
bucket: "synctv-hls"
region: "auto"
base_path: "synctv/hls/"

secret 建议使用环境变量或 secret 文件注入:

Terminal window
export SYNCTV_LIVESTREAM_HLS_OSS_ACCESS_KEY_ID="..."
export SYNCTV_LIVESTREAM_HLS_OSS_SECRET_ACCESS_KEY="..."

字段说明:

字段默认值作用
livestream.hls_oss.endpoint""S3/OSS endpoint,例如 AWS S3、MinIO、Cloudflare R2 或兼容服务的 endpoint
livestream.hls_oss.bucket""存储 HLS 分片的 bucket
livestream.hls_oss.access_key_id""Access key ID,支持 access_key_id_file
livestream.hls_oss.secret_access_key""Secret access key,支持 secret_access_key_file
livestream.hls_oss.regionnullS3 region;某些兼容服务可留空或使用服务商要求的值
livestream.hls_oss.base_pathhls/bucket 内对象前缀;会规范化为不以 / 开头、以 / 结尾

livestream.flv_max_connection_duration_seconds

Section titled “livestream.flv_max_connection_duration_seconds”

默认值:86400,也就是 24 小时。

作用:单个 HTTP-FLV 连接最长保持多久。

设置为 0 可以关闭限制,但不推荐。长时间连接如果永不限制,异常客户端可能长期占用资源。

默认值:30

作用:向客户端写数据时最多等待多久。

如果客户端网络很慢,写入一直阻塞,SyncTV 会在超时后断开连接,避免慢客户端拖垮服务。