GbMediaServer 流媒体服务文档

GB28181 media 支持RTMP/HTTP-FLV/RTSP/WebRTC/HLS

GbMediaServer 流媒体服务文档

WebRTC播放gb28181视频流效果

📖 项目简介

GbMediaServer 是一个高性能的流媒体服务器,支持多种流媒体协议和格式。它主要用于接收GB28181设备的视频流,并提供多种输出格式(WebRTC、FLV、HLS等)供客户端播放。该系统实现了低延迟的实时流媒体传输、多协议转换和多路分发功能。

✨ 核心功能

1. 多协议支持

2. 流媒体转换

3. 实时播放

4. 多路分发

5. HLS录制

🏗️ 系统架构

整体架构

┌─────────────────────────────────────────────────────────────┐
│                    GbMediaServer 系统架构                      │
└─────────────────────────────────────────────────────────────┘

┌──────────────────┐         ┌──────────────────┐
│  GB28181设备      │         │  WebRTC客户端     │
│                  │         │                  │
│  RTP/PS流        │         │  推流/拉流       │
└────────┬─────────┘         └────────┬─────────┘
         │                            │
         │                            │
         ▼                            ▼
┌──────────────────────────────────────────────┐
│         GbMediaService (核心服务)             │
│                                              │
│  ┌──────────────┐  ┌──────────────┐        │
│  │ RtcService   │  │ WebService   │        │
│  │ (WebRTC管理) │  │ (HTTP API)   │        │
│  └──────────────┘  └──────────────┘        │
│                                              │
│  ┌──────────────┐  ┌──────────────┐        │
│  │  Session     │  │   Stream     │        │
│  │  (会话管理)   │  │  (流管理)    │        │
│  └──────────────┘  └──────────────┘        │
└──────────────────────────────────────────────┘
         │                            │
         │                            │
         ▼                            ▼
┌──────────────────┐         ┌──────────────────┐
│   Producer       │         │   Consumer       │
│   (生产者)       │         │   (消费者)       │
│                  │         │                  │
│ - GB28181        │         │ - WebRTC         │
│ - WebRTC         │         │ - HTTP-FLV      │
│ - RTSP           │         │ - HLS            │
│ - RTMP           │         │ - RTSP           │
└──────────────────┘         └──────────────────┘

模块组成

📦 项目结构

GBServer/
├── GbMediaServer/              # 主程序模块
│   ├── main.cpp               # 程序入口
│   ├── server/                # 服务器模块
│   │   ├── gb_media_service.h/cpp    # 核心服务类
│   │   ├── rtc_service.h/cpp         # RTC服务
│   │   ├── web_service.h/cpp          # Web服务
│   │   ├── session.h/cpp              # 会话管理
│   │   └── stream.h/cpp               # 流管理
│   ├── producer/              # 生产者模块
│   │   ├── producer.h/cpp             # 生产者基类
│   │   ├── gb28181_producer.h/cpp     # GB28181生产者
│   │   ├── rtc_producer.h/cpp         # WebRTC生产者
│   │   ├── crtsp_producer.h/cpp       # RTSP生产者
│   │   └── crtmp_producer.h/cpp       # RTMP生产者
│   ├── consumer/              # 消费者模块
│   │   ├── consumer.h/cpp             # 消费者基类
│   │   ├── rtc_consumer.h/cpp          # WebRTC消费者
│   │   ├── flv_consumer.h/cpp          # FLV消费者
│   │   ├── crtsp_consumer.h/cpp       # RTSP消费者
│   │   └── crtmp_consumer.h/cpp        # RTMP消费者
│   ├── share/                 # 共享资源模块
│   │   ├── rtc_interface.h/cpp         # RTC接口
│   │   └── share_resource.h/cpp       # 共享资源
│   └── utils/                 # 工具模块
│       ├── yaml_config.h/cpp          # YAML配置解析
│       └── string_utils.h/cpp          # 字符串工具
└── README.md                  # 项目文档

🚀 快速开始

环境要求

编译步骤

  1. 克隆项目
    git clone https://github.com/chensongpoixs/GBServer.git
    cd GBServer
    
  2. 准备依赖
    • 下载并编译 Google WebRTC 源码
    • 安装 OpenSSL 开发库
    • 安装 yaml-cpp 库
  3. 配置CMake
    mkdir build
    cd build
    cmake .. -DWebRTC_ROOT=/path/to/webrtc
    
  4. 编译项目
    cmake --build . --config Release
    
  5. 运行程序
    ./GbMediaServer/gbmedia_server.exe gbmedia_server.yaml
    

