![895192a5551b12249e98542fe84cf097.png](https://img-blog.csdnimg.cn/img_convert/895192a5551b12249e98542fe84cf097.png)
1 RTSP鉴权认证
RTSP服务器端出于安全考虑需要客户端访问服务器的时候需要带着用户名和密码进行校验的过程。RTSP两种认证方式包括基本认证(basic authentication)和摘要认证(digest authentication)。
(1)基本认证(basic authentication)
base64 (username:password)
(2)摘要认证(digest authentication)
response计算方法如下:
RTSP客户端应该使用username+ password并计算response如下:
response=md5(md5(username:realm:password):nonce:md5(method:url));
2 RTP OVER TCP传输模
一般我们都是通过UDP方式发送RTP流,使用RTSP/RTP这种模式需要打开多个UDP端口,每一路流需要两个UDP端口(一个RTP的媒体数据端口一个RTCP的控制信息)。
在互联网上使用UDP不太合适。(1)如果Internet网上的路由器没有打开这些端口就会出现一定的问题。(2)有可能中间的网络路由器过滤或者忽略掉UDP数据包系统就会出现一些问题。(3)UDP是不可靠的传输协议在Internet网上面临着丢包的情景。有兴趣有需要的查看RFC2326 10章12节。
3 RTP打包发送h264数据
由于以太网 (Ethernet)协议的MTU为1500字节,当传输的数据大于1500,该数据报文将被分片。因此在发送RTP包时分两种情况:
(1)当一个NALU小于MTU 字节的时候,采用一个单RTP包发送
(2)当一个NALU大于等于MTU 字节的时候,采用FU-A分片发送
FU-A分片发送是根据S(起始)E(结束)R以及M(标记)来控制的,详细流程如下:
当发送第一个的FU时,S=1,E=0,R=0;并设置rtp M 位为0;
当发送中间的FU时,S=0,E=0,R=0;
当发送最后一个FU时,S=0,E=1,R=0;并设置rtp M 位为1;
核心代码:
while(!feof(bits))
{
GetAnnexbNALU(nal);//每执行一次,文件的指针指向本次找到的NALU的末尾,
//下一个位置即为下个NALU的起始码0x000001
dump( nal );//输出NALU长度和TYPE
memset(sendbuf,0,1500);//清空sendbuf;
//rtp固定包头,为12字节,
rtp_hdr =(RTP_FIXED_HEADER*)&sendbuf[0];
rtp_hdr->version = 2; //版本号,此版本固定为2
rtp_hdr->marker = 0; //标志位,由具体协议规定其值。
rtp_hdr->payload = H264;//负载类型号,
rtp_hdr->ssrc = htonl(10);//随机指定为10,并且在本RTP会话中全局唯一
//当一个NALU小于1400字节的时候,采用一个单RTP包发送
if( nal->len<=UDP_MAX_SIZE)
{
//设置rtp M 位;
rtp_hdr-