VLC做RTSP服务器,自己写客户端与服务器命令交互demo

来源:互联网 发布:团队复制优化方案 编辑:程序博客网 时间:2024/06/06 00:47

最近在看RTSP协议(当然没去看协议文本),网上的资料要么泛泛而谈,千篇一律,要么就是自己实现的简单RTSP服务器和客户端,交互稍显随意,就是个常规的C/S的应答程序,不太正规,因此自己写个客户端与vlc交互,验证交互过程,把其中的体会和要点记录下来,与大家分享。 

说明:本demo仅仅是演示RTSP的命令交互过程,并没有真正的传输和播放视频。

如果对于RTSP交互命令的说明和返回的SDP信息不是很了解,可以先看看这篇文章  《TSP协议学习笔记》

关于使用VLC搭建RTSP服务器的方法,网上很多,可以参考这个 《VLC搭建RTSP服务器的过程 -测试通过》

注意事项:
   我测试时,发现请求的资源文件,不能是TS文件和flv文件, 返回的sdp信息为空,因此我测试的视频资源是常规的电影(rmvb,mkv这些格式的都可以)


ok,现在假设VLC服务器搭建成功了,请求URL为 rtsp://192.168.3.153:8554/my

首先当然是新建tcp socket,地址为192.168.3.153,端口为8554,连接成功后就可以交互了.


第1步 发送OPTIONS命令,其实就是一个带换行符的字符串而已,如下

 OPTIONS rtsp://192.168.3.153:8554/my RTSP/1.0
 CSeq: 1


注意,看起来2行字符,实际上是3行,下面一行是空行"",而已空行也要加"\n"才行

生成 命令字符串并发送的伪代码如下:

string strInfo = "OPTIONS rtsp://192.168.3.153:8554/my RTSP/1.0";strInfo +="\n";   //换行strInfo += "CSeq: 1"; // 序号是累加的,这里只是示例而已strInfo +="\n";   strInfo +="";     //添加结尾行并换行strInfo +="\n";  m_stspSocket.Send(strInfo.c_str(),strInfo.length());  //发送命令

反馈如下,包含了服务器支持的交互命令;

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


第2步 发送DESCRIBE命令,如下

DESCRIBE rtsp://192.168.3.153:8554/my RTSP/1.0
CSeq: 2
Accept: application/sdp



反馈如下:



可以看到,电影有音频和视频流,对应的访问URL分别是
rtsp://192.168.3.153:8554/my/trackID=0,  和
rtsp://192.168.3.153:8554/my/trackID=1,


注意,经测试,trackID的值是不固定的,有时候是0和1,有时候是2和3等,当然只要VLC服务器正常运行,每次发送DESCRIBE命令,反馈的trackID的值是不变的.

严格来说,需要解析反馈的sdp信息来获取trackID的值,不过我程序里偷懒写死的,如下:

// 申请音频传输string A_strInfo ="SETUP rtsp://192.168.3.153:8554/my/trackID=0 RTSP/1.0"; 

其中trackID=0,是测试时获取的sdp里的音视频流的访问URL,各位在运行demo发送SETUP命令时,要根据实际的trackID来进行处理.


第3步 针对音频和视频流发送SETUP命令,如下

SETUP rtsp://192.168.3.153:8554/my/trackID=0 RTSP/1.0
CSeq: 3
Transport: RTP/AVP;unicast;client_port=3106-3107

意思是说,请求服务器把音频数据发往客户端的3106(RTP端口)和3107(RTCP端口), 另外RTP/AVP表示UDP方式发送,这个也是从sdp信息来的,一般来说都是UDP方式.


反馈如下:
RTSP/1.0 200 OK
Server: VLC/2.2.4
Date: Fri, 11 Aug 2017 08:30:30 GMT
Transport: RTP/AVP/UDP;unicast;client_port=3106-3107;server_port=51147-51148;ssrc=FA022A5A;mode=play
Session: df0d87e250e9a970;timeout=60
Content-Length: 0
Cache-Control: no-cache
Cseq: 3


意思是说服务器以UDP单播的方式把数据推送到客户端的3106和3107端口,其他参数请自行查阅, 

这里有个参数Session: df0d87e250e9a970,我们要解析它,得到Session的值,后面的交互就需要添加Session参数了.


发送视频的SETUP命令如下:

SETUP rtsp://192.168.3.153:8554/my/trackID=1 RTSP/1.0
CSeq: 4
Transport:RTP/AVP;unicast;client_port=8352-8353
Session: df0d87e250e9a970


反馈为:
RTSP/1.0 200 OK
Server: VLC/2.2.4
Date: Fri, 11 Aug 2017 08:30:39 GMT
Transport: RTP/AVP/UDP;unicast;client_port=8352-8353;server_port=51148-51149;ssrc=2129361A;mode=play
Session: df0d87e250e9a970;timeout=60
Content-Length: 0
Cache-Control: no-cache
Cseq: 4


第4步 发送PLAY命令,如下
PLAY rtsp://192.168.3.153:8554/my RTSP/1.0
CSeq: 5
Session: df0d87e250e9a970
Range: npt=0-

其中 Range参数可以自行查阅,我们这里要求从头到尾播放


反馈如下:
RTSP/1.0 200 OK
Server: VLC/2.2.4
Date: Fri, 11 Aug 2017 08:30:45 GMT
RTP-Info: url=rtsp://192.168.3.153:8554/my/trackID=0;seq=19535;rtptime=2497397760, url=rtsp://192.168.3.153:8554/my/trackID=1;seq=9893;rtptime=2497397760
Range: npt=2465.661000-
Session: df0d87e250e9a970;timeout=60
Content-Length: 0
Cache-Control: no-cache
Cseq: 5


第5步 发送PAUSE命令,要求暂停音视频数据的发送,如下
PAUSE rtsp://192.168.3.153:8554/my RTSP/1.0
CSeq: 7
Session: df0d87e250e9a970

反馈如下
RTSP/1.0 405 Client error
Server: VLC/2.2.4
Date: Fri, 11 Aug 2017 08:31:00 GMT
Allow: DESCRIBE, TEARDOWN, PLAY, GET_PARAMETER
Content-Length: 0
Cache-Control: no-cache
Cseq: 7

这里报错405,也就是PAUSE方法不受支持,有点奇怪,第一步发送OPTIONS命令时,明明反馈是支持的.



第5步 发送TEARDOWN命令,关闭ssession,如下

TEARDOWN rtsp://192.168.3.153:8554/my RTSP/1.0
CSeq: 8
Session: df0d87e250e9a970

 反馈如下:
RTSP/1.0 200 OK
Server: VLC/2.2.4
Date: Fri, 11 Aug 2017 08:31:13 GMT
Session: df0d87e250e9a970;timeout=60
Content-Length: 0
Cache-Control: no-cache
Cseq: 8


到此,我们和RTSP服务器的交互就结束了,我们发PLAY命令时,服务器确实在推数据,只是我们没处理而已。

今天发现,原来发布的0积分的资源,自动变成需要1积分了,估计是CSDN的新规矩.
 
本文demo下载地址: http://download.csdn.net/download/heker2010/9929922



参考文章:
《TSP协议学习笔记》
http://blog.csdn.net/leixiaohua1020/article/details/11955341

RTSP协议简单分析
http://blog.csdn.net/e_a_s_t/article/details/45666453


阅读全文
0 0