libmedia_transfer_protocol 媒体传输协议库

媒体协议层 RTMP/RTP/RTSP/HLS/RTCP/HTTP-FLV/WebRTC/GB28181

libmedia_transfer_protocol 媒体传输协议库

📖 项目简介

libmedia_transfer_protocol 是一个功能强大的媒体传输协议库,提供了完整的流媒体传输解决方案。该库支持多种主流的流媒体协议和封装格式,包括 RTSP、RTP/RTCP、HTTP、HLS、FLV、MPEG-TS、GB28181、SIP 等,适用于音视频流的推拉、分发和处理场景。

✨ 核心功能

1. 流媒体协议支持

①、RTSP (Real-Time Streaming Protocol)

②、RTP/RTCP (Real-time Transport Protocol)

③、HTTP/HTTPS

④、HLS (HTTP Live Streaming)

⑤、FLV (Flash Video)

⑥、MPEG-TS (Transport Stream)

2. 网络层

TCP/UDP 服务器

网络控制

3. 视频监控协议

GB28181 (国标 28181)

SIP (Session Initiation Protocol)

4. WebRTC 支持

5. 音视频处理

🏗️ 项目结构

libmedia_transfer_protocol/
├── libnetwork/              # 网络层
│   ├── tcp_server.h/cpp    # TCP 服务器
│   ├── udp_server.h/cpp    # UDP 服务器
│   └── connection.h/cpp    # 连接管理
├── libhttp/                # HTTP 协议
│   ├── http_server.h/cpp   # HTTP 服务器
│   ├── http_request.h/cpp  # HTTP 请求解析
│   └── http_session.h/cpp  # HTTP 会话
├── librtsp/                # RTSP 协议
│   ├── rtsp_server.h/cpp   # RTSP 服务器
│   └── rtsp_session.h/cpp  # RTSP 会话
├── librtp/                 # RTP 协议
│   ├── rtp_packetizer.h    # RTP 打包
│   └── rtp_depacketizer.h  # RTP 解包
├── librtcp/                # RTCP 协议
│   └── rtcp_packet.h/cpp   # RTCP 包处理
├── libhls/                 # HLS 支持
│   ├── chls_muxer.h/cpp    # HLS 复用器
│   ├── cfragment.h/cpp     # TS 切片
│   └── cfragment_window.h/cpp # 切片窗口
├── libflv/                 # FLV 支持
│   ├── cflv_encoder.h/cpp  # FLV 编码器
│   └── amf0.h/c            # AMF0 编码
├── libmpeg/                # MPEG-TS 支持
│   ├── cvideo_encoder.h/cpp # 视频编码器
│   ├── caudio_encoder.h/cpp # 音频编码器
│   ├── cpat_writer.h/cpp   # PAT 表写入
│   ├── cpmt_writer.h/cpp   # PMT 表写入
│   └── mpeg_decoder.h/cpp  # TS 流解析
├── libgb28181/             # GB28181 协议
│   ├── gb28181_server.h/cpp # GB28181 服务器
│   └── gb28181_session.h/cpp # GB28181 会话
├── libsip/                 # SIP 协议
│   └── sip_parser.h/cpp    # SIP 解析器
├── librtc/                 # WebRTC 接口
├── congestion_controller/  # 拥塞控制
├── pacing/                 # 数据包调度
├── remote_bitrate_estimator/ # 码率估计
└── crypto/                 # 加密支持

🚀 快速开始

环境要求

编译步骤

  1. 克隆项目
    git clone https://github.com/chensongpoixs/libmedia_transfer_protocol
    cd libmedia_transfer_protocol
    
  2. 配置 CMake
    mkdir build
    cd build
    cmake .. \
      -DWEBRTC_ROOT=/path/to/webrtc \
      -DLIBYUV_ROOT=/path/to/libyuv \
      -DABSEIL_ROOT=/path/to/abseil \
      -DJSONCPP_ROOT=/path/to/jsoncpp
    
  3. 编译
    cmake --build . --config Release
    

使用示例

RTSP 服务器示例

#include "libmedia_transfer_protocol/librtsp/rtsp_server.h"

using namespace libmedia_transfer_protocol;

// 创建 RTSP 服务器
RtspServer server;
server.Start("0.0.0.0", 554);

// 服务器会自动处理 RTSP 请求
// 客户端可以通过 rtsp://localhost:554/stream 访问

HTTP-FLV 流媒体示例

#include "libmedia_transfer_protocol/libhttp/http_server.h"
#include "libmedia_transfer_protocol/libflv/cflv_encoder.h"

// 创建 HTTP 服务器
HttpServer http_server;
http_server.Start("0.0.0.0", 8080);

// 注册 FLV 流处理器
http_server.RegisterHandler("/live.flv", [](HttpRequest& req, HttpResponse& resp) {
    // 创建 FLV 编码器
    FlvEncoder encoder;
    
    // 处理视频帧
    encoder.WriteVideoFrame(h264_data, timestamp);
    
    // 发送 FLV 数据
    resp.SetBody(encoder.GetData());
});

HLS 流媒体示例

#include "libmedia_transfer_protocol/libhls/chls_muxer.h"

// 创建 HLS 复用器
HLSMuxer hls_muxer;
hls_muxer.SetStreamName("live");
hls_muxer.SetMinFragmentSize(64 * 1024);  // 64KB
hls_muxer.SetMaxFragmentSize(2 * 1024 * 1024);  // 2MB

