logo
Public
0
0
WeChat Login

VDK — Video Development Kit

Go License Module

纯 Go 流媒体开发工具包 — 协议接入、编解码、转码、录制、集群,一站式搞定。


核心能力

类别支持项
传输协议RTSP/RTSPS, RTMP/RTMPS, SRT, RIST, HLS, WebRTC (WHIP/WHEP), GB/T 28181, NDI(需外部SDK), DVR-IP
容器格式MP4, fMP4, FLV, MPEG-TS, MKV, HLS, AAC, MSE, RAW
视频编码H.264, H.265/HEVC, AVS2, VP9, AV1, VVC/H.266, MJPEG
音频编码AAC, Opus, MP3, FLAC, AC-3/E-AC-3, G.726, PCM (μ-law/A-law)
图片编码WebP, AVIF, HEIF
硬件加速NVENC, QSV, AMF, VAAPI, VideoToolbox, V4L2M2M, RKMPP
高级功能ABR 多码率阶梯, AI 增强 (超分/降噪/插帧), 字幕 (SRT/ASS/WebVTT/CEA-608/708), 分段录制 (Local/S3/GCS), 集群负载均衡, OpenTelemetry 追踪, Prometheus 指标

快速开始

安装

go get cnb.cool/svn/vdk@latest

CLI 工具

go install cnb.cool/svn/vdk/cmd/vdk@latest # 探测流信息 vdk probe rtsp://example.com/live/stream # 转码 vdk transcode -i input.mp4 -o output.flv # 启动流媒体服务 vdk serve -c config.yaml # 性能基准测试 vdk benchmark

Builder API — 流式构建

package main import ( "context" "time" "cnb.cool/svn/vdk/format" "cnb.cool/svn/vdk/stream" ) func main() { format.RegisterAll() s, err := stream.New(). Name("cam-01"). Input("rtsp://admin:pass@192.168.1.100/live"). WithTimeout(10 * time.Second). LowLatency(). Output("rtmp://cdn.example.com/live/cam-01"). WithTimeout(5 * time.Second). Done(). Output("srt://backup.example.com:9000"). SRTConfig(120*time.Millisecond, "secret", "live/cam-01"). Done(). Build() if err != nil { panic(err) } s.OnEvent(func(e stream.EventData) { switch e.Event { case stream.EventReconnecting: println("重连中...") case stream.EventError: println("错误:", e.Error.Error()) } }) if err := s.Run(context.Background()); err != nil { panic(err) } }

Builder API — 转码

s, err := stream.New(). Input("rtsp://camera.local/stream"). Transcode(). Video(stream.VideoH265). Resolution(1920, 1080). BitrateM(4). Preset(stream.PresetFast). Done(). Audio(stream.AudioAAC). Done(). Done(). Output("/recordings/output.mp4").Done(). Build()

低级 API — Demux/Mux

package main import ( "cnb.cool/svn/vdk/av/avutil" "cnb.cool/svn/vdk/format" ) func main() { format.RegisterAll() demuxer, err := avutil.Open("rtsp://example.com/live") if err != nil { panic(err) } defer demuxer.Close() muxer, err := avutil.Create("output.mp4") if err != nil { panic(err) } defer muxer.Close() streams, _ := demuxer.Streams() muxer.WriteHeader(streams) avutil.CopyPackets(muxer, demuxer) muxer.WriteTrailer() }

事件系统

av/event 包提供协议传输层的通用事件机制,14 种事件类型覆盖连接全生命周期。

