当前位置: 代码迷 >> 多媒体/流媒体开发 >> "按照RFC3984协议实现H264视频流媒体"的源代码的有关问题
  详细解决方案

"按照RFC3984协议实现H264视频流媒体"的源代码的有关问题

热度:3017   发布时间:2013-02-26 00:00:00.0
"按照RFC3984协议实现H264视频流媒体"的源代码的问题
看了大牛的帖子,研读了源代码,受益匪浅,
http://topic.csdn.net/u/20100104/16/0fd992e8-b0a6-4c2b-85a4-d9513d3b1491?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的最后一个字节,而是去除第一个字节。
  相关解决方案