RTSP视频流开发经验总结

					            	**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.代码规范.写代码时多思考

你可能感兴趣的:(RTSP)