libmedia_transfer_protocol 架构文档

媒体协议层 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      │
    └───────────────────────────────────────────────┘

🏗️ 模块架构

1. 网络层架构 (libnetwork)

┌─────────────────────────────────────────────────────┐
│                 网络层 (libnetwork)                  │
├─────────────────────────────────────────────────────┤
│                                                      │
│  ┌──────────────┐         ┌──────────────┐         │
│  │  TcpServer   │────────►│ TcpSession   │         │
│  │              │         │              │         │
│  │ - Start()    │         │ - OnRead()   │         │
│  │ - Stop()     │         │ - OnWrite()  │         │
│  │ - OnAccept() │         │ - Send()     │         │
│  └──────────────┘         └──────────────┘         │
│         │                       │                   │
│         │                       │                   │
│         ▼                       ▼                   │
│  ┌──────────────┐         ┌──────────────┐         │
│  │  UdpServer   │────────►│  Connection  │         │
│  │              │         │              │         │
│  │ - Start()    │         │ - AsyncSend()│         │
│  │ - OnRecv()   │         │ - OnRead()   │         │
│  └──────────────┘         └──────────────┘         │
│                                                      │
└─────────────────────────────────────────────────────┘

核心组件:

特性:

2. HTTP 协议架构 (libhttp)

┌─────────────────────────────────────────────────────┐
│                 HTTP 协议层 (libhttp)                │
├─────────────────────────────────────────────────────┤
│                                                      │
│  ┌──────────────┐         ┌──────────────┐         │
│  │ HttpServer   │────────►│ HttpSession  │         │
│  │              │         │              │         │
│  │ - Start()    │         │ - OnRequest()│         │
│  │ - Register() │         │ - Send()     │         │
│  └──────────────┘         └──────────────┘         │
│         │                       │                   │
│         ▼                       ▼                   │
│  ┌──────────────┐         ┌──────────────┐         │
│  │ HttpParser   │         │ HttpRequest  │         │
│  │              │         │              │         │
│  │ - Parse()    │         │ - GetMethod()│         │
│  │ - Complete() │         │ - GetPath()  │         │
│  └──────────────┘         └──────────────┘         │
│                                                      │
└─────────────────────────────────────────────────────┘

核心组件:

工作流程:

  1. HttpServer 监听端口
  2. 接收连接,创建 HttpSession
  3. HttpParser 解析 HTTP 请求
  4. 路由到对应的处理器
  5. 生成 HttpResponse 并发送

3. RTSP 协议架构 (librtsp)

┌─────────────────────────────────────────────────────┐
│                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 媒体传输

4. RTP/RTCP 架构 (librtp/librtcp)

┌─────────────────────────────────────────────────────┐
│              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)                      │    │
│  └────────────────────────────────────────────┘    │
│                                                      │
└─────────────────────────────────────────────────────┘

5. HLS 架构 (libhls)

┌─────────────────────────────────────────────────────┐
│               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

6. FLV 架构 (libflv)

┌─────────────────────────────────────────────────────┐
│               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)        │     │    │
│  │  └──────────────────────────────────┘     │    │
│  └────────────────────────────────────────────┘    │
│                                                      │
└─────────────────────────────────────────────────────┘

7. MPEG-TS 架构 (libmpeg)

``` ┌─────────────────────────────────────────────────────┐ │ MPEG-TS 架构 (libmpeg) │ ├─────────────────────────────────────────────────────┤ │ │ │ ┌────────────────────────────────────────────┐ │ │ │ PSI 表写入器 │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ │ │PatWriter │ │PmtWriter │ │ │ │ │ │ PID:0x00 │ │ PID:0x01 │ │ │ │ │ └──────────┘ └──────────┘ │ │ │ └────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ │ │ ┌──────▼──────┐ ┌──────▼──────┐ │ │ │ Video │ │ Audio │ │ │ │ Encoder │ │ Encoder │ │ │ │ │ │ │ │ │ │ - SetPid() │ │ - SetPid() │ │ │ │ - Encode() │ │ - Encode() │ │ │ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ └───────────┬───────────┘ │ │ ▼ │ │ ┌────────────────────────────────────────────┐ │ │ │ PES 包封装