rtp、rtsp客户端开发流程

59 篇文章 0 订阅
13 篇文章 1 订阅


环境:VLC做服务器,url:rtsp://192.168.100.77:8554/1

              rtsp链路采用tcp链接

              rtp采用udp

关于rtp、rtsp、rtcp的知识,这里不做详细解释,网上有大把的资料,用户可以自己问度娘。这里直接切入正题。


PS:这里还需要唠叨一点,rtsp为字符协议,字符协议中含大量不可见字符空格、tab、换行符等等,但是这些不可见字符如果不对,服务器是无法解析协议的。所以在调试字符协议时最好的方法是使用抓包工具,抓取正确的数据包,然后自己跟着模仿最快,当然你也可以看rfc文档。

1、rtsp客户端

step1:创建一个tcp socket,链接到192.168.100.77:8554上


step2:发送OPTIONS

OPTIONS rtsp://192.168.100.77:8554/1 RTSP/1.0
CSeq: 1
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)

等待应答,接收到应答如下:

RTSP/1.0 200 OK
Server: VLC/2.2.4
Content-Length: 0
Cseq: 1
Public: DESCRIBE,SETUP,TEARDOWN,PLAY,PAUSE,GET_PARAMETER

#PS:CSeq 表示sn,每条指令自动加1即可


step3:发送DESCRIBE

DESCRIBE rtsp://192.168.100.77:8554/1 RTSP/1.0
CSeq: 2
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Accept: application/sdp

等待应答,接收到应答如下:

RTSP/1.0 200 OK
Server: VLC/2.2.4
Date: Fri, 24 Feb 2017 02:01:14 GMT
Content-Type: application/sdp
Content-Base: rtsp://192.168.100.77:8554/1
Content-Length: 563
Cache-Control: no-cache
Cseq: 2

v=0
o=- 15878023685032985736 15878023685032985736 IN IP4 XZS201603082
s=Unnamed
i=N/A
c=IN IP4 0.0.0.0
t=0 0
a=tool:vlc 2.2.4
a=recvonly
a=type:broadcast
a=charset:UTF-8
a=control:rtsp://192.168.100.77:8554/1
m=audio 0 RTP/AVP 14
b=AS:128
b=RR:0
a=rtpmap:14 MPA/90000/2
a=control:rtsp://192.168.100.77:8554/1/trackID=2
m=video 0 RTP/AVP 96
b=RR:0
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=64001f;sprop-parameter-sets=Z2QAH6zZQPARfvARAAADAAEAAAMAMo8YMZY=,aOvjyyLA;
a=control:rtsp://192.168.100.77:8554/1/trackID=3

#PS:这里的trackID=3需要解析处理,下面setup指令要用到。

a=control的值可能是相对的URL,也可能是绝对的URL。判断相对还是绝对的方法参见RFC1808。(估计就是是否有串“://”)

如果a=control的值是相对的则从Content-Base,Content-Location,request URL中去获得基路径。如果a=control的值为*,则使用的值即为Content-Base,Content-Location,request URL的值。request URL指DESCRIBE时的url。因为a=control是在DESCRIBE后返回的sdp中存放的。



step4、发送SETUP

SETUP rtsp://192.168.100.77:8554/1/trackID=3 RTSP/1.0
CSeq: 3
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Transport: RTP/AVP;unicast;client_port=52930-52931

#PS:这里注意client_port=52930-52931,client的后面52930是rtp端口,52931是rtcp端口,这里告诉了服务器,客户端接收rtp数据端口,服务器发送rtp数据时发送到52930端口上

等待应答,接收到应答如下:

RTSP/1.0 200 OK
Server: VLC/2.2.4
Date: Fri, 24 Feb 2017 02:01:16 GMT
Transport: RTP/AVP/UDP;unicast;client_port=52930-52931;server_port=54545-54546;ssrc=7009A25D;mode=play
Session: 1cc1373972ac1e0b;timeout=60
Content-Length: 0
Cache-Control: no-cache
Cseq: 3

#PS:这里注意三个字段,需要做解析。Session: 1cc1373972ac1e0b,一个64字节的session,setup获取session之后,rtsp所有的指令都需要发送该session,表明你当前会话窗口;timeout=60超时时间,如果超过60s rtsp链路上没有任何数据,当前session的所有链接、活动都会结束;server_port=54545-5454654545表示服务器rtp数据发送端口,54546表示服务器rtcp端口


step5:发送PLAY

PLAY rtsp://192.168.100.77:8554/1 RTSP/1.0
CSeq: 4
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Session: 1cc1373972ac1e0b
Range: npt=0.000-

等待应答,接收到应答如下:

RTSP/1.0 200 OK
Server: VLC/2.2.4
Date: Fri, 24 Feb 2017 02:01:18 GMT
RTP-Info: url=rtsp://192.168.100.77:8554/1/trackID=3;seq=50578;rtptime=3808865604
Range: npt=3582.742781-
Session: 1cc1373972ac1e0b;timeout=60
Content-Length: 0
Cache-Control: no-cache
Cseq: 4

#PS:在客户端发送play指令之后,需要启动rtp客户端在指定的端口(52930)上,接收UDP数据


step6:每隔固定时间发送心跳指令GET_PARAMETER

GET_PARAMETER rtsp://192.168.100.77:8554/1 RTSP/1.0
CSeq: 5
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Session: 1cc1373972ac1e0b
x-Timeshift_Range:

等待应答,接收到应答如下:

RTSP/1.0 200 OK
Server: VLC/2.2.4
Date: Fri, 24 Feb 2017 02:01:40 GMT
Session: 1cc1373972ac1e0b;timeout=60
Content-Length: 0
Cache-Control: no-cache
Cseq: 5


step7:发送TEARDOWN接收session

TEARDOWN rtsp://192.168.20.136:5000/xxx666 RTSP/1.0
CSeq: 6
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)

