媒体协议层 RTMP/RTP/RTSP/HLS/RTCP/HTTP-FLV/WebRTC/GB28181
# libmedia_transfer_protocol 架构文档
┌─────────────────────────────────────────────────────────────────┐
│ libmedia_transfer_protocol │
│ 媒体传输协议库 │
└─────────────────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
┌───────▼──────┐ ┌──────▼──────┐ ┌─────▼──────┐
│ 网络层 │ │ 协议层 │ │ 编码层 │
│ libnetwork │ │ librtsp │ │ libmpeg │
│ libhttp │ │ librtp │ │ libflv │
│ │ │ librtcp │ │ libhls │
└──────────────┘ └─────────────┘ └────────────┘
│ │ │
┌───────▼───────────────▼───────────────▼──────┐
│ WebRTC/媒体处理层 │
│ librtc / congestion_controller / pacing │
└───────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ 网络层 (libnetwork) │
├─────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ TcpServer │────────►│ TcpSession │ │
│ │ │ │ │ │
│ │ - Start() │ │ - OnRead() │ │
│ │ - Stop() │ │ - OnWrite() │ │
│ │ - OnAccept() │ │ - Send() │ │
│ └──────────────┘ └──────────────┘ │
│ │ │ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ UdpServer │────────►│ Connection │ │
│ │ │ │ │ │
│ │ - Start() │ │ - AsyncSend()│ │
│ │ - OnRecv() │ │ - OnRead() │ │
│ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
核心组件:
TcpServer: TCP 服务器,管理 TCP 连接UdpServer: UDP 服务器,处理 UDP 数据包Connection: 连接抽象,统一管理 TCP/UDP 连接TcpSession: TCP 会话,处理单个 TCP 连接特性:
┌─────────────────────────────────────────────────────┐
│ HTTP 协议层 (libhttp) │
├─────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ HttpServer │────────►│ HttpSession │ │
│ │ │ │ │ │
│ │ - Start() │ │ - OnRequest()│ │
│ │ - Register() │ │ - Send() │ │
│ └──────────────┘ └──────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ HttpParser │ │ HttpRequest │ │
│ │ │ │ │ │
│ │ - Parse() │ │ - GetMethod()│ │
│ │ - Complete() │ │ - GetPath() │ │
│ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
核心组件:
HttpServer: HTTP 服务器HttpSession: HTTP 会话管理HttpParser: HTTP 消息解析器HttpRequest: HTTP 请求对象HttpResponse: HTTP 响应对象工作流程:
HttpServer 监听端口HttpSessionHttpParser 解析 HTTP 请求HttpResponse 并发送┌─────────────────────────────────────────────────────┐
│ RTSP 协议层 (librtsp) │
├─────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ RtspServer │────────►│ RtspSession │ │
│ │ │ │ │ │
│ │ - Start() │ │ - OnRequest()│ │
│ │ - OnConnect()│ │ - SendResponse()│ │
│ └──────────────┘ └──────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ RtspRequest │ │ RtspResponse │ │
│ │ │ │ │ │
│ │ - Parse() │ │ - Build() │ │
│ └──────────────┘ └──────────────┘ │
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ RTP/RTCP 数据传输 │ │
│ │ - Interleaved Mode (TCP) │ │
│ │ - UDP Mode │ │
│ └────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
RTSP 方法流程:
OPTIONS → DESCRIBE → SETUP → PLAY → (PAUSE) → TEARDOWN
│ │ │ │ │ │
│ │ │ │ │ │
└─────────┴─────────┴───────┴───────┴──────────┘
RTP/RTCP 媒体传输
┌─────────────────────────────────────────────────────┐
│ RTP/RTCP 协议层 (librtp) │
├─────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ RTP 发送端 │ │
│ │ ┌──────────┐ ┌──────────┐ │ │
│ │ │ Video │────────►│ RTP │ │ │
│ │ │ Frame │ │ Packetizer│ │ │
│ │ └──────────┘ └──────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌──────────┐ ┌──────────┐ │ │
│ │ │ Audio │────────►│ RTP │ │ │
│ │ │ Frame │ │ Packetizer│ │ │
│ │ └──────────┘ └──────────┘ │ │
│ └────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────┐ │
│ │ RTP 接收端 │ │
│ │ ┌──────────┐ ┌──────────┐ │ │
│ │ │ RTP │────────►│ Frame │ │ │
│ │ │ Packet │ │ Assembler│ │ │
│ │ └──────────┘ └──────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌──────────────────────────────────┐ │ │
│ │ │ RTP Reference Finder │ │ │
│ │ │ - H.264 │ │ │
│ │ │ - VP8/VP9 │ │ │
│ │ │ - Generic │ │ │
│ │ └──────────────────────────────────┘ │ │
│ └────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ RTCP 控制 │ │
│ │ - SR (Sender Report) │ │
│ │ - RR (Receiver Report) │ │
│ │ - SDES (Source Description) │ │
│ │ - BYE │ │
│ │ - APP (Application) │ │
│ └────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ HLS 架构 (libhls) │
├─────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Media │────────►│ HLSMuxer │ │
│ │ Packet │ │ │ │
│ └──────────────┘ │ - OnPacket() │ │
│ │ - GetFragment()│ │
│ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────┐ │
│ │ FragmentWindow (滑动窗口) │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │Fragment │ │Fragment │ │Fragment │ │ │
│ │ │ seq:0 │ │ seq:1 │ │ seq:2 │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ │ │ │ │ │ │
│ │ └─────────────┴─────────────┘ │ │
│ │ Window (固定大小) │ │
│ └────────────────────────────────────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Fragment │ │ M3U8 │ │
│ │ │ │ Playlist │ │
│ │ - Write() │ │ - Update() │ │
│ │ - Duration() │ │ - GetPlayList()│ │
│ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
HLS 工作流程:
媒体包 → HLSMuxer → 生成 Fragment → 添加到 Window → 更新 M3U8
│
▼
超过窗口大小
│
▼
移除最旧的 Fragment
┌─────────────────────────────────────────────────────┐
│ FLV 架构 (libflv) │
├─────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Media │────────►│ FlvEncoder │ │
│ │ Frame │ │ │ │
│ └──────────────┘ │ - WriteVideo()│ │
│ │ - WriteAudio()│ │
│ │ - WriteMeta() │ │
│ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────┐ │
│ │ FLV Tag │ │
│ │ ┌──────────────────────────────────┐ │ │
│ │ │ Tag Header (11 bytes) │ │ │
│ │ │ - TagType (Video/Audio/Script) │ │ │
│ │ │ - DataSize │ │ │
│ │ │ - Timestamp │ │ │
│ │ └──────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────┐ │ │
│ │ │ Tag Body │ │ │
│ │ │ - Video: H.264/H.265 data │ │ │
│ │ │ - Audio: AAC/MP3/G.711 data │ │ │
│ │ │ - Script: onMetaData (AMF0) │ │ │
│ │ └──────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────┐ │ │
│ │ │ PreviousTagSize (4 bytes) │ │ │
│ │ └──────────────────────────────────┘ │ │
│ └────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
``` ┌─────────────────────────────────────────────────────┐ │ MPEG-TS 架构 (libmpeg) │ ├─────────────────────────────────────────────────────┤ │ │ │ ┌────────────────────────────────────────────┐ │ │ │ PSI 表写入器 │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ │ │PatWriter │ │PmtWriter │ │ │ │ │ │ PID:0x00 │ │ PID:0x01 │ │ │ │ │ └──────────┘ └──────────┘ │ │ │ └────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ │ │ ┌──────▼──────┐ ┌──────▼──────┐ │ │ │ Video │ │ Audio │ │ │ │ Encoder │ │ Encoder │ │ │ │ │ │ │ │ │ │ - SetPid() │ │ - SetPid() │ │ │ │ - Encode() │ │ - Encode() │ │ │ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ └───────────┬───────────┘ │ │ ▼ │ │ ┌────────────────────────────────────────────┐ │ │ │ PES 包封装