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