Session: 1cc1373972ac1e0b

等待应答,接收到应答如下:

RTSP/1.0 200 OK
Server: VLC/2.2.4
Cseq: 6
Session: 1cc1373972ac1e0b
Connection: Close



2、rtp客户端

step1、创建一个udp socket,绑定到固定的端口上

step2、将端口号传递给rtsp 客户端线程,rtsp 会在setup指令时通知服务器,rtp客户端udp所使用的端口

step3、一直在该socket上接收rtp服务器发送过来的udp数据包,进行组包、重传控制

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 实现RTSP客户端主要需要以下步骤: 1. 建立连接:RTSP客户端需要连接到RTSP服务器,并通过发送OPTIONS请求来获取服务器支持的方法,以确定如何与服务器交互。 2. 发送DESCRIBE请求:客户端将发送一个DESCRIBE请求,以获取服务器提供的URL连接的详细信息。该信息包括流的编码格式、从哪里开始播放和音频视频的数据格式等。 3. 发送SETUP请求:客户端通过发送SETUP请求来建立客户端和服务器之间的RTP/RTCP端口连接。客户端会发出SETUP请求,获得前面DESCRIBE请求中获得的流信息。 4. 发送PLAY请求:客户端需要发送PLAY请求来开始播放媒体流。该请求将触发服务器向客户端发送媒体流的数据。 5. 监听流:客户端需要通过相关技术监视流并从服务器中接收流的数据,同时将从服务器中接收到的数据解码并播放出来。 6. 发送TEARDOWN请求:当客户端结束播放时,应该发送一个TEARDOWN请求以告诉服务器关闭该流。 以上是RTSP客户端的实现步骤,具体实现可以使用Java、C++或Python等编程语言实现。实现时需要注意错误处理和异常情况。 ### 回答2: 实现一个RTSP客户端需要具备以下步骤: 1. 了解RTSP协议:RTSP协议是一个实时流式传输协议,需要深入了解其协议结构、命令和状态码等相关知识。 2. 创建交互连接:使用原始套接字,创建与RTSP服务器之间的TCP连接。 3. 发送RTSP请求:客户端需要构造适当格式的RTSP请求,包括请求方法、URI、协议版本等信息,并使用TCP发送给服务器。 4. 接收RTSP响应:等待服务器响应并监听TCP套接字,将从服务器接收到的RTSP响应信息解析,包括状态行、header以及消息体。 5. 解析SDP:RTSP客户端获取session描述协议(SDP)信息,需要解析服务器在RTSP响应中返回的SDP报文。 6. 建立RTP连接:解析SDP信息后,程序就会知道RTP和RTCP端口号等信息,客户端要在相应端口打开UDP socket以建立RTP连接和RTCP连接。 7. 播放实时流:通过RTP连接获取实时流数据,使用合适的技术播放数据,例如使用ffmpeg库解码和渲染。 实现一个RTSP客户端需要考虑到不同平台的API、TCP/IP网络编程、音视频流媒体等不同领域的知识。需要耐心、细心地调试和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值