转角遇见miss

转角遇见miss

0个粉丝

5

问答

0

专栏

1

资料

转角遇见miss  发布于  2016-09-13 10:57:47
采纳率 0%
5个问答
11137

RTSP_RTP_TCP直播协议,潜入到海思sample_vdec做直播,遇到头疼的花屏问题,求助!...

   
本帖最后由 转角遇见miss 于 2016-9-13 14:06 编辑

先说说我的代码框架(具体如下,不足再补):
1、建立tcp socket rtsp对接ipc摄像头(已设定SO_RCVBUF=32*1024*5)
2、创建3条线程
        //recv()tcp接收数据
        pthread_create(&pVdecThread[1], 0, RECV, (HI_VOID *)&my_struct);
        //handlestream解析rtp包,保存解析好的数据
        pthread_create(&pVdecThread[2], 0, handle, NULL);
        //sendstream调用海思mpp接口播放视频流
        pthread_create(&pVdecThread, 0, SAMPLE_COMM_VDEC_SendStream, (HI_VOID *)&pstVdecSend);
3、创建了共有环形缓存区fifo + 共有streambuf=32*1024*5
        fifo有80个节点,每个节点32*1024*5,用于每次保存线程recv()到得buf;
        用信号量来判断,当有缓存区有数据就调用线程handle进行拆包
        同样用信号量来判断,当h264_rtp_unpackage()从fifo取数据解析,解析好数据就保存到Video_Stream,当拼好一帧数据就调用SAMPLE_COMM_VDEC_SendStream()
        让海思调用hdmi接口播放视频