package main import ( "fmt" "cnb.cool/svn/vdk/av/event" "cnb.cool/svn/vdk/format/srt" ) func main() { conn, err := srt.Dial("srt://relay.example.com:9000?streamid=live/test") if err != nil { panic(err) } defer conn.Close() // 通过 EventBus 监听事件 conn.EventBus = event.NewBus() conn.EventBus.On(event.Connected, func(d event.Data) { fmt.Printf("[%s] 已连接: %s\n", d.Protocol, d.URL) }) conn.EventBus.On(event.StreamReady, func(d event.Data) { fmt.Printf("流就绪, codec 数量: %d\n", len(d.Codec)) }) conn.EventBus.On(event.Stats, func(d event.Data) { if stats, ok := d.Stats.(srt.Stats); ok { fmt.Printf("RTT: %dms, 丢包率: %.2f%%\n", stats.RTT.Milliseconds(), stats.PacketLossRate*100) } }) conn.EventBus.On(event.Error, func(d event.Data) { fmt.Printf("错误: %v\n", d.Error) }) // OnAll 接收所有事件 conn.EventBus.OnAll(func(d event.Data) { fmt.Printf("[%s] %s @ %s\n", d.Protocol, d.Event, d.Time.Format("15:04:05")) }) }

Hook 包装器 — 自动发射事件

import "cnb.cool/svn/vdk/av/event" // 将任意 DemuxCloser 包装为带事件的 HookDemuxer hooked := event.WrapDemuxer(demuxer, event.WithProtocol("rtsp"), event.WithURL("rtsp://example.com/live"), event.WithDirection("subscribe"), ) hooked.On(event.StreamReady, func(d event.Data) { fmt.Println("codec 就绪:", d.Codec) }) streams, err := hooked.Streams() // 自动发射 StreamReady

事件类型一览

事件说明
Connecting正在连接
Connected连接成功
Handshaking正在握手
Handshaked握手完成
StreamReady流就绪 (codec 已获取)
PacketRead读取数据包
PacketWrite写入数据包
CodecChange编码变更
Error错误
Disconnecting正在断开
Disconnected已断开
Reconnecting正在重连
Reconnected重连成功
Stats统计信息更新

项目结构

vdk/ ├── av/ # 核心抽象层 │ ├── av.go # Muxer, Demuxer, CodecData, Packet 接口 │ ├── event/ # 事件系统 (Bus, HookDemuxer, HookMuxer) │ ├── pktque/ # 包队列与 Filter (WaitKeyFrame, FixTime) │ ├── pubsub/ # 发布/订阅 Queue (fan-out) │ ├── avutil/ # Handler 注册, Open/Create 辅助函数 │ ├── avconv/ # 格式转换辅助 │ └── transcode/ # 转码器包装 ├── codec/ # 编解码器 │ ├── h264parser/ # H.264 解析 (SplitNALUs, SPS, CodecData) │ ├── h265parser/ # H.265/HEVC 解析 │ ├── aacparser/ # AAC 解析 │ ├── opusparser/ # Opus 解析 │ ├── vp9parser/ # VP9 解析 │ ├── av1parser/ # AV1 解析 │ ├── vvc/ # VVC/H.266 │ ├── flac/ # FLAC │ ├── mp3/ # MP3 │ ├── ac3/ # AC-3 │ ├── mjpeg/ # MJPEG │ ├── webp/, avif/, heif/ # 图片格式 │ └── fake/ # 测试用假编码器 ├── format/ # 协议与容器 │ ├── rtmp/ # RTMP (Dial, Server, Conn + EventBus) │ ├── rtsp/ # RTSP Client + EventBus │ ├── rtspv2/ # RTSPv2 Client, ProxyConn, Server + EventBus │ ├── srt/ # SRT (Dial/DialContext/DialConfig, Config, Stats + EventBus) │ ├── rist/ # RIST (Sender, FEC, Stats, BridgeEvents) │ ├── webrtc/ # WebRTC Muxer, WebRTCPusher (WHIP/BatchV2), WHEPPuller │ ├── webrtcv3/ # WebRTC v3 兼容层 │ ├── gb28181/ # GB/T 28181 SIP + PS 解封装 │ ├── ndi/ # NDI 协议框架 │ ├── dvrip/ # DVR-IP Client + EventBus │ ├── hls/ # HLS Muxer │ ├── flv/ # FLV Muxer, Demuxer, Prober │ ├── mp4/ # MP4 Muxer, Demuxer │ ├── mp4f/ # fMP4 Muxer (fragmented) │ ├── mp4m/ # MP4 Muxer, Demuxer (扩展) │ ├── fmp4/ # fMP4 MovieFragmenter │ ├── mkv/ # MKV Demuxer │ ├── ts/ # MPEG-TS Muxer, Demuxer │ ├── nvr/ # NVR 录制 Muxer │ ├── aac/ # AAC 文件 │ ├── raw/ # RAW 裸流 │ └── mse/ # Media Source Extensions ├── stream/ # 高级 Builder API │ ├── builder.go # New(), Input(), Output(), Transcode(), Build() │ ├── stream.go # Stream (Start/Stop/Pause/Resume/Run/Wait) │ └── enums.go # Protocol, VideoCodec, AudioCodec, Container, Preset... ├── pkg/ # 功能模块 │ ├── manager/ # 流生命周期 Manager (状态机, 健康检查, 资源限制) │ ├── streammgr/ # 批量会话 Manager (熔断, 健康监控, 集群) │ ├── abr/ # ABR 自适应码率 (Ladder, Rendition, Transcoder) │ ├── ai/ # AI 增强 (超分/降噪/插帧/色彩/防抖/去隔行) │ ├── audio/ # 音频处理 │ ├── subtitle/ # 字幕 (SRT/ASS/WebVTT/CEA-608/708) │ ├── recording/ # 分段录制 (Local/S3/GCS, 时移回放) │ ├── cluster/ # 集群 (负载均衡, 服务发现, 流路由) │ ├── metrics/ # Prometheus 指标收集 │ ├── tracing/ # OpenTelemetry 分布式追踪 │ ├── config/ # 配置管理 │ └── scene/ # 场景模板 ├── cgo/ # FFmpeg CGO 绑定 │ ├── codec/ # 编解码 │ ├── filter/ # 滤镜 │ ├── pipeline/ # 处理管线 │ └── sdk/ # SDK 封装 ├── cmd/vdk/ # CLI 工具 (probe, transcode, serve, benchmark) ├── example/ # 示例程序 └── utils/ # 通用工具

模块文档

模块路径说明
核心接口av/Muxer, Demuxer, CodecData, Packet
事件系统av/event/Bus, HookDemuxer, HookMuxer
包队列av/pktque/Filter, WaitKeyFrame, FixTime
发布订阅av/pubsub/Queue fan-out
工具函数av/avutil/Open, Create, CopyPackets
H.264 解析codec/h264parser/SplitNALUs, SPS/PPS, CodecData
H.265 解析codec/h265parser/SplitNALUs, VPS/SPS/PPS
RTMPformat/rtmp/Dial, Server, Conn
RTSPformat/rtsp/Client
RTSPv2format/rtspv2/RTSPClient(主路径), ProxyConn/Server(轻量骨架)
SRTformat/srt/Dial, Config, Stats
RISTformat/rist/Sender, FEC, Config
WebRTCformat/webrtc/Muxer, WHIP/WHEP Pusher/Puller
GB/T 28181format/gb28181/SIP 注册/鉴权, PS 解封装
Builder APIstream/New, Build, Stream
流管理器pkg/manager/生命周期管理
会话管理pkg/streammgr/批量会话, 熔断, 健康监控
ABRpkg/abr/自适应码率阶梯
AI 增强pkg/ai/超分/降噪/插帧
字幕pkg/subtitle/SRT/ASS/WebVTT/CEA-608/708
录制pkg/recording/分段录制, 多存储后端
集群pkg/cluster/负载均衡, 服务发现
指标pkg/metrics/Prometheus Collector
追踪pkg/tracing/OpenTelemetry
CLIcmd/vdk/probe, transcode, serve, benchmark
CGO 绑定cgo/FFmpeg codec/filter/pipeline
示例example/完整示例程序

版本路线

版本状态重点
v2.1当前Builder API, 事件系统, SRT/RIST/WebRTC, GB/T 28181, AI 增强, 集群
v2.2规划中DASH 输出, SRT Bonding, RIST Main Profile 完善, CMAF
v3.0规划中全链路 zero-copy, io_uring 传输, QUIC 协议, WebTransport

依赖

依赖用途
pion/webrtc v3 / v4WebRTC (WHIP/WHEP)
pion/rtpRTP 包处理
gobwas/wsWebSocket
go-astiavFFmpeg CGO 绑定
gopsutil系统资源监控
OpenTelemetry分布式追踪
google/uuidUUID 生成
x/crypto加密
x/image图片处理

致谢

本项目基于 joy4 演进,感谢原作者的开创性工作。


MIT License | 最后更新: 2026-02-11

About

No description, topics, or website provided.
49.05 MiB
0 forks0 stars2 branches0 TagREADMEMIT license
Language
Go99.8%
Shell0.2%