史前小虫

史前小虫

0个粉丝

7

问答

0

专栏

0

资料

史前小虫  发布于  2014-12-29 20:16:24
采纳率 0%
7个问答
8566

用RTP发送H264,VLC接收没反应

 

[i=s] 本帖最后由 史前小虫 于 2014-12-29 20:40 编辑 [/i]

hi3531的板子,在SAMPLE_COMM_VENC_SaveH264(FILE fpH264File, VENC_STREAM_S pstStream)函数下调用
RTP_Send(pstStream->pstPack[i].pu8Addr[0], pstStream->pstPack[i].u32Len[0]);

VLC播放不了,完全没反应,
m=video 5000 RTP/AVP 96
a=rtpmap:96 H264
a=framerate:25
c=IN IP4 192.168.1.168
a=packetization-mode=1

我是这样设置的,求助!

[code]int RTP_Send(unsigned char  *buffer,  int  len)  
{
    //NALU_t *n;
    unsigned char* nalu_payload;  
    unsigned char sendbuf[1500];
    unsigned short seq_num =0;
    int    bytes=0;
    int valid_len = len - 4;
    unsigned char NALU=buffer[4];
    int pos = 5;
    int packetIndex = 1 ;
    int    packetNum;
    int sendlen = 0;

    //GetAnnexbNALU (buffer, len);

    printf("buffer[4] = %X\n", buffer[4]);

    n->startcodeprefix_len = 4;  
    n->len = len - 4;
    memcpy (n->buf, &buffer[4], n->len);

      printf("n->buf = %X\n", n->buf[0]);

    n->forbidden_bit = n->buf[0] & 0x80;        //1 bit  
    n->nal_reference_idc = n->buf[0] & 0x60;    //2 bit  
    n->nal_unit_type = (n->buf[0]) & 0x1f;  //5 bit  

    printf("n->buf = %X\n", n->buf[0]);

    memset(sendbuf,0,1500);//清空sendbuf;此时会将上次的时间戳清空,因此需要ts_current来保存上次的时间戳值

    rtp_hdr =(RTP_FIXED_HEADER*)&sendbuf[0]; //设置RTP HEADER
    rtp_hdr->version = 2;   //版本号,此版本固定为2
    rtp_hdr->marker  = 0;   //标志位,由具体协议规定其值。
    rtp_hdr->payload = 96;//负载类型号,
    rtp_hdr->ssrc    = htonl(10);//随机指定为10,并且在本RTP会话中全局唯一


    //当一个NALU小于1400字节的时候,采用一个单RTP包发送
    if(n->len <= UDP_MAX_SIZE){
        //设置rtp M 位;
        rtp_hdr->marker=1;
        rtp_hdr->seq_no = htons(seq_num ++); 

        //设置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]开始的字符串。  

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

        ts_current=ts_current+timestamp_increse; //增加时间戳
        sendlen = sendto(sock->local,sendbuf,bytes,0,sock->cliaddr,sizeof(struct sockaddr_in));
        printf("sendbuf = %d , bytes = %d , sendlen = %d\n",strlen(sendbuf), bytes, sendlen);
        //Sleep(100);
    }
    else
    {
        packetNum = n->len / UDP_MAX_SIZE; //packetNum为分包的个数
        if (n->len % UDP_MAX_SIZE != 0)    //加上最后一个
            packetNum ++;


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

        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=n->forbidden_bit;  
        fu_ind->NRI=n->nal_reference_idc>>5;  
        fu_ind->TYPE=28;  


        //设置FU HEADER,并将这个HEADER填入sendbuf[13]  
        fu_hdr =(FU_HEADER*)&sendbuf[13];  
        fu_hdr->S=1;  
        fu_hdr->E=0;  
        fu_hdr->R=0;  
        fu_hdr->TYPE=n->nal_unit_type;  

        nalu_payload=&sendbuf[14];//同理将sendbuf[14]赋给nalu_payload
        memcpy(nalu_payload,n->buf+1,UDP_MAX_SIZE);//去掉NALU头  

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


        sendlen = sendto(sock->local,sendbuf,bytes,0,sock->cliaddr,sizeof(struct sockaddr_in));
        printf("sendbuf = %d , bytes = %d , sendlen = %d\n",strlen(sendbuf), bytes, sendlen);
        //发送中间的FU,S=0,E=0,R=0
        for(packetIndex=2;packetIndex<packetNum;packetIndex++)
        {
            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=n->forbidden_bit;  
                    fu_ind->NRI=n->nal_reference_idc>>5;  
                        fu_ind->TYPE=28;  

                        //设置FU HEADER,并将这个HEADER填入sendbuf[13]  
                    fu_hdr =(FU_HEADER*)&sendbuf[13];  
                    fu_hdr->S=0;  
                    fu_hdr->E=0;  
                       fu_hdr->R=0;  
                    fu_hdr->TYPE=n->nal_unit_type;   

            nalu_payload=&sendbuf[14];//同理将sendbuf[14]的地址赋给nalu_payload
            memcpy(nalu_payload,n->buf+(packetIndex-1)*UDP_MAX_SIZE+1,UDP_MAX_SIZE);//去掉起始前缀的nalu剩余内容写入sendbuf[14]开始的字符串。  


            bytes=UDP_MAX_SIZE+14;//获得sendbuf的长度,为nalu的长度(除去原NALU头)加上rtp_header,fu_ind,fu_hdr的固定长度14字节
            sendlen = sendto(sock->local,sendbuf,bytes,0,sock->cliaddr,sizeof(struct sockaddr_in));
            printf("sendbuf = %d , bytes = %d , sendlen = %d\n",strlen(sendbuf), bytes, sendlen);
            pos += UDP_MAX_SIZE;
        }

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

        rtp_hdr->seq_no = htons(seq_num ++);
        //设置rtp M 位;当前传输的是最后一个分片时该位置1        
        rtp_hdr->marker=1;
        //设置FU INDICATOR,并将这个HEADER填入sendbuf[12]


            rtp_hdr->seq_no = htons(seq_num ++);  
            //设置rtp M 位;当前传输的是最后一个分片时该位置1         
            rtp_hdr->marker=1;  
            //设置FU INDICATOR,并将这个HEADER填入sendbuf[12]  
            fu_ind =(FU_INDICATOR*)&sendbuf[12]; //将sendbuf[12]的地址赋给fu_ind,之后对fu_ind的写入就将写入sendbuf中;  
            fu_ind->F=n->forbidden_bit;  
            fu_ind->NRI=n->nal_reference_idc>>5;  
            fu_ind->TYPE=28;  

            //设置FU HEADER,并将这个HEADER填入sendbuf[13]  
            fu_hdr =(FU_HEADER*)&sendbuf[13];  
            fu_hdr->S=0;  
            fu_hdr->E=1;  
            fu_hdr->R=0;  
            fu_hdr->TYPE=n->nal_unit_type;  




        nalu_payload=&sendbuf[14];

         memcpy(nalu_payload,n->buf+(packetIndex-1)*UDP_MAX_SIZE+1,lastPackSize-1);//将nalu最后剩余的-1(去掉了一个字节的NALU头)字节内容写入sendbuf[14]开始的字符串。  
        bytes=lastPackSize-1+14;//获得sendbuf的长度,为剩余nalu的长度l-1加上rtp_header,FU_INDICATOR,FU_HEADER三个包头共14字节    
        sendlen = sendto(sock->local,sendbuf,bytes,0,sock->cliaddr,sizeof(struct sockaddr_in));
        printf("sendbuf = %d , bytes = %d , sendlen = %d\n",strlen(sendbuf), bytes, sendlen);
    }

    return 0;

}[/code]
我来回答
回答9个
时间排序
认可量排序