这里是拆包函数(目测不知有木有问题)
HI_VOID h264_rtp_unpackage(HI_U8 *bufIn, HI_S32 len)  //bufin为fifo->buf去掉tcp4个字节的头剩下一个完整的rtp包,当然一个buf可能有多个rtp包
{  
    unsigned char recvbuf[1500];  
    //RTPpacket_t *p = NULL;   
    RTP_FIXED_HEADER * rtp_hdr = NULL;  
    NALU_HEADER * nalu_hdr = NULL;   
    FU_INDICATOR    *fu_ind = NULL;  
    FU_HEADER       *fu_hdr= NULL;     
    unsigned int start_code = 0x01000000;
    memcpy(recvbuf,bufIn, len);          //复制rtp包  
   
    //begin rtp_payload and rtp_header  
  
    if ((rtp_hdr = malloc(sizeof(RTP_FIXED_HEADER))) == NULL)  
    {  
        printf("RTP_FIXED_HEADER MEMORY ERROR\n");  
    }  
      
    rtp_hdr =(RTP_FIXED_HEADER*)&recvbuf[0];   
        
    if ((nalu_hdr = malloc(sizeof(NALU_HEADER))) == NULL)  
    {  
        printf("NALU_HEADER MEMORY ERROR\n");  
    }  
    //网络传输过来的字节序 ,当存入内存还是和文档描述的相反,只要匹配网络字节序和文档描述即可传输正确。
    nalu_hdr =(NALU_HEADER*)&recvbuf[12];     
  
    //////////////////////////////////////////////////////////////////////////  
    //开始解包
      
    if ( nalu_hdr->TYPE == 0 || len < 12 )  
    {  
        printf("this packet is worse\n");
        return;  
    }  
    else if ( nalu_hdr->TYPE > 0 &&  nalu_hdr->TYPE < 24)  //单包  
    {         
        memcpy(Video_Stream+total_recved, &start_code, 4);   //写进起始字节0x00000001  
        total_recved += 4;  
        memcpy(Video_Stream+total_recved, &recvbuf[12], len-12);   
        total_recved += len-12;   
    }  
     else if ( nalu_hdr->TYPE == 28)    //FU-A分片包,解码顺序和传输顺序相同  
    {  
        if ((fu_ind = malloc(sizeof(FU_INDICATOR))) == NULL)  
        {  
            printf("FU_INDICATOR MEMORY ERROR\n");  
        }  
        if ((fu_hdr = malloc(sizeof(FU_HEADER))) == NULL)  
        {  
            printf("FU_HEADER MEMORY ERROR\n");  
        }  

        fu_ind=(FU_INDICATOR*)&recvbuf[12];     //分片包用的是FU_INDICATOR而不是NALU_HEADER   
  
        fu_hdr=(FU_HEADER*)&recvbuf[13];        //FU_HEADER赋值   
  
        if (rtp_hdr->marker == 1)                 //分片包最后一个包  
        {  
            
            memcpy(Video_Stream+total_recved, &recvbuf[14], len - 14);  
            total_recved += len - 14;   
            First++;
            if((First+1) % 2 == 0 )//First 用于判断当前为第几帧
            {   
               
                sem_post(&my_struct.sem_id4);
                pthread_mutex_unlock(&my_struct.H_Mutex);
                 
            }
            
        }  
        else if (rtp_hdr->marker == 0)                 //分片包 但不是最后一个包  
        {  
            if (fu_hdr->S == 1)                        //分片的第一个包  
            {            
                     
                if(First == 0 || (First+1)%2 == 0 )
                {   
                    sem_wait(&my_struct.sem_id3);
                    
                    pthread_mutex_lock(&my_struct.H_Mutex);
                    memset(Video_Stream, 0, sizeof(Video_Stream));
                  
                }
                unsigned char F;  
                unsigned char NRI;  
                unsigned char TYPE;  
                unsigned char nh;   
                memcpy(Video_Stream+total_recved, &start_code, 4);      //写起始字节码0x00000001  
                total_recved += 4;  
               
                F = fu_ind->F << 7;  
                NRI = fu_ind->NRI << 5;  
                TYPE = fu_hdr->TYPE;                //应用的是FU_HEADER的TYPE  
                nh = F | NRI | TYPE;  
  
                          //写NAL HEADER  
                memcpy(Video_Stream+total_recved, &nh, 1);
                total_recved += 1;  
                memcpy(Video_Stream+total_recved, &recvbuf[14], len - 14);  
                total_recved += len - 14;  
               
            }  
            else                                      //如果不是第一个包  
            {
                //memset(vv->videobuf, 0, 1600);
                memcpy(Video_Stream+total_recved, &recvbuf[14], len - 14);  
                total_recved += len - 14;
              
            }     
        }  
    }   
    else  
    {  
        printf("this packet is worse,30-31 havenot meaning\n");  
    }

    memset(recvbuf,0,1500);  
   
    return ;  
}
  我的问题:视频拨出来出现马赛克或者花屏,而且码率越大,问题越严重(有时是一个屏幕的十分之九都是马赛克,只有上方的一小块正常)。直接封装成h264文件,播放问题就没那么严重(这貌似是海思的问题)
1、框架这样写不知道有没有问题
2、细查生成的264文件,关键帧间隔对得上,没有发现丢帧。(有个奇怪的地方,文件开头的第一次关键帧全为零,或者00000001 06这一帧全为零)
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0001 65b8 0000 0b6d
2027 ffb1 c15e a37d 4639 3ec6 1a6d 358c
3、h264_rtp_unpackage()不知道是不是个bug
4、各位觉得可能的问题点,希望能帮我提出来,大家共同解决。
ps:我只是小菜一个,感谢各位前辈的指教。
我来回答
回答20个
时间排序
认可量排序

转角遇见miss

0个粉丝

5

问答

0

专栏

1

资料

转角遇见miss 2016-09-13 11:01:18
认可0
忘了,附上奖励分了:L

转角遇见miss

0个粉丝

5

问答

0

专栏

1

资料

转角遇见miss 2016-09-13 16:14:49
认可0
路人还挺多的,就是没人鸟我~~~

转角遇见miss

0个粉丝

5

问答

0

专栏

1

资料

转角遇见miss 2016-09-14 09:06:36
认可0
又一天过去了...

2272943826

0个粉丝

24

问答

0

专栏

8

资料

2272943826 2016-09-14 15:03:09
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37764&ptid=12638]转角遇见miss 发表于 2016-9-14 09:06[/url]
又一天过去了...[/quote]

