**RTSP视频流开发**
RTSP视频开发:
1.使用VLC播放RTSP视频流,然后使用wireshark抓VLC的包,找到RTSP交互报文
2.报文如下:
OPTIONS rtsp://192.168.0.212:554/testStream RTSP/1.0 //客户端向服务器发送,说RTSP服务你又那些操作
CSeq: 2
User-Agent: LibVLC/3.0.4 (LIVE555 Streaming Media v2016.11.28)
RTSP/1.0 200 OK //RTSP服务器响应客户端
CSeq: 2
Date: Tue, Sep 01 2009 00:01:34 GMT
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER //RTSP响应客户端 说我这些操作
DESCRIBE rtsp://192.168.0.212:554/testStream RTSP/1.0 //客户端向服务器端发送DESCRIBE,用于得到URI所指定的媒体描述信息,一般是SDP信息。客户端通过Accept头指定客户端可以接受的媒体述信息类型。
CSeq: 3
User-Agent: LibVLC/3.0.4 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp
RTSP/1.0 200 OK //服务器响应
CSeq: 3
Date: Tue, Sep 01 2009 00:01:36 GMT
Content-Base: rtsp://192.168.0.212/testStream/
Content-Type: application/sdp
Content-Length: 495
//媒体播放的信息
v=0
o=- 1251763203553668 1 IN IP4 192.168.0.212
s=Session streamed by "testOnDemandRTSPServer"
i=testStream
t=0 0
a=tool:LIVE555 Streaming Media v2016.11.28
a=type:broadcast
a=control:*
a=range:npt=0-
a=x-qt-text-nam:Session streamed by "testOnDemandRTSPServer"
a=x-qt-text-inf:testStream
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:500
a=rtpmap:96 H264/90000 //采用视频采用H264格式
a=fmtp:96 packetization-mode=1;profile-level-id=640028;sprop-parameter-sets=Z2QAKKzoB4AiflQ=,aO48MA== //这个是音频 音频格式是AAC
a=control:track1
SETUP rtsp://192.168.0.212/testStream/track1 RTSP/1.0 //建议视频流
CSeq: 4
User-Agent: LibVLC/3.0.4 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP;unicast;client_port=49474-49475
RTSP/1.0 200 OK
CSeq: 4
Date: Tue, Sep 01 2009 00:01:36 GMT
Transport: RTP/AVP;unicast;destination=192.168.0.15;source=192.168.0.212;client_port=49474-49475;server_port=6970-6971
Session: FA18BF48;timeout=65
PLAY rtsp://192.168.0.212/testStream/ RTSP/1.0 //双方达成一致,开始播放视频
CSeq: 5
User-Agent: LibVLC/3.0.4 (LIVE555 Streaming Media v2016.11.28)
Session: FA18BF48
Range: npt=0.000-
RTSP/1.0 200 OK
CSeq: 5
Date: Tue, Sep 01 2009 00:01:36 GMT
Range: npt=0.000-
Session: FA18BF48
RTP-Info: url=rtsp://192.168.0.212/testStream/track1;seq=6674;rtptime=191607758
3.使用tcpdump这个抓包工具,在设备进行抓包,然后将抓的报文和PC机使用wireshark抓包进行对比,格式那个地方不对,就找花时间找问题所在,让你的设备的RTSP交互报文和PC机上抓包的RTSP交互报文格式一致.当时我遇到的问题是因为音频而导致的,我在大华球机上,不带音频的信息,我写好RTSP视频信息时,很高兴,然后向领导交叉,我的公司的设备播放客户的RTSP视频流时出现了问题,客户的视频带音频.然后我使用VLC播放客户的RTSP视频流,抓包,发现, 客户有两次SETUP 第一次时间里视频套截字建立,第二次是音频套接字建立.就是因为这个导致报文格式不一样.(对于H264结构不懂,可以看看这个http://www.iosxxx.com/blog/2017-08-09-%E4%BB%8E%E9%9B%B6%E4%BA%86%E8%A7%A3H264%E7%BB%93%E6%9E%84.html)
4.报文格式一样是,视频还播放不出来,当时我就纳闷,到底是为什么呢?只有一个办法就是抓包.获取到的视频数据,然后看看我拼帧是否拼对了,一看,my god.我的神啊,这是和我看开玩笑吗,我对视频帧处理,和抓包获取的视频帧完全牛头不对马嘴.然后我根据用户采用RTP对H264视频进行打包方式,进行拼帧,这个做完之后,发现视频卡顿,根据序列号进行判断是否设备丢包了,同时在设备进行抓包,比较,发现抓包的视频数据是连续的,然而设备却显示是丢包,这是为啥.我想了很久也是没有想明白这是为什么,当时想出现丢包,我就叫把视频给丢掉,然后等I帧来,才开始接受数据.后来我看一个大牛博客,上面说,因为延时设备没有收到包,你取数据时,没有取到,这个就造成丢包,然而设备还是接受到了.最后我把调用延时改小一点,视频问题解决了.
5.处理AAC音频,我做的很简单,将AAC数据给取出来,加上我公司的对AAC音频头.就这样RTSP视频流协议就做好了(AAC音频可以看这个博客https://blog.csdn.net/bsplover/article/details/7426476)
总结:
1.保持一颗乐观的心态.
2.找问题不能模糊化,要做到精确定位.
3.代码规范.写代码时多思考