RTSP 服务器基础示例
源码位置: samples/network/micro-rtsp-c/basic_stream 查看源码
功能说明
演示如何使用 micro-rtsp-c 库搭建基础的 RTSP 视频流服务器,通过 WiFi 网络传输预先准备的静态 JPEG 图片,支持标准 RTSP 客户端(如 VLC、ffplay)接入播放。
本示例实现了完整的 RTSP 服务器功能,包括 OPTIONS、DESCRIBE、SETUP、PLAY、TEARDOWN 命令处理,支持 TCP 和 UDP 两种传输模式,并自动处理 JPEG 量化表传输以保证图像质量。
硬件连接
本示例使用芯片内部 WiFi 外设,无需额外接线。
串口输出:
串口 TX: PA3
波特率:921600
示例内容
初始化 WiFi 并连接到指定 AP
通过 DHCP 获取 IP 地址
在 8554 端口启动 RTSP 服务器
等待客户端连接(支持 RTSP over TCP/UDP)
循环发送两张静态 JPEG 图片(800x600),每秒 2 帧
处理客户端的 RTSP 协议请求并响应
编译
重要提示:在编译前,请先确认您使用的开发板型号。SDK 目前支持以下开发板:
arcs_evb - ARCS EVB 评估板
arcs_mini - ARCS Mini 开发板
根据您的开发板型号,选择对应的编译命令:
在示例目录下执行编译:
# 使用 arcs_evb 开发板
./build.sh -C -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -DBOARD=arcs_mini
Note
如果在 SDK 根目录执行,需要指定示例路径:
# 使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_mini
Note
确保已安装对应的工具链。
烧录
编译完成后,使用 SDK tools 目录下的 cskburn 工具烧录固件:
./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs
Note
烧录参数说明:
-s /dev/ttyUSB0:串口设备路径,需要根据实际情况修改 - Linux 系统:通常是/dev/ttyUSB0或/dev/ttyACM0- 可通过ls /dev/tty*命令查看可用串口设备 - 不同开发板或 USB 转串口芯片可能使用不同的设备名-b 3000000:烧录波特率(3Mbps)0x0:烧录起始地址build/arcs.bin:编译生成的固件路径-C arcs:芯片类型
注意事项:
确保开发板已正确连接到电脑
如果无法识别串口设备,请检查 USB 连接线是否正常,或尝试其他 USB 端口
预期输出
串口输出:
[rtsp-test] RTSP Server Starting...
[rtsp-test] WiFi auto-connect started
[rtsp-test] Waiting for WiFi connection and IP address...
[rtsp-test] DHCP Success on VIF-0: IP=192.168.137.166
[rtsp-test] WiFi connected and IP obtained
[rtsp-test] Starting RTSP server on port 8554
+ UDP socket created successfully: sock=10 port=6970
+ UDP socket created successfully: sock=11 port=6971
+ init_udp_transport: SUCCESS - rtp_port=10 rtp_port=6970 rtcp_sock=11 rtcp_port=6971
[rtsp-test] client connected: 192.168.137.1
+ RTSP command: DESCRIBE
+ validate_stream_id: streamer(mjpeg/1) vs command(mjpeg/1) -> stream_id=0
+ RTSP command: SETUP
+ Video SETUP: client_port=54224-54225 server_port=6970-6971
+ RTSP command: PLAY
+ PLAY: enabled streaming (is_streaming=1, is_tcp=0, video_port=54224, audio_port=0)
客户端播放:
使用 ffplay 播放(UDP 模式):
ffplay -rtsp_transport udp rtsp://192.168.32.236:8554/mjpeg/1 -fflags nobuffer -flags low_delayffplay -rtsp_transport udp rtsp://192.168.137.166:8554/mjpeg/1
使用 ffplay 播放(TCP 模式):
ffplay -rtsp_transport tcp rtsp://192.168.32.236:8554/mjpeg/1 -fflags nobuffer -flags low_delay打开网络串流 -> rtsp://192.168.137.166:8554/mjpeg/1
预期看到两张图片交替显示,帧率约 2fps。
核心 API
API |
说明 |
|---|---|
|
初始化 RTSP 流媒体服务 |
|
初始化 RTSP 会话 |
|
设置 RTSP 服务器 URI |
|
添加客户端会话 |
|
启动 RTSP 服务 |
|
发送视频帧数据 |
|
处理客户端 RTSP 命令 |
关键代码
初始化 RTSP 服务器:
rtsp_streamer_t streamer;
rtsp_session_t session;
// 初始化流媒体服务,设置分辨率为 800x600
rtsp_streamer_init(&streamer, 800, 600);
// 初始化会话
rtsp_session_init(&session, client, &streamer);
rtsp_streamer_set_uri(&streamer, "0.0.0.0:8554", "mjpeg", "1");
// 添加会话到流媒体服务
rtsp_streamer_add_session(&streamer, &session);
发送视频帧:
while (!session.is_stopped) {
// 处理 RTSP 命令(非阻塞,1ms 超时)
rtsp_streamer_start(&streamer, 1);
if (session.is_streaming) {
// 发送 JPEG 图片
rtsp_streamer_stream_frame(&streamer, capture_buff, capture_buff_len, 100);
// 帧间隔 500ms (2fps)
lisa_thread_mdelay(500);
}
}
配置说明
WiFi 配置(main.c):
#define TARGET_WIFI_SSID "Your_SSID" // WiFi SSID
#define TARGET_WIFI_PWD "Your_Password" // WiFi 密码
RTSP 服务器配置:
// RTSP 监听端口(标准端口 8554)
serv_addr.sin_port = htons(8554);
// 视频分辨率(需与实际图片一致)
rtsp_streamer_init(&streamer, 800, 600);
传输优化参数(streamer.c):
#define MAX_FRAG_SIZE 950 // RTP 包片段大小(字节)
注意事项
WiFi 配置:需修改
TARGET_WIFI_SSID和TARGET_WIFI_PWD为实际的 WiFi 信息图片分辨率:示例中的静态图片为 800x600,需确保
rtsp_streamer_init()的分辨率参数与之匹配量化表传输:示例图片使用自定义量化表,已自动在第一个 RTP 包中传输,确保颜色准确
UDP 丢包:
默认使用 UDP 传输,网络不稳定时可能丢包
可在客户端使用 TCP 模式:
ffplay -rtsp_transport tcp rtsp://...片段大小(950字节)和延迟(200μs)已优化以减少丢包
防火墙:确保 8554 端口(RTSP)和 6970-6971 端口(RTP/RTCP)未被防火墙阻止
客户端兼容性:
VLC:支持 TCP/UDP,推荐使用
ffplay:支持 TCP/UDP,可通过
-rtsp_transport参数选择Chrome 浏览器:不直接支持 RTSP,需使用插件或转码
内存管理:每个客户端连接会占用约 3KB 内存,同时支持多客户端时需注意内存使用