龙空技术网

RTP封包的C语言实现

爱音乐的程序员小新人 167

前言:

此时小伙伴们对“c语言封包”大致比较看重,小伙伴们都想要知道一些“c语言封包”的相关文章。那么小编在网上收集了一些有关“c语言封包””的相关知识,希望兄弟们能喜欢,姐妹们快快来学习一下吧!

while(!feof(bits))

{

GetAnnexbNALU(nal);//每执行一次,文件的指针指向本次找到的NALU的末尾,

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->marker=1;

rtp_hdr->seq_no = htons(seq_num ++); //序列号,每发送一个RTP包增1

//设置NALU HEADER,并将这个HEADER填入sendbuf[12]

//将sendbuf[12]的地址赋给nalu_hdr,之后对nalu_hdr的写入就将写入sendbuf中;

nalu_hdr =(NALU_HEADER*)&sendbuf[12];

nalu_hdr->F=nal->forbidden_bit;

//有效数据在nal->nal_reference_idc的第6,7位,需要右移5位才能将其值赋给nalu_hdr->NRI。

nalu_hdr->NRI=nal->nal_reference_idc>>5;

nalu_hdr->TYPE= nal->nal_unit_type;

nalu_payload =&sendbuf[13]; //同理将sendbuf[13]赋给nalu_payload

memcpy(nalu_payload,nal->buf+1,nal->len-1);//去掉nalu头的nalu剩余内容写入sendbuf[13]开始的字符串。

ts_current = ts_current+timestamp_increse;

rtp_hdr->timestamp = htonl(ts_current);

bytes= nal->len + 12 ; //获得sendbuf的长度,为nalu的长度(包含NALU头但除去起始前缀)加上rtp_header的固定长度12字节

res = send(socket1,sendbuf,bytes,0);//发送RTP包

if (res > 0) {

g_iSendCount+=res;

}

//Sleep(100);

}

else //FU-A

{

int packetNum = nal->len/UDP_MAX_SIZE;

if ( nal->len%UDP_MAX_SIZE != 0 )

packetNum ++;

int lastPackSize = nal->len - (packetNum-1)*UDP_MAX_SIZE;

int packetIndex = 1 ;

ts_current = ts_current+timestamp_increse;

rtp_hdr->timestamp = htonl( ts_current);

//发送第一个的FU,S=1,E=0,R=0

rtp_hdr->seq_no = htons(seq_num ++); //序列号,每发送一个RTP包增1

//设置rtp M 位;

rtp_hdr->marker=0;

//设置FU INDICATOR,并将这个HEADER填入sendbuf[12]

fu_ind = (FU_INDICATOR*)&sendbuf[12]; //将sendbuf[12]的地址赋给fu_ind,之后对fu_ind的写入就将写入sendbuf中;

fu_ind->F = nal->forbidden_bit;

fu_ind->NRI = nal->nal_reference_idc>>5;

fu_ind->TYPE = 28;

//设置FU HEADER,并将这个HEADER填入sendbuf[13]

fu_hdr =(FU_HEADER*)&sendbuf[13];

fu_hdr->S= 1; // * 1.第一包

fu_hdr->E= 0;

fu_hdr->R= 0;

fu_hdr->TYPE = nal->nal_unit_type;

nalu_payload = &sendbuf[14];//同理将sendbuf[14]赋给nalu_payload

memcpy( nalu_payload,nal->buf+1,UDP_MAX_SIZE);//去掉NALU头

bytes = UDP_MAX_SIZE+14;//获得sendbuf的长度,为nalu的长度(除去起始前缀和NALU头)加上rtp_header,fu_ind,fu_hdr的固定长度14字节

res = send( socket1, sendbuf, bytes, 0 );//发送RTP包

if (res > 0) {

g_iSendCount+=res;

}

//** 2。 发送中间的FU,S=0,E=0,R=0

for( packetIndex=2;packetIndex

标签: #c语言封包