// 处理媒体包
hls_muxer.OnPacket(video_packet, timestamp);

// 获取 M3U8 播放列表
std::string playlist = hls_muxer.GetPlayList();

MPEG-TS 编码示例

#include "libmedia_transfer_protocol/libmpeg/cvideo_encoder.h"
#include "libmedia_transfer_protocol/libmpeg/caudio_encoder.h"
#include "libmedia_transfer_protocol/libmpeg/cpat_writer.h"
#include "libmedia_transfer_protocol/libmpeg/cpmt_writer.h"

// 创建 TS 流写入器
StreamWriter writer;

// 写入 PAT 表
PatWriter pat_writer(0x0000, 0x1000);  // PAT PID=0x0000, PMT PID=0x1000
pat_writer.WritePat(&writer);

// 写入 PMT 表
PmtWriter pmt_writer(0x1000);
pmt_writer.AddProgramInfo(0x1001, 0x1B);  // 视频 PID=0x1001, H.264
pmt_writer.AddProgramInfo(0x1002, 0x0F);  // 音频 PID=0x1002, AAC
pmt_writer.WritePmt(&writer);

// 编码视频
VideoEncoder video_encoder;
video_encoder.SetPid(0x1001);
video_encoder.EncodeVideo(&writer, h264_data, pts, dts);

// 编码音频
AudioEncoder audio_encoder;
audio_encoder.SetPid(0x1002);
audio_encoder.EncodeAudio(&writer, aac_data, pts);

📚 模块详解

网络层 (libnetwork)

提供底层网络通信能力,包括 TCP 和 UDP 服务器的实现。

主要类:

特性:

HTTP 协议 (libhttp)

完整的 HTTP 协议实现,支持 HTTP 服务器和客户端功能。

主要类:

特性:

RTSP 协议 (librtsp)

完整的 RTSP 协议实现,支持 RTSP 服务器和客户端。

主要类:

支持的方法:

RTP/RTCP (librtp/librtcp)

RTP 数据包封装和 RTCP 控制协议实现。

主要类:

支持的功能:

HLS (libhls)

HTTP Live Streaming 支持,包括 TS 切片生成和 M3U8 播放列表管理。

主要类:

特性:

FLV (libflv)

Flash Video 格式支持,包括 FLV 文件封装和 HTTP-FLV 流媒体传输。

主要类:

特性:

MPEG-TS (libmpeg)

MPEG Transport Stream 支持,包括 TS 流封装和解析。

主要类:

特性:

GB28181 (libgb28181)

国标 28181 视频监控协议支持。

主要类:

特性:

SIP (libsip)

Session Initiation Protocol 支持。

主要类:

特性:

拥塞控制 (congestion_controller)

网络拥塞控制算法实现。

主要算法:

特性:

数据包调度 (pacing)

数据包发送节奏控制。

特性:

码率估计 (remote_bitrate_estimator)

远程码率估计算法。

特性:

📊 使用场景

1. 流媒体服务器

libmedia_transfer_protocol 可用于构建高性能的流媒体服务器:

// 支持 RTSP、HTTP-FLV、HLS 等多种协议的流媒体服务器

2. 视频监控系统

支持 GB28181 协议,可用于构建视频监控平台:

// GB28181 设备接入和管理

3. 直播推流

支持 RTSP 推流、HTTP-FLV 推流等:

// 多协议推流支持

4. 点播系统

支持 HLS、FLV 等多种格式的点播:

// 多格式点播支持

🔧 配置说明

编译选项

# CMake 配置选项
option(ENABLE_RTSP "Enable RTSP support" ON)
option(ENABLE_HLS "Enable HLS support" ON)
option(ENABLE_FLV "Enable FLV support" ON)
option(ENABLE_GB28181 "Enable GB28181 support" ON)
option(ENABLE_WEBRTC "Enable WebRTC support" ON)

运行时配置

各模块支持通过配置文件或 API 进行运行时配置。

📖 API 文档

详细的 API 文档请参考:

🎯 性能优化

1. 多线程处理

库支持多线程并发处理,可充分利用多核 CPU:

// 配置线程池大小
server.SetWorkerThreads(4);

2. 内存管理

3. 网络优化

🐛 故障排除

常见问题

  1. 编译错误
    • 确保安装了所有依赖库
    • 检查 CMake 配置路径是否正确
    • 确认编译器支持 C++17
    • 确保正确配置了 WEBRTC_ROOT 路径
  2. 运行时错误
    • 检查端口是否被占用
    • 确认网络权限配置
    • 查看日志输出
  3. HLS 切片生成失败
    • 检查文件写入权限和磁盘空间
  4. 性能问题
    • 调整缓冲区大小
    • 优化数据包处理逻辑
    • 使用多线程处理

🤝 贡献指南

欢迎贡献代码!请遵循以下步骤:

  1. Fork 项目
  2. 创建功能分支 (git checkout -b temp)
  3. 提交更改 (git commit -m 'Add some New ')
  4. 推送到分支 (git push origin temp)
  5. 创建 Pull Request

代码规范

📄 许可证

本项目采用 BSD 许可证,详情请查看 LICENSE 文件。

👥 作者

🙏 致谢

📚 相关文档

🔮 未来计划

功能增强

性能优化

平台扩展

🐛 问题反馈

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


最后更新:2025-01-XX
版本:1.0.0