请问一下,在3516A里面有mpp,rtsp是需要自己写,还是想 vio,venc 那种,mpp/sample直接有

转角遇见miss

0个粉丝

5

问答

0

专栏

1

资料

转角遇见miss 2016-09-14 15:53:34
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37799&ptid=12638]2272943826 发表于 2016-9-14 15:03[/url]
请问一下,在3516A里面有mpp,rtsp是需要自己写,还是想 vio,venc 那种,mpp/sample直接有[/quote]

mpp里边的历程都是播放本地文件的,并不是播放RTSP直播流。

2272943826

0个粉丝

24

问答

0

专栏

8

资料

2272943826 2016-09-14 16:24:41
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37807&ptid=12638]转角遇见miss 发表于 2016-9-14 15:53[/url]
mpp里边的历程都是播放本地文件的,并不是播放RTSP直播流。[/quote]

如果这样的话,RTSP需要自己去写。
我就想把现在的venc 出来的H.264 通过nfs 或者其他方式让 3536的 vdec 收到,我测试 nfs成功啦,再考虑用rtsp方法

转角遇见miss

0个粉丝

5

问答

0

专栏

1

资料

转角遇见miss 2016-09-18 09:06:39
认可0
你的是用venc编码后,送到vdec解码?

2272943826

0个粉丝

24

问答

0

专栏

8

资料

2272943826 2016-09-20 09:36:17
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37864&ptid=12638]转角遇见miss 发表于 2016-9-18 09:06[/url]
你的是用venc编码后,送到vdec解码?[/quote]

对的,
我用的是 sample/venc 编码以后,生成 stream_chn0.h264 ,通过nfs, 3536的sample/vdec 解码,显示在monitor上面。

SimonJi2016

0个粉丝

2

问答

0

专栏

0

资料

SimonJi2016 2016-10-26 14:18:37
认可0
我也在学习RTSP想向您请教、请教

lsn2000

0个粉丝

0

问答

0

专栏

0

资料

lsn2000 2017-04-10 15:00:46
认可0
估计是 buffer 不够大,解码出错了

钓鱼大师

0个粉丝

1

问答

0

专栏

0

资料

钓鱼大师 2017-06-05 15:51:33
认可0
海思没有FAE吗?

bobug

0个粉丝

0

问答

0

专栏

0

资料

bobug 2017-06-21 20:32:56
认可0
多包模式还是单包模式?

先知先觉_bin

0个粉丝

0

问答

0

专栏

0

资料

先知先觉_bin 2017-07-12 16:00:25
认可0
你这个延迟大不大,我这边和你思路一样但是延迟很严重1-2s的样子

yaoyaohu

0个粉丝

0

问答

0

专栏

0

资料

yaoyaohu 2017-09-28 18:53:04
认可0
就是延迟大哦

lzts

0个粉丝

0

问答

0

专栏

0

资料

lzts 2018-03-12 16:55:29
认可0
学习下,谢谢分享

jxfwinter

0个粉丝

0

问答

0

专栏

0

资料

jxfwinter 2018-03-13 21:23:29
认可0
建议不要使用rtsp,首先rtsp至少需要5到6次信令交互才传输多媒体数据,其次rtsp采用rtp打包h264 nal单元,非常蛋疼,市面上所有的用到ffmpeg的播放器都没有正确处理rtp丢包的问题,包括mplayer, vlc player,因为ffmpeg压根就没正确处理丢包问题,除非自己写传输层,进行组帧。

wuqingwei

0个粉丝

9

问答

0

专栏

0

资料

wuqingwei 2018-08-02 17:13:10
认可0
楼主的问题解决最后解决了没有

hero

0个粉丝

1

问答

0

专栏

0

资料

hero 2018-08-03 09:43:29
认可0

就是延迟大哦

bet

0个粉丝

29

问答

0

专栏

1

资料

bet 2018-08-13 09:26:00
认可0
:victory::victory::victory:

lfpp

0个粉丝

12

问答

0

专栏

0

资料

lfpp 2018-08-15 17:39:53
认可0
:o:o:o:o:P:P
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区