Documentation
¶
Overview ¶
Package media 提供直播/视频服务的编排薄机制:多路流管理(Hub)、子进程监督 (Supervisor,如 ffmpeg 转码进程,含崩溃重启)与 OTel 运维指标。
边界(与框架"薄机制"一致):只做"管理与编排"这层通用苦活——注册表、生命周期、 路由、进程重启、指标埋点。**不做 policy**:每路流怎么建(hls.Stream 配置)、跑什么 命令(ffmpeg 参数)、转码档位、导出到哪(Prometheus/OTLP),全由调用方决定。
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Hub ¶
type Hub[S Stream] struct { // contains filtered or unexported fields }
Hub 管理多路直播流:streamKey → Session。解决"多路并发、重复推流、按 key 分发"。 按流类型参数化(Hub[*hls.Stream] 或 Hub[*hlsmux.Bridge] 等)。并发安全。 零值不可用,用 NewHub 构造。
func NewHub ¶
NewHub 创建多路流管理器。newStream 是每路流的构造(policy:窗口、分片时长、存储/LL-HLS 等都在这里定);它同时决定了流类型 S。newStream 为 nil 会 panic。
func (*Hub[S]) Acquire ¶
Acquire 为 key 创建一路流并注册。若该 key 已在推流,返回 (nil, false) 表示拒绝(防抢流); 成功返回 (session, true)。通常在 rtmp 的 PublishFunc 里调:拿到 session 就用它的 Stream 收流/分发;返回 false 时让 PublishFunc 返回 nil 拒绝这次推流。
type HubOption ¶
type HubOption func(*hubConfig)
HubOption 配置 Hub(与流类型无关的项)。
func WithBaseContext ¶
WithBaseContext 设置各 Session Context 的父 context(默认 context.Background())。
func WithMetrics ¶
WithMetrics 注入指标记录器(默认 NewMetrics(),基于 OTel 全局 Meter)。
type Metrics ¶
type Metrics struct {
// contains filtered or unexported fields
}
Metrics 是一组直播运维指标,基于 OTel 全局 MeterProvider(由 pkg/service/telemetry 配置)。未配置 telemetry 时全部为 no-op,零开销。按 stream 标签维度上报。
func NewMetrics ¶
func NewMetrics() *Metrics
NewMetrics 从全局 Meter 创建指标(instrument 创建失败时对应项为 nil,记录时跳过)。
func (*Metrics) IngestBytes ¶
IngestBytes 上报某路流采集入流量(由调用方在收到音视频时累加)。
type Session ¶
Session 是一路直播流的运行时:一个 Stream + 一个随 Release 取消的 Context。 外部(如 ffmpeg Supervisor)把自己绑定到 Context() 上,即可在该路流结束时自动收尾。
type Stream ¶
type Stream interface {
http.Handler
// Finish 在该路流被 Release 时调用,做收尾(如封为点播 / 关闭 muxer)。应幂等。
Finish()
}
Stream 是 Hub 按 key 管理的一路流需要具备的能力:能分发播放请求(http.Handler), 且能在流结束时收尾(Finish)。pkg/hls.Stream(自研 origin)与 pkg/media/hlsmux.Bridge (gohlslib 后端)都满足它——Hub 因此与具体 HLS 实现解耦,不再绑死某一个。
type Supervisor ¶
type Supervisor struct {
// contains filtered or unexported fields
}
Supervisor 监督一个子进程(典型:每路流的 ffmpeg 转码进程):非正常退出时按退避 重启,ctx 取消时优雅停止(SIGTERM → 宽限 → Kill)。
命令由 newCmd 工厂提供——每次(重)启动都新建一个 *exec.Cmd,ffmpeg 参数、输入输出 管道等 policy 全在工厂里,Supervisor 只管"跑起来 + 崩了重启 + 让停就停"。
典型用法:把它绑到 Hub 的 Session.Context(),该路流结束时自动停机。
sup := media.NewSupervisor(func() *exec.Cmd { return exec.Command("ffmpeg", args...) },
media.WithSupervisorMetrics(hub.Metrics(), key))
go sup.Run(sess.Context())
func NewSupervisor ¶
func NewSupervisor(newCmd func() *exec.Cmd, opts ...SupervisorOption) *Supervisor
NewSupervisor 创建进程监督器。
type SupervisorOption ¶
type SupervisorOption func(*Supervisor)
SupervisorOption 配置 Supervisor。
func WithRestartPolicy ¶
func WithRestartPolicy(p *backoff.Policy) SupervisorOption
WithRestartPolicy 设置重启退避策略(默认 base 500ms、max 30s、指数)。
func WithStopGrace ¶
func WithStopGrace(d time.Duration) SupervisorOption
WithStopGrace 设置优雅停止的宽限时长(SIGTERM 后等这么久仍未退出则 Kill,默认 5s)。
func WithSupervisorMetrics ¶
func WithSupervisorMetrics(m *Metrics, name string) SupervisorOption
WithSupervisorMetrics 让重启计入 OTel 指标(name 作为 stream 标签)。
Directories
¶
| Path | Synopsis |
|---|---|
|
Package hlsmux 把 RTMP 采集到的 FLV(H.264 + AAC)喂给 bluenviron/gohlslib,产出 生产级 HLS——支持 MPEG-TS、fMP4 和 **LL-HLS(低延迟)** 三种 variant。
|
Package hlsmux 把 RTMP 采集到的 FLV(H.264 + AAC)喂给 bluenviron/gohlslib,产出 生产级 HLS——支持 MPEG-TS、fMP4 和 **LL-HLS(低延迟)** 三种 variant。 |
|
Package rtmp 提供一个 RTMP 采集(ingest)服务端,薄封装 github.com/yutopp/go-rtmp。
|
Package rtmp 提供一个 RTMP 采集(ingest)服务端,薄封装 github.com/yutopp/go-rtmp。 |
|
Package webrtc 提供 WebRTC 的 WHIP(采集)/WHEP(分发)薄机制,基于纯 Go 的 pion/webrtc(零 cgo)。
|
Package webrtc 提供 WebRTC 的 WHIP(采集)/WHEP(分发)薄机制,基于纯 Go 的 pion/webrtc(零 cgo)。 |
|
sfu
Package sfu 在 pkg/media/webrtc 之上提供一个「会议室」SFU 原语:多人实时音视频, 每个参会者推自己的轨道、订阅其他所有人的轨道,服务端做选择性转发(Selective Forwarding Unit,不混流不转码)。
|
Package sfu 在 pkg/media/webrtc 之上提供一个「会议室」SFU 原语:多人实时音视频, 每个参会者推自己的轨道、订阅其他所有人的轨道,服务端做选择性转发(Selective Forwarding Unit,不混流不转码)。 |