论如何是用RTP打包H264数据(发送单包的情况,分包发送还需要另外分析)


转自http://blog.csdn.net/nine_locks/article/details/47053947

完整的封包部分代码:

第一步、填写RTP的头部结构体12个字节:

  1.     memset(sendbuf,0,1500);//清空sendbuf;此时会将上次的时间戳清空,因此需要ts_current来保存上次的时间戳值  
  2.     //rtp固定包头,为12字节,该句将sendbuf[0]的地址赋给rtp_hdr,以后对rtp_hdr的写入操作将直接写入sendbuf。  
  3.     rtp_hdr =(RTP_FIXED_HEADER*)&sendbuf[0];   
  4.     //设置RTP HEADER,  
  5.     rtp_hdr->payload   = 96;  //负载类型号,H264  
  6.     rtp_hdr->version   = 2;  //版本号,此版本固定为2  
  7.     rtp_hdr->marker    = 0;   //标志位,由具体协议规定其值。  
  8.         rtp_hdr->ssrc      = htonl(10);    //随机指定为10,并且在本RTP会话中全局唯一  
  9. <span style="white-space:pre">    </span>//设置rtp M 位;  
  10.     rtp_hdr->marker=1;  
  11.     rtp_hdr->seq_no     = htons(seq_num ++); //序列号,每发送一个RTP包增1  
  12.     ts_current=ts_current+timestamp_increse;  
  13.     rtp_hdr->timestamp=htonl(ts_current);  
	memset(sendbuf,0,1500);//清空sendbuf;此时会将上次的时间戳清空,因此需要ts_current来保存上次的时间戳值
	//rtp固定包头,为12字节,该句将sendbuf[0]的地址赋给rtp_hdr,以后对rtp_hdr的写入操作将直接写入sendbuf。
	rtp_hdr =(RTP_FIXED_HEADER*)&sendbuf[0]; 
	//设置RTP HEADER,
	rtp_hdr->payload   = 96;  //负载类型号,H264
	rtp_hdr->version   = 2;  //版本号,此版本固定为2
	rtp_hdr->marker    = 0;   //标志位,由具体协议规定其值。
        rtp_hdr->ssrc      = htonl(10);    //随机指定为10,并且在本RTP会话中全局唯一
<span style="white-space:pre">	</span>//设置rtp M 位;
	rtp_hdr->marker=1;
	rtp_hdr->seq_no     = htons(seq_num ++); //序列号,每发送一个RTP包增1
	ts_current=ts_current+timestamp_increse;
	rtp_hdr->timestamp=htonl(ts_current);
第二步、加入NALU头部结构体
  1. //设置NALU HEADER,并将这个HEADER填入sendbuf[12]  
  2. nalu_hdr =(NALU_HEADER*)&sendbuf[12]; //将sendbuf[12]的地址赋给nalu_hdr,之后对nalu_hdr的写入就将写入sendbuf中;  
  3. nalu_hdr->F=n->forbidden_bit;  
  4. nalu_hdr->NRI=n->nal_reference_idc>>5;//有效数据在n->nal_reference_idc的第6,7位,需要右移5位才能将其值赋给nalu_hdr->NRI。  
  5. nalu_hdr->TYPE=n->nal_unit_type;  
	//设置NALU HEADER,并将这个HEADER填入sendbuf[12]
	nalu_hdr =(NALU_HEADER*)&sendbuf[12]; //将sendbuf[12]的地址赋给nalu_hdr,之后对nalu_hdr的写入就将写入sendbuf中;
	nalu_hdr->F=n->forbidden_bit;
	nalu_hdr->NRI=n->nal_reference_idc>>5;//有效数据在n->nal_reference_idc的第6,7位,需要右移5位才能将其值赋给nalu_hdr->NRI。
	nalu_hdr->TYPE=n->nal_unit_type;
第三步、填充NALU的playload数据

  1. nalu_payload=&sendbuf[13];//同理将sendbuf[13]赋给nalu_payload  
  2. memcpy(nalu_payload,n->buf+1,n->len-1);//去掉nalu头的nalu剩余内容写入sendbuf[13]开始的字符串。  
	nalu_payload=&sendbuf[13];//同理将sendbuf[13]赋给nalu_payload
	memcpy(nalu_payload,n->buf+1,n->len-1);//去掉nalu头的nalu剩余内容写入sendbuf[13]开始的字符串。

第四步、发送数据

  1. <span style="white-space:pre">    </span>send( socket, sendbuf, bytes, 0 );//发送经过rtp封装的H264包  
<span style="white-space:pre">	</span>send( socket, sendbuf, bytes, 0 );//发送经过rtp封装的H264包


最后补充的是:发送的RTP包比较大的时候就要分包发送,我设置的大小是1500个字节。其实RTP封装很简单的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值