从零开始精通RTSP之扩展命令详解

概述

RTSP是一种网络流媒体协议,用于建立和控制媒体服务器。除了基本的命令(比如:OPTIONS、DESCRIBE、SETUP、 PLAY、PAUSE、TEARDOWN)以外,RTSP还支持一些扩展命令,这些扩展命令提供了更多的控制选项和功能。常用的扩展命令包括:GET_PARAMETER、SET_PARAMETER、REDIRECT、RECORD、ANNOUNCE等,下面将逐一进行介绍。

GET_PARAMETER

客户端可以发送GET_PARAMETER命令,向服务器询问与当前会话或媒体流相关的特定参数值。这些参数可能包括但不限于:音视频编码参数、传输参数、服务质量参数、设备状态信息等。通过获取这些参数,客户端可以了解流媒体服务的实际运行状态,以便进行相应的调整或优化。

GET_PARAMETER命令的基本格式如下。

html 复制代码
GET_PARAMETER rtsp://example.com/path/to/stream RTSP/1.0
CSeq: <sequence-number>
Session: <session-id>

<parameter-name-list>

其中,<parameter-name-list>部分包含一个或多个以逗号分隔的参数名称,表示客户端希望查询的具体参数。如果省略这部分内容,服务器应返回所有支持的参数及其当前值。

比如:我们想要查询媒体流的视频码率参数和音频编码格式参数,客户端可以发送如下的GET_PARAMETER请求。

html 复制代码
GET_PARAMETER rtsp://example.com/path/to/stream RTSP/1.0
CSeq: 6
Session: 12345678

video-bitrate,audio-codec

服务器接收到请求后,可能的回复如下。

html 复制代码
RTSP/1.0 200 OK
CSeq: 6
Session: 12345678

video-bitrate: 2000kbps
audio-codec: AAC

SET_PARAMETER

客户端可以使用SET_PARAMETER命令更改媒体流的编码参数、传输参数、服务质量参数等,以适应网络条件变化、用户需求变动或设备状态调整。比如:调整视频分辨率、比特率、帧率,或者改变传输协议、端口、缓冲策略等。另外,SET_PARAMETER命令还支持远程控制媒体设备(比如:网络摄像头),比如:调整摄像头角度、开启/关闭红外夜视、调节音量等。在某些情况下,还可用于执行会话管理操作,比如:暂停/恢复流、重新配置会话、更新安全凭证等。

SET_PARAMETER命令的基本格式如下。

html 复制代码
SET_PARAMETER rtsp://example.com/path/to/stream RTSP/1.0
CSeq: <sequence-number>
Session: <session-id>

<parameter-value-list>

其中,<parameter-value-list>部分包含一个或多个以逗号分隔的参数名-值对,表示客户端希望设置的具体参数及其新值。每个参数名与对应的值之间,用等号(=)进行连接。

比如:我们想要视频流的码率降低至600kbps,客户端可以发送如下的SET_PARAMETER请求。

html 复制代码
SET_PARAMETER rtsp://example.com/path/to/stream RTSP/1.0
CSeq: 7
Session: 12345678

video-bitrate=600kbps

又比如:我们想要调整摄像头的变焦和焦距,客户端可以发送如下的SET_PARAMETER请求。

html 复制代码
SET_PARAMETER rtsp://example.com/path/to/stream RTSP/1.0
CSeq: 8
Session: 12345678

focus=auto,zoom=2x

REDIRECT

REDIRECT是服务器的响应命令,而不是客户端的请求命令,通常发生在以下三种应用场景中。

1、负载均衡:当服务器集群中的某台服务器负载过高时,通过REDIRECT命令引导客户端连接到负载较低的服务器,以实现流量均衡。

2、服务器迁移:在维护、升级或硬件故障等情况下,服务器可能需要临时或永久地将服务迁移到新的地址。通过REDIRECT命令,服务器可以通知客户端使用新的URL继续访问流媒体资源。

3、网络拓扑变化:在网络架构调整或客户端移动到不同子网时,REDIRECT命令可以帮助客户端快速适应新的网络环境,找到最优的服务器接入点。

REDIRECT命令的基本格式如下。

html 复制代码
REDIRECT rtsp://new-server-ip/new-path RTSP/1.0
CSeq: <sequence-number>
Session: <session-id>
Location: rtsp://new-server-ip/new-path

<optional-message-body>

其中,Location是一个消息头字段,重复新URL以供客户端参考。虽然不是必需的,但在实践中通常包含以提高可读性和一致性。

比如:客户端正在与服务器A交互,服务器A因负载过高发出如下的REDIRECT命令。客户端收到响应后,按照指示将后续的RTSP请求发送到新的服务器B。

html 复制代码
REDIRECT rtsp://server-B.example.com/streaming/video RTSP/1.0
CSeq: 9
Session: 12345678
Location: rtsp://server-B.example.com/streaming/video

Server is overloaded. Please connect to the provided URL for continued service.

RECORD