配置文件

创建配置文件 gbmedia_server.yaml

# HTTP服务器配置
http:
  port: 8001

# RTC服务器配置
rtc:
  ips:
    - 192.168.1.100
  udp:
    port: 10001
  tcp:
    port: 20001
  cert: fullchain.pem
  key: privkey.pem

# RTP端口配置
rtp:
  tcp:
    min_port: 20000
    max_port: 30000
  udp:
    min_port: 20000
    max_port: 30000

📖 使用说明

GB28181设备推流流程

  1. 打开RTP服务器
    curl -X POST http://localhost:8001/api/openRtpServer \
      -H "Content-Type: application/json" \
      -d '{
        "port": 5060,
        "tcpmode": 1,
        "streamid": "34020000001320000001"
      }'
    
  2. 配置GB28181设备
    • 将设备的RTP服务器地址设置为服务器IP
    • 将RTP端口设置为API返回的端口
    • 启动设备推流
  3. 播放流
    • WebRTC播放:http://localhost:8001/rtc/play?streamurl=live/34020000001320000001
    • HTTP-FLV播放:http://localhost:8001/live/34020000001320000001.flv
    • HLS播放:http://localhost:8001/live/34020000001320000001.m3u8

WebRTC推流示例

// 客户端代码示例
const pc = new RTCPeerConnection({
  iceServers: [{ urls: 'stun:localhost:10001' }]
});

// 添加本地媒体流
navigator.mediaDevices.getUserMedia({ video: true, audio: true })
  .then(stream => {
    stream.getTracks().forEach(track => pc.addTrack(track, stream));
    return pc.createOffer();
  })
  .then(offer => {
    return pc.setLocalDescription(offer);
  })
  .then(() => {
    // 发送SDP Offer到服务器
    return fetch('http://localhost:8001/rtc/push?streamurl=live/stream1', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        streamurl: 'live/stream1',
        sdp: pc.localDescription.sdp,
        type: 'offer'
      })
    });
  })
  .then(response => response.json())
  .then(answer => {
    return pc.setRemoteDescription(new RTCSessionDescription(answer));
  });

HTTP-FLV播放示例

<!-- 使用flv.js播放HTTP-FLV流 -->
<script src="https://cdn.jsdelivr.net/npm/flv.js/dist/flv.min.js"></script>
<video id="videoElement" controls></video>
<script>
  if (flvjs.isSupported()) {
    const videoElement = document.getElementById('videoElement');
    const flvPlayer = flvjs.createPlayer({
      type: 'flv',
      url: 'http://localhost:8001/live/stream1.flv'
    });
    flvPlayer.attachMediaElement(videoElement);
    flvPlayer.load();
    flvPlayer.play();
  }
</script>

🔧 配置说明

配置文件格式

配置文件采用YAML格式,默认文件名为 gbmedia_server.yaml

配置项说明

HTTP服务器配置

RTC服务器配置

RTP端口配置

📝 API 文档

1. WebRTC推流

接口: POST /rtc/push

请求参数:

请求示例:

POST /rtc/push?streamurl=live/stream1
Content-Type: application/json

{
  "sdp": "v=0\r\no=- 123456789 123456789 IN IP4 127.0.0.1\r\n...",
  "type": "offer"
}

响应示例:

{
  "sdp": "v=0\r\no=- 987654321 987654321 IN IP4 127.0.0.1\r\n...",
  "type": "answer"
}

2. WebRTC拉流

接口: POST /rtc/play

请求参数:

请求和响应格式与推流相同

3. HTTP-FLV拉流

接口: GET /{app}/{stream}.flv

请求示例:

GET /live/stream1.flv

响应:

4. HLS播放列表

接口: GET /{app}/{stream}.m3u8

请求示例:

GET /live/stream1.m3u8

响应:

5. TS分片文件

接口: GET /{app}/{stream}/{fragment}.ts

请求示例:

GET /live/stream1/segment_001.ts

响应:

6. 打开RTP服务器

接口: POST /api/openRtpServer

功能说明:

请求参数(JSON):

{
  "port": 5060,
  "tcpmode": 1,
  "streamid": "34020000001320000001"
}

参数说明:

响应示例:

