AXIS安讯士网络摄像头RTSP读取视频流信息


      本人现在在做有关AXIS方面的应用,昨天花了一天时间终于读到了视频流数据,虽然是AXIS产品开发,但是我相信RTSP部分的内容对初学者应该会有一些帮助,可能会有错误的地方,希望大家更正。

      首先说的是,如果你能够从socket方面理解windows网络编程的话,那么无论RTSP还是RTP,或者可以说大部分网络协议,从本质上都是一样的,都是基于套接字socket的编程。这样的话RTSP就是轻车熟路了。

RTSP协议实现方式

      实时流协议(RTSP)是应用层协议,控制实时数据的传送。RTSP 提供了一个可扩展框架,使受控、按需传输实时数据(如音频与视频)成为可能。数据源包括现场数据与存储在剪辑中的数据。本协议旨在于控制多个数据发送会话,提供了一种选择传送途径(如UDP、组播UDP 与TCP)的方法,并提供了一种选择基于RTP (RFC1889)的传送机制的方法。

      RTSP和HTTP非常相似,在开发RTSP客户端程序时有几种方式可以选择:

         1. RTP/RTSP/TCP 采用RTSP通过TCP协议连接服务器,控制媒体流信息传输,然后通过此连接接收媒体流信息。

         2. RTP/RTSP/HTTP 通过HTTP协议携带RTS控制信息和RTP数据信息实现流媒体的传输,这种方式有一个好处就是可以顺利的通过防火墙。

         3. RTP/RTSP/UDP 采用RTSP通过TCP协议连接服务器,控制媒体流信息传输,并告知客户端UDP接收端口,然后通过UDP接收媒体流信息。

      各个服务器支持的方式可能不一样,大家要先准确知道服务器支持什么方式。

      RTSP发送指令格式:<CRLF>是回车换行("\r\n”)的意思

      COMMAND rtsp://<servername>/axis-media/media.amp [?<parameter>=<value>[&<parameter>=<value>...]] RTSP/1.0<CRLF>
      Headerfield1: val1<CRLF>
      Headerfield2: val2<CRLF>
      ...
      <CRLF>
      [Body]

      第一行包含有命令、协议、服务器地址、流媒体参数(编码方式、分辨率等)。

      接着是头信息,这和HTTP非常相似,AXIS RTSP常用信息头如下:

      Authorization :Authorization information from the client.
      CSeq :Request sequence number.
      Session :Session identifier (returned by server in SETUP response).
      Content-Length :Length of content.
      Content-Type :The media type of the content.
      User-Agent :Information about the client that initiates the request.

      Body就是要发送的信息实体。

      RTSP返回信息格式:

      RTSP/1.0 <Status Code> <Reason Phrase> <CRLF>
      Headerfield3: val3<CRLF>
      Headerfield4: val4<CRLF>
      ...
      <CRLF>
      [Body]

RTSP编程

      RTSP编程从原理上很简单,以方式1为例介绍RTSP编程的主要步骤:

      1. 建立WinSock:

      SOCKET sock(AF_INET,SOCK_STREAM,0);

      2. 与RTSP服务器建立TCP连接:

      connect(sock,server_addr,sizeof(server_addr));

      3. 发送RTSP指令,这一部分也是整个程序和其他协议不一样的部分:

      RTSP定义了很多方法,这里介绍AXIS开发中常用的几个:OPTIONS, DISCRIBE, SETUP, PLAY, PAUSE, TEARDOWN.

      OPTIONS指令:用于得到RTSP服务器支持的指令

      发送信息包如下:

      OPTIONS rtsp://<servername>/axis-media/media.amp RTSP/1.0

      CSeq: 1

      User-Agent: Axis AMC

      Authorization: Basic cm9vdDpwYXNz

 

      其中Authorization为身份验证信息,采用base64编码

      返回信息如下:

      RTSP/1.0 200 OK

      CSeq: 1
      Public: DESCRIBE, GET_PARAMETER, PAUSE, PLAY, SETUP, SET_PARAMETER, TEARDOWN
      Date: Sat, 16 Jun 2001 12:38:56 GMT

      4. DESCRIBE指令:得到媒体流的一个SDP(Session Description Protocol)描述

      DESCRIBE rtsp://<servername>/axis-media/media.amp?videocodec=h264&resolution=640x480 RTSP/1.0

      CSeq: 2

      Accept: application/sdp

      User-Agent: Axis MAC

      Authorization: Basic cm9vdDpwYXNz

 

      返回信息如下:

      RTSP/1.0 200 OK

      CSeq: 2
      Content-Type: application/sdp
      Content-Base: rtsp://172.16.200.254:554/axis-media/media.amp/
      Date: Sat, 16 Jun 2001 12:38:56 GMT
      Content-Length: 570
      v=0
      o=- 992695136526595 992695136526595 IN IP4 172.16.200.254
      s=Media Presentation
      e=NONE
      c=IN IP4 0.0.0.0
      b=AS:50000
      t=0 0
      a=control:rtsp://172.16.200.254:554/axis-media/media.amp?videocodec=h264&resolution=640x480
      a=range:npt=0.000000-
      m=video 0 RTP/AVP 96
      b=AS:50000
      a=framerate:25.0
      a=transform:1,0,0;0,1,0;0,0,1
      a=control:rtsp://172.16.200.254:554/axis-media/media.amp/trackID=1?videocodec=h264&resolution=640x480
      a=rtpmap:96 H264/90000
      a=fmtp:96 packetization-mode=1; profile-level-id=420029; sprop-parameter-sets=Z0IAKeKQFAe2AtwEBAeHiRFQ,aM48gA==

      5. SETUP指令:设置流媒体传输方式,让服务器给流分配资源,启动RTSP 会话。

      在SETUP指令中,需要多加一个信息头:

      Transport :Specify how the data stream is transported. Supported variants are

                         RTP/AVP;unicast;client_port=port1-port2

                         RTP/AVP;multicast;client_port=port1-port2

                         RTP/AVP/TCP;unicast

      在AXIS开发中,虽然datasheet说明支持UDP传输,但是选择方式一RTp/AVP时,服务器并不发送数据,只好用第三种方式RTP/AVP/TCP。

      当使用第三种方式的时候,可以在添加一个信息头,设置blocksize为64000:

      Blocksize :64000

      发送指令如下:

      SETUP rtsp://<servername>/axis-media/media.amp?videocodec=h264&resolution=640x480 RTSP/1.0

      CSeq: 3  

      Transport: RTP/AVP/TCP;unicast;

      Blocksize: 64000
      User-Agent: Axis MAC

      Authorization: Basic cm9vdDpwYXNz

 

      返回信息如下:

      RTSP/1.0 200 OK

      CSeq: 3
      Session: C306C41C; timeout=60
      Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=737F3A5E;mode="PLAY"
      Date: Sat, 16 Jun 2001 12:38:56 GMT

      这里有个地方要注意,返回信息中有一个Session:C306C41C;这个会议标识要存起来,在后边的指令中都要加入这个信息头以表示是同一个会话。

      6. PLAY指令:请求服务器开始给客户端发送流数据

      PLAY rtsp://<servername>/axis-media/media.amp?videocodec=h264&resolution=640x480 RTSP/1.0

      CSeq: 4
      User-Agent: Axis AMC
      Session: C306C41C
      Authorization: Basic cm9vdDpwYXNz

 

      返回信息如下:

      RTSP/1.0 200 OK

      CSeq: 4

      Session: C306C41C
      Range: npt=0-
      RTP-Info: url=rtsp://172.16.200.254:554/axis-media/media.amp/trackID=1?videocodec=h264&resolution=640x480;seq=42296;rtptime=295889231
      Date: Sat, 16 Jun 2001 12:38:57 GMT

      此命令返回成功之后,服务器应该就开始发送RTP数据包了,接下来就接受这些数据报。

      7. PAUSE和TEARDOWN就不一一介绍了,直接讲接收RTP数据包

      int size=recv(sock,(char *)pos,i_size,0);

      可以使用wireshark来分析数据包中的实时数据,很容易看出那些事协议信息,哪些是实时数据信息,接下来的事情就不属于RTSP了。

      如图,找到一个抓到的RTP数据包,在Real-Time Transport Protocol中点击Payload就可以看到其对应的信息。

              image


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号