RECORD(有的厂商叫X-RECORD)命令通常用于指示服务器开始或停止对特定媒体流的录制。它允许客户端发起一个请求,使服务器开始捕获并存储媒体数据,或者停止正在进行的录制。这一命令主要应用于支持录像功能的IPC、NVR或其他具备录制能力的流媒体设备。

RECORD命令的基本格式如下。

html 复制代码
RECORD rtsp://example.com/path/to/stream RTSP/1.0
CSeq: <sequence-number>
Session: <session-id>

<optional-parameters>

其中,<optional-parameters>可能包含与录制相关的附加信息,比如:录制文件的名称、存储位置、录制时长等,具体参数取决于设备或软件的具体实现。由于RECORD或X-RECORD并非标准RTSP命令,其具体格式可能会因设备制造商或软件供应商的不同而有所差异。

服务器对RECORD或X-RECORD命令的响应通常会返回一个状态码,表示命令是否成功执行。成功时的响应报文可参考如下。

html 复制代码
RTSP/1.0 200 OK
CSeq: <sequence-number>
Session: <session-id>

Recording started successfully.

失败时的响应报文可参考如下。

html 复制代码
RTSP/1.0 403 Forbidden
CSeq: <sequence-number>
Session: <session-id>

Recording not allowed for this resource.

ANNOUNCE

ANNOUNCE命令用于向服务器发送SDP描述,以便服务器了解客户端的媒体能力和需求。这个命令在建立会话时非常有用,主要用于以下两种场景。

1、流媒体发布通知:在某些流媒体服务器或客户端实现中,ANNOUNCE命令可能被用作一种预通知机制,让服务器知道客户端即将开始推送一个新的流媒体资源。客户端发送ANNOUNCE命令时,可能附带有即将推送流的详细描述,比如:媒体类型、编码参数、传输方式等,这些信息可能以SDP格式进行封装。

2、设备状态更新:在某些支持RTSP的网络摄像头或其他设备上,ANNOUNCE命令可能用于设备向服务器报告其状态变更,比如:摄像头方向调整、传感器参数变化等。这种情况下,ANNOUNCE命令携带的信息可能与具体的设备功能和控制接口相关。

由于ANNOUNCE命令并非RTSP标准的一部分,其具体语义、格式和用法可能会因不同的设备制造商、软件供应商或特定应用的需求而有所差异。

比如:一个IPC摄像头希望通过ANNOUNCE命令发送即将推送流的详细描述,包括媒体类型、编码参数、传输方式等信息,这些信息以SDP格式封装,具体的报文可参考如下。

html 复制代码
ANNOUNCE rtsp://example.com/path/to/stream RTSP/1.0
CSeq: 10
Session: 12345678
Content-Type: application/sdp

v=0
o=- 12345678 12345678 IN IP4 192.0.2.100
s=Cam1 Video Stream
i=A live video stream from Cam1
t=0 0
a=range:npt=now-
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:512k
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=42e01f;sprop-parameter-sets=Z0LAHtkKQpBd8kAAADAAgAAAMAAgA=,aMljiA==
a=control:trackID=1
a=framerate:30
a=transform:width=1920,height=1080

总结

可以看到,RTSP的扩展命令为流媒体应用提供了更丰富的控制选项和功能。通过熟练掌握这些命令,我们可以更好地控制和管理流媒体服务器,从而实现更高效的流媒体传输和更优质的用户体验。

相关推荐
oushaojun21 个月前
win10中使用ffmpeg和MediaMTX 推流rtsp视频
ffmpeg·rtsp·mediamtx
xiejiashu1 个月前
一种简单高效的RTSP流在线检测方法,不需要再过渡拉流就可以获取设备状态以及对应音视频通道与编码格式
rtsp·easynvr·rtsp在线检测·rtsp拉流·easynvr管理
freeabc2 个月前
利用 OBS 推送 WEBRTC 流到 smart rtmpd
服务器·webrtc·rtmp·rtsp·sfu·whip/whep
从后端到QT2 个月前
RTSP 音视频play同步分析
网络·rtp·rtsp
橘色的喵3 个月前
RtspServer:轻量级RTSP服务器和推流器
视频·推流·rtp·rtsp·rtspserver·xop
xiejiashu3 个月前
亲测有效,长期有效的RTSP流地址公网RTSP地址,各种类型的视频源
rtsp·live555·easyrtspserver·公网rtsp地址·rtsp公网地址
superconvert3 个月前
主流流媒体的综合性能大 PK ( smart_rtmpd, srs, zlm, nginx rtmp )
websocket·ffmpeg·webrtc·hevc·rtmp·h264·hls·dash·rtsp·srt·flv
EasyCVR4 个月前
视频技术未来展望:EasyCVR如何引领汇聚融合平台新趋势
人工智能·tcp/ip·音视频·rtsp·gb28181
千里马学框架4 个月前
live555编译运行笔记
android·笔记·车载系统·rtsp·live555·系统工程师
EasyCVR4 个月前
安防视频汇聚平台EasyCVR启动后无法访问登录页面是什么原因?
人工智能·音视频·rtsp·gb28181