嵌入式音视频开发——RTSP协议

张开发
2026/4/17 7:26:36 15 分钟阅读

分享文章

嵌入式音视频开发——RTSP协议
嵌入式音视频开发——RTSP协议一、RTSP协议核心定位1.1 一句话定义RTSP(Real-Time Streaming Protocol,实时流协议)是专门用于控制音视频流媒体播放的应用层协议,你可以把它理解为流媒体的"遥控器"——它不负责传输音视频数据本身,只负责发送"播放、暂停、快进、停止"等控制命令,是嵌入式音视频领域(IPC摄像头、NVR、车载监控、无人机图传)最核心的协议之一。1.2 铁三角分工(必懂)初学者最容易混淆这三个协议,它们是嵌入式音视频流媒体的标准组合,各司其职:协议全称核心职责传输方式默认端口类比RTSP实时流协议建立/控制媒体会话(播放、暂停、快进、定位、关闭)TCP554电影院的遥控器RTP实时传输协议传输实际的音视频数据(H.264/H.265视频、G.711/AAC音频)UDP(优先)/TCP随机偶数端口电影放映机的胶片RTCPRTP控制协议监控传输质量(丢包率、延迟、抖动)、同步音视频UDPRTP端口+1放映员的对讲机关键结论:RTSP只负责"发号施令",真正的音视频数据走RTP,RTCP负责"质量反馈"。1.3 RTSP核心特点双向控制:客户端可以控制服务器,服务器也可以主动通知客户端(如流断开、异常)媒体无关:支持任何格式的音视频流(H.264/H.265、MJPEG、AAC、G.711等)传输无关:可以基于UDP、TCP、HTTP等多种传输层协议状态保持:服务器会维护每个客户端的会话状态(播放中、暂停中、已停止)嵌入式友好:协议轻量,实现简单,适合资源有限的嵌入式设备1.4 嵌入式领域典型应用场景IPC网络摄像头:几乎所有网络摄像头都支持RTSP协议输出视频流NVR网络硬盘录像机:通过RTSP协议从IPC拉取视频流并存储车载监控系统:车内摄像头通过RTSP将视频传输到中控屏无人机图传:无人机通过RTSP将实时画面传输到遥控器视频会议系统:点对点或多点视频会议的媒体控制二、RTSP协议完整工作流程2.1 整体流程概览RTSP工作流程分为6个标准阶段,所有RTSP设备(海思/瑞芯微IPC、NVR等)都严格遵循:TCP连接建立(RTSP基于TCP)OPTIONS:询问服务器支持的命令DESCRIBE:获取媒体信息(SDP描述文件)SETUP:建立音视频传输通道PLAY:开始播放(服务器开始发送RTP数据)TEARDOWN:结束会话并释放资源2.2 逐步骤详解(含真实报文)步骤1:建立TCP连接客户端主动连接服务器的554/TCP端口这一步和HTTP连接完全一致,是所有RTSP命令的传输通道步骤2:OPTIONS(查询能力)客户端发送:OPTIONS rtsp://192.168.1.100/stream1 RTSP/1.0 CSeq: 1 User-Agent: MyClient服务器回复:RTSP/1.0 200 OK CSeq: 1 Public: OPTIONS, DESCRIBE, SETUP, PLAY, TEARDOWN作用:确认服务器支持哪些RTSP操作,保证后续命令能正常执行。步骤3:DESCRIBE(获取媒体信息)客户端发送:DESCRIBE rtsp://192.168.1.100/stream1 RTSP/1.0 CSeq: 2 Accept: application/sdp服务器回复(SDP描述文件):v=0 o=- 12345 12345 IN IP4 192.168.1.100 s=RTSP Session m=video 0 RTP/AVP 96 a=rtpmap:96 H264/90000 m=audio 0 RTP/AVP 8 a=rtpmap:8 PCMA/8000SDP核心信息:视频编码:H.264,时钟频率90000Hz音频编码:G.711 a-law,时钟频率8000Hz负载类型:视频96,音频8作用:让客户端知道如何解码、如何接收RTP数据。步骤4:SETUP(建立传输通道,最关键)需要为每一路媒体(视频、音频)分别发送SETUP命令:视频通道SETUP:SETUP rtsp://192.168.1.100/stream1/track1 RTSP/1.0 CSeq: 3 Transport: RTP/AVP;unicast;client_port=5000-5001服务器回复:RTSP/1.0 200 OK CSeq: 3 Session: 12345678 Transport: RTP/AVP;unicast;client_port=5000-5001;server_port=6000-6001关键信息:客户端用5000端口接收视频RTP,5001端口接收视频RTCP服务器分配Session ID: 12345678,后续所有命令必须携带音频通道同理,trackID通常为track2,端口为5002-5003步骤5:PLAY(开始播放)客户端发送:PLAY rtsp://192.168.1.100/stream1 RTSP/1.0 CSeq: 5 Session: 12345678 Range: npt=0.000-服务器回复:RTSP/1.0 200 OK CSeq: 5 Session: 12345678 RTP-Info: url=track1;seq=1234;rtptime=5678重要变化:从这一刻起,服务器不再通过RTSP连接发送数据,而是直接通过UDP向约定的端口发送RTP音视频数据包。步骤6:播放过程控制(可选)PAUSE:暂停推流PLAY:恢复播放GET_PARAMETER:获取当前播放状态SET_PARAMETER:设置播放参数(如音量)步骤7:TEARDOWN(结束会话)客户端发送:TEARDOWN rtsp://192.168.1.100/stream1 RTSP/1.0 CSeq: 6 Session: 12345678服务器回复:200 OK服务器停止发送RTP数据释放Session资源关闭UDP端口客户端可关闭TCP连接2.3 完整流程图客户端 服务器 | | |--- TCP 连接 -----| | | |--- OPTIONS ------| |--- 200 OK -------| | | |--- DESCRIBE -----| |----- SDP --------| | | |--- SETUP 视频 ---| |-- Session ID ----| | | |--- SETUP 音频 ---| |-- Session ID ----| | | |----- PLAY -------| | | |==== RTP 流 ======| 视频+音频持续传输 | | |--- TEARDOWN -----| |--- 200 OK -------| | | └── TCP 断开 ───────┘三、RTSP客户端代码实现3.1 解析H.264帧的RTSP客户端代码功能:完整RTSP标准流程实现独立UDP Socket接收RTP数据解析RTP头部信息支持H.264 RTP两种封装格式(单NALU + FU-A分片重组)保存为可直接播放的.h264文件完整代码(rtsp_h264_client.c):#includestdio.h#includestdlib.h#includestring.h#includeunistd.h#includesys/socket.h#includenetinet/in.h#includearpa/inet.h#defineRTSP_PORT554#defineRTP_CLIENT_PORT5000#defineBUFFER_SIZE1024*64#defineCSEQ_START1// 全局变量intrtsp_sock;// RTSP TCP Socketintrtp_sock;// RTP UDP Socketintcseq=CSEQ_START;charsession_id[64]={0};charbuffer[BUFFER_SIZE];FILE*h264_file;// 输出的.h264文件// H.264相关状态intfu_started=0;// FU-A分片是否开始unsignedcharfu_nalu_type=0;// FU-A重组后的NALU类型// 1. TCP连接RTSP服务器intrtsp_connect(constchar*ip){struct

更多文章