# RtspServer **Repository Path**: 247/RtspServer ## Basic Information - **Project Name**: RtspServer - **Description**: RtspServer - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-07 - **Last Updated**: 2026-01-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RTSP/UDP Multicast Streaming Server 一个基于Live555的轻量级RTSP/UDP组播流媒体服务器,专为Rockchip平台设计,支持RTSP单播、RTSP组播和UDP组播H264裸流传输。 ## 项目概述 该项目实现了一个流媒体服务器,用于将Rockchip平台上的摄像头视频流(包括MIPI CSI和USB摄像头)通过RTSP协议和UDP组播进行传输。支持H.264编码和多种视频格式输入。 ## 主要特性 - **RTSP单播**:为每个客户端建立单独的连接,支持标准RTSP协议 - **RTSP组播**:通过RTSP协议协商,将视频流发送到组播地址,多个客户端可同时接收 - **UDP组播H264裸流**:直接通过UDP协议发送H264裸流到组播地址,低延迟,适合实时应用 - **多视频源支持**:可同时配置多个摄像头设备 - **多服务器实例**:支持同时运行多个流媒体服务器实例 - **灵活配置**:通过配置文件轻松调整各项参数 ## 项目结构 ``` RtspServer/ ├── .gitignore # Git忽略文件 ├── .gitmodules # Git子模块配置 ├── CMakeLists.txt # CMake构建配置 ├── LICENSE # 许可证文件 ├── README.md # 项目说明文档 ├── cmake/ # CMake相关配置 │ └── live555.cmake # Live555库的CMake配置 ├── configs/ # 配置文件目录 │ └── config.ini # 主配置文件 ├── inc/ # 头文件目录 │ ├── CamFramedSource.h # 视频帧源头文件 │ ├── CamMulticastServerMediaSubsession.h # RTSP组播媒体会话头文件 │ ├── CamRTSPServer.h # RTSP服务器头文件 │ ├── CamUnicastServerMediaSubsession.h # RTSP单播媒体会话头文件 │ ├── DeCompress.h # 解压模块头文件 │ ├── H264RawMulticastSender.h # H264裸流组播发送器头文件 │ ├── INIReader.h # INI配置读取头文件 │ ├── MThread.h # 线程类头文件 │ ├── RkEncoder.h # Rockchip编码器头文件 │ ├── UdpMulticastServer.h # UDP组播服务器头文件 │ ├── ini.h # INI解析头文件 │ └── transcoder.h # 转码器头文件 ├── iqfiles/ # 图像质量配置文件目录 ├── scripts/ # 脚本目录 │ ├── build_mpp.sh # MPP构建脚本 │ ├── rkaiq_3A_2112x1568.sh # 3A参数配置脚本(2112x1568) │ └── rkaiq_3A_4114x3136.sh # 3A参数配置脚本(4114x3136) ├── src/ # 源代码目录 │ ├── CamFramedSource.cc # 视频帧源实现 │ ├── CamRTSPServer.cc # RTSP服务器实现 │ ├── CamUnicastServerMediaSubsession.cc # RTSP单播媒体会话实现 │ ├── DeCompress.cc # 解压模块实现 │ ├── H264RawMulticastSender.cc # H264裸流组播发送器实现 │ ├── INIReader.cc # INI配置读取实现 │ ├── MThread.cc # 线程类实现 │ ├── RkEncoder.cc # Rockchip编码器实现 │ ├── UdpMulticastServer.cc # UDP组播服务器实现 │ ├── ini.c # INI解析实现 │ ├── main.cc # 主程序入口 │ └── transcoder.cc # 转码器实现 └── thirdparty/ # 第三方库目录 ├── libjpeg-turbo/ # JPEG编解码库 └── libv4l2cc/ # V4L2摄像头控制库 ``` ## 依赖项 ### 核心依赖 - **Live555**: 用于实现RTSP协议栈 - **Rockchip MPP**: Rockchip多媒体处理平台,用于视频编码 - **V4L2**: Linux视频捕获框架 - **libjpeg-turbo**: JPEG编解码库(用于处理MJPEG格式) ### 构建依赖 - CMake 3.14+ - C++14兼容的编译器 - Git(用于拉取子模块) ## 编译方式 ### Linux平台 #### 1. 准备工作 ```bash # 安装必要的依赖 sudo apt-get update sudo apt-get install -y build-essential cmake git # 克隆仓库并更新子模块 cd RtspServer git submodule update --init ``` #### 2. 构建MPP(Rockchip平台) ```bash # 运行MPP构建脚本 ./scripts/build_mpp.sh ``` #### 3. 构建流媒体服务器 ```bash mkdir build && cd build cmake .. make -j$(nproc) ``` 编译成功后,可执行文件位于`build/RtspServer`。 ## 配置说明 配置文件位于`configs/config.ini`,主要包含以下部分: ### 日志配置 ```ini [log] level = NOTICE # 日志级别:NOTICE, INFO, ERROR ``` ### 视频源配置 可以配置多个视频源,每个源使用不同的节名(如[video1], [video2]): ```ini [video1] format = MJPEG # 视频格式:YUY2, MJPEG, NV12, NV21, NV61 device = /dev/video0 # 视频设备路径 width = 640 # 视频宽度 height = 480 # 视频高度 fps = 30 # 帧率(MIPI模式下可能不生效) fix_qp = 23 # 固定QP值 [0-51],值越小质量越高 ``` ### 服务器配置 可以配置多个服务器实例,每个实例使用不同的节名(如[server1], [server2]): ```ini [server1] rtsp_port = 8554 # RTSP端口 stream_name = camera1 # 流名称 max_buf_size = 2000000 # 最大缓冲区大小 max_packet_size = 1500 # 最大数据包大小 bitrate = 2000 # 比特率 # RTSP组播配置 multicast_enable = false # 是否启用RTSP组播 multicast_address = 239.0.0.1 # RTSP组播地址 multicast_rtp_port = 10000 # RTSP组播RTP端口 multicast_rtcp_port = 10001 # RTSP组播RTCP端口 multicast_ttl = 1 # RTSP组播TTL值 # UDP组播配置(H264裸流) udp_multicast_enable = false # 是否启用UDP组播H264裸流 udp_multicast_address = 239.0.0.1 # UDP组播地址 udp_multicast_port = 10000 # UDP组播端口 udp_multicast_ttl = 1 # UDP组播TTL值 ``` ## 运行方式 ### 基本运行 ```bash # 确保有足够的权限访问摄像头设备 sudo ./build/RtspServer ``` 程序启动后会自动初始化所有配置的视频源和服务器实例,如果某个设备初始化失败,程序会跳过该设备继续运行。 ### 信号处理 程序支持以下信号: - `SIGINT` (Ctrl+C): 正常关闭服务器 - `SIGTERM`: 正常关闭服务器 程序会优雅地关闭所有流媒体服务,释放所有资源。 ## 流媒体访问方式 ### 1. RTSP单播流访问 使用支持RTSP协议的播放器访问视频流: ``` rtsp://:8554/camera1 ``` ### 2. RTSP组播流访问 对于RTSP组播流,可以使用以下URL格式访问: ``` rtsp://:8554/camera1/multicast ``` ### 3. UDP组播H264裸流访问 对于UDP组播H264裸流,可以使用以下方式访问: #### 使用FFmpeg播放 ```bash ffmpeg -i udp://239.0.0.1:20000 -fflags nobuffer -flags low_delay -framedrop ``` #### 使用GStreamer播放 ```bash gst-launch-1.0 udpsrc address=239.0.0.1 port=20000 ! application/x-rtp, media=video, encoding-name=H264 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink ``` #### 使用VLC播放 ``` udp://@239.0.0.1:20000 ``` **注意**:UDP组播H264裸流是直接发送的H264编码数据,客户端需要知道视频流的详细参数(编码格式、分辨率、帧率等)。 ## 流媒体方式对比 | 特性 | RTSP单播 | RTSP组播 | UDP组播H264裸流 | |------|---------|---------|---------------| | 协议 | RTSP over TCP/UDP | RTSP over UDP | UDP | | 延迟 | 中等 | 中等 | 低 | | 带宽消耗 | 随客户端数量增加 | 固定 | 固定 | | 客户端支持 | 广泛 | 广泛 | 需要支持UDP组播 | | 控制功能 | 完整(PLAY/PAUSE/SEEK) | 完整 | 无 | | 适用场景 | 一般应用 | 多客户端观看 | 实时性要求高的应用 | ## 支持的播放器 - **VLC Media Player**: 支持所有流媒体方式 - **FFmpeg**: 支持所有流媒体方式 - **GStreamer**: 支持所有流媒体方式 - **各种支持RTSP协议的IP摄像头客户端**: 支持RTSP单播和组播 ## 可能存在的问题及解决方案 ### 1. 摄像头访问权限问题 **症状**:无法打开摄像头设备,提示权限错误。 **解决方案**: - 确保当前用户属于video组:`sudo usermod -a -G video $USER` - 或者使用sudo运行程序:`sudo ./RtspServer` ### 2. MPP初始化失败 **症状**:程序启动时提示MPP初始化失败。 **解决方案**: - 确保在Rockchip平台上运行 - 重新构建MPP:`./scripts/build_mpp.sh` - 检查系统是否加载了必要的内核模块 ### 3. 视频流卡顿 **症状**:客户端播放时出现卡顿现象。 **解决方案**: - 增加配置文件中的`max_buf_size`值 - 降低视频分辨率或帧率 - 检查网络带宽是否足够,特别是在使用组播时 ### 4. RTSP客户端无法连接 **症状**:客户端无法连接到RTSP服务器。 **解决方案**: - 检查服务器是否正在运行 - 检查防火墙是否允许RTSP端口(默认8554) - 检查客户端URL是否正确 ### 5. 多摄像头配置问题 **症状**:无法同时使用多个摄像头。 **解决方案**: - 确保每个摄像头配置使用不同的设备路径 - 确保每个服务器实例使用不同的端口号 - 检查系统资源是否足够 ### 6. 组播流无法接收 **症状**:启用组播后,客户端无法接收到视频流。 **解决方案**: - 检查网络是否支持组播 - 确保组播地址和端口配置正确 - 检查防火墙是否允许组播流量 - 尝试调整`multicast_ttl`或`udp_multicast_ttl`值 - 确保客户端和服务器在同一网络段(如果TTL设置为1) ### 7. UDP组播H264裸流无法播放 **症状**:UDP组播H264裸流无法正常播放。 **解决方案**: - 确保客户端支持UDP组播 - 检查网络是否支持组播 - 确认组播地址和端口配置正确 - 使用FFmpeg或GStreamer等工具进行调试 - 检查防火墙设置 ### 8. 程序无法正常退出 **症状**:按Ctrl+C后程序无法正常退出。 **解决方案**: - 确保使用最新版本的程序 - 检查是否有线程阻塞 - 使用`kill -SIGTERM `强制终止 ## 示例配置 ### 单摄像头,RTSP单播 ```ini [video1] format = MJPEG device = /dev/video0 width = 640 height = 480 fps = 30 fix_qp = 23 [server1] rtsp_port = 8554 stream_name = camera1 max_buf_size = 2000000 max_packet_size = 1500 bitrate = 2000 multicast_enable = false udp_multicast_enable = false ``` ### 双摄像头,RTSP组播 + UDP组播H264裸流 ```ini [video1] format = MJPEG device = /dev/video0 width = 640 height = 480 fps = 30 fix_qp = 23 [video2] format = MJPEG device = /dev/video1 width = 640 height = 480 fps = 30 fix_qp = 23 [server1] rtsp_port = 8554 stream_name = camera1 max_buf_size = 2000000 max_packet_size = 15000 bitrate = 2000 multicast_enable = true multicast_address = 239.0.0.1 multicast_rtp_port = 10000 multicast_rtcp_port = 10001 multicast_ttl = 1 udp_multicast_enable = true udp_multicast_address = 239.0.0.1 udp_multicast_port = 20000 udp_multicast_ttl = 1 [server2] rtsp_port = 8555 stream_name = camera2 max_buf_size = 2000000 max_packet_size = 15000 bitrate = 2000 multicast_enable = true multicast_address = 239.0.0.2 multicast_rtp_port = 10002 multicast_rtcp_port = 10003 multicast_ttl = 1 udp_multicast_enable = true udp_multicast_address = 239.0.0.2 udp_multicast_port = 20002 udp_multicast_ttl = 1 ``` ## 技术细节 ### RTSP服务器实现 - 基于Live555库实现 - 支持单播和组播媒体会话 - 支持H.264编码 - 支持多个流同时传输 ### UDP组播H264裸流实现 - 使用原始UDP socket发送H264裸流 - 支持组播TTL配置 - 支持自定义数据包大小 - 线程安全的数据发送 ### 视频转码 - 基于Rockchip MPP进行H.264编码 - 支持多种输入格式(MJPEG, YUY2, NV12等) - 支持固定QP值控制 - 支持多线程处理 ## 许可证 请参考LICENSE文件了解项目的许可证信息。 ## 贡献 欢迎提交Issue和Pull Request来改进这个项目。