"按照RFC3984协议实现H264视频流媒体"的源代码的问题
看了大牛的帖子,研读了源代码,受益匪浅,
http://topic.csdn.net/u/20100104/16/0fd992e8-b0a6-4c2b-85a4-d9513d3b1491.html?37676
但是有个问题不明白,打包的时候,除了去掉nalu头,为什么要去掉nalu的最后一位呢?
即以下的代码:
//当一个NALU小于1400字节的时候,采用一个单RTP包发送
if(n->len<=1400)
{
//设置rtp M 位;
rtp_hdr->marker=1;
rtp_hdr->seq_no = htons(seq_num ++); //序列号,每发送一个RTP包增1
//设置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_payload=&sendbuf[13];//同理将sendbuf[13]赋给nalu_payload
memcpy(nalu_payload,n->buf+1,n->len-1);//去掉nalu头的nalu剩余内容写入sendbuf[13]开始的字符串。
ts_current=ts_current+timestamp_increse;
rtp_hdr->timestamp=htonl(ts_current);
bytes=n->len + 12 ;//获得sendbuf的长度,为nalu的长度(包含NALU头但除去起始前缀)加上rtp_header的固定长度12字节
send( socket1, sendbuf, bytes, 0 );//发送rtp包
//Sleep(100);
}
其中这里:
memcpy(nalu_payload,n->buf+1,n->len-1);//去掉nalu头的nalu剩余内容写入sendbuf[13]开始的字符串。
这里n->len为什么要减1呢?
[解决办法]
大牛的帖子我没看过,不过楼主应该是搞错了吧。
memcpy(nalu_payload,n->buf+1,n->len-1);
的意思是从n->buf+1位置拷贝n->len-1个字节的内容到nalu_payload。
所以说并不是去除n->buf的最后一个字节,而是去除第一个字节。