{
  "code": 0,
  "tcpmode": 1,
  "streamid": "34020000001320000001",
  "port": 20000
}

7. 关闭RTP服务器

接口: POST /api/closeRtpServer

功能说明:

请求参数(JSON):

{
  "streamid": "34020000001320000001"
}

响应示例:

{
  "code": 0,
  "streamid": "34020000001320000001"
}

🏛️ 架构详解

核心概念

Session(会话)

Producer(生产者)

Consumer(消费者)

Stream(流)

数据流图

GB28181设备
    |
    | RTP/PS流
    v
RTP服务器 (TcpServer)
    |
    | 原始RTP包
    v
Gb28181Producer
    |
    | PS解析 -> H.264/AAC
    v
Session
    |
    | 音视频帧
    v
Stream (HLS Muxer)
    |
    +---> RtcConsumer (WebRTC)
    |         |
    |         v
    |     客户端 (浏览器)
    |
    +---> FlvConsumer (HTTP-FLV)
    |         |
    |         v
    |     客户端 (flv.js)
    |
    +---> HLS (M3U8/TS)
              |
              v
          客户端 (HLS播放器)

线程模型

内存管理

🔍 故障排查

常见问题

1. 端口被占用

问题:启动时提示端口被占用

解决方案:

2. DTLS握手失败

问题:WebRTC连接时DTLS握手失败

解决方案:

3. GB28181流无法接收

问题:GB28181设备推流后无法播放

解决方案:

4. FLV播放延迟高

问题:HTTP-FLV播放延迟较高

解决方案:

5. HLS播放列表不更新

问题:HLS播放列表(M3U8)不更新或分片文件缺失

解决方案:

调试工具

🔒 安全建议

认证和授权

数据加密

输入验证

🚀 性能优化

服务器性能优化

网络优化

编码优化

💻 开发指南

添加新的Producer类型

// 1. 继承Producer基类
class MyProducer : public Producer {
public:
    MyProducer(const std::shared_ptr<Stream>& stream, 
               const std::shared_ptr<Session>& session);
    virtual ~MyProducer();
    
    // 实现纯虚函数
    virtual ShareResourceType ShareResouceType() const override;
    virtual void OnVideoFrame(const libmedia_codec::EncodedImage& frame) override;
    virtual void OnAudioFrame(const rtc::CopyOnWriteBuffer& frame, int64_t pts) override;
};

// 2. 在Session::CreateProducer中添加新类型
std::shared_ptr<Producer> Session::CreateProducer(...) {
    switch(type) {
        case ShareResourceType::kProducerTypeMy:
            return std::make_shared<MyProducer>(stream_, shared_from_this());
        // ...
    }
}

添加新的Consumer类型

// 1. 继承Consumer基类
class MyConsumer : public Consumer {
public:
    MyConsumer(libmedia_transfer_protocol::libnetwork::Connection* conn,
               const std::shared_ptr<Stream>& stream,
               const std::shared_ptr<Session>& session);
    virtual ~MyConsumer();
    
    // 实现纯虚函数
    virtual ShareResourceType ShareResouceType() const override;
    virtual void OnVideoFrame(const libmedia_codec::EncodedImage& frame) override;
    virtual void OnAudioFrame(const rtc::CopyOnWriteBuffer& frame, int64_t pts) override;
};

// 2. 在WebService中添加HTTP处理器
void WebService::HandlerMyConsumer(...) {
    // 创建MyConsumer并添加到Session
}

日志系统

// 使用GBMEDIASERVER_LOG宏记录日志
GBMEDIASERVER_LOG(LS_INFO) << "Session created: " << session_name;
GBMEDIASERVER_LOG(LS_WARNING) << "Failed to create producer";
GBMEDIASERVER_LOG(LS_ERROR) << "Critical error occurred";

日志级别:

📚 技术栈

核心库

协议支持

编码格式

🤝 贡献指南

代码规范

提交流程

  1. Fork 项目
  2. 创建功能分支
  3. 提交更改
  4. 创建 Pull Request

📄 许可证

本项目采用BSD许可证,详见LICENSE文件。

👥 作者

🙏 致谢

🔮 未来计划

功能增强

平台扩展

性能优化

📚 参考资源

🐛 问题反馈

如果遇到问题或有建议,请通过以下方式反馈:

注意:本文档会持续更新,请关注项目最新版本。

最后更新:2025-10-14
版本:1.0.0