史前小虫

0个粉丝

7

问答

0

专栏

0

资料

史前小虫 2014-12-29 20:24:40
认可0

david

41个粉丝

368

问答

253

专栏

229

资料

david 2014-12-29 21:29:13
认可0
本帖最后由 david 于 2014-12-29 22:26 编辑

hi3531的板子,在SAMPLE_COMM_VENC_SaveH264(FILE* fpH264File, VENC_STREAM_S *pstStream)函数下调用
RTP_Send(pstStream->pstPack.pu8Addr[0], pstStream->pstPack.u32Len[0]);

sorry
这个是RTP , 你看PT位是否 33. VLC  的 MP2T   AV

找个RTP的文档 对着协议来。  

史前小虫

0个粉丝

7

问答

0

专栏

0

资料

史前小虫 2014-12-29 22:34:57
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=10738&ptid=4908]david 发表于 2014-12-29 21:29[/url]
hi3531的板子,在SAMPLE_COMM_VENC_SaveH264(FILE* fpH264File, VENC_STREAM_S *pstStream)函数下调用
RTP ...[/quote]

PT位不是33,我设置的是96, H264的

david

41个粉丝

368

问答

253

专栏

229

资料

david 2014-12-29 22:36:51
认可0
本帖最后由 david 于 2014-12-29 22:52 编辑

参考这个 rfc3550
               rfc3551
[url]http://www.ietf.org/rfc/rfc3550.txt[/url]
[url]http://www.ietf.org/rfc/rfc3551.txt[/url]

史前小虫

0个粉丝

7

问答

0

专栏

0

资料

史前小虫 2014-12-29 23:02:51
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=10742&ptid=4908]david 发表于 2014-12-29 22:36[/url]
参考这个 rfc3550
               rfc3551
http://www.ietf.org/rfc/rfc3550.txt
[/quote]

恩恩,好的

ZnFS11

0个粉丝

0

问答

0

专栏

0

资料

ZnFS11 2014-12-31 11:46:42
认可0
I帧需要把SPS,PPS等提取出来先发送。

qq624523962

0个粉丝

3

问答

0

专栏

0

资料

qq624523962 2015-01-30 15:00:23
认可0
楼主,你好,请问你这个demo  成功了嘛

3518hi

0个粉丝

0

问答

0

专栏

0

资料

3518hi 2015-07-02 15:08:07
认可0
楼主,你好,请问你这个demo  成功了嘛

li52551578

0个粉丝

1

问答

0

专栏

0

资料

li52551578 2018-11-28 09:17:02
认可0
楼主,你好,请问你这个demo  成功了嘛
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区