zoukankan      html  css  js  c++  java
  • 海思Hi35xx平台调试笔记

    1、进入板子debug环境 (根据自己情况)

    1) mount /dev/sda3 /root/disk

    2) minicom

    3) nfs

    pc:
    sudo vi /etc/exports
    /root/disk/hi3516 *(rw,sync,no_root_squash,no_subtree_check)

    sudo /etc/init.d/nfs-kernel-server restart
    sudo /etc/init.d/rpcbind restart
    sudo ifconfig eth1 172.16.23.157

    board:
    ifconfig wlan1 172.16.23.158
    mount -t nfs -o nolock 172.16.23.157:/root/disk/hi3516 /root/hi3516

    注意海思sdk里的mpp目录名不要改动,改了会导致sample编译出错。

    2、音视频数据循环采集

    a. 在sample_venc.c文件中,海思官方是把采集到的数据都保存到文件中,我们需要更改到缓存里,以便后面推送到rtsp/rtmp/hls服务端。

                for (i = 0; i < s32ChnTotal; i++)
                {
                    if (FD_ISSET(VencFd[i], &read_fds))
                    {
                        /*******************************************************
                         step 2.1 : query how many packs in one-frame stream.
                        *******************************************************/
                        memset(&stStream, 0, sizeof(stStream));
                        s32Ret = HI_MPI_VENC_Query(i, &stStat);
                        if (HI_SUCCESS != s32Ret)
                        {
                            SAMPLE_PRT("HI_MPI_VENC_Query chn[%d] failed with %#x!
    ", i, s32Ret);
                            break;
                        }
    
                        /*******************************************************
                         step 2.2 : malloc corresponding number of pack nodes.
                        *******************************************************/
                        stStream.pstPack = (VENC_PACK_S*)malloc(sizeof(VENC_PACK_S) * stStat.u32CurPacks);
                        if (NULL == stStream.pstPack)
                        {
                            SAMPLE_PRT("malloc stream pack failed!
    ");
                            break;
                        }
    
                        /*******************************************************
                         step 2.3 : call mpi to get one-frame stream
                        *******************************************************/
                        stStream.u32PackCount = stStat.u32CurPacks;
                        s32Ret = HI_MPI_VENC_GetStream(i, &stStream, HI_TRUE);
                        if (HI_SUCCESS != s32Ret)
                        {
                            free(stStream.pstPack);
                            stStream.pstPack = NULL;
                            SAMPLE_PRT("HI_MPI_VENC_GetStream failed with %#x!
    ", 
                                       s32Ret);
                            break;
                        }
    
                        /*******************************************************
                         step 2.4 : save frame to file
                        *******************************************************/
                        HisiPutH264DataToBuffer(&stStream);
                        /*s32Ret = SAMPLE_COMM_VENC_SaveStream(enPayLoadType[i], pFile[i], &stStream);
                        if (HI_SUCCESS != s32Ret)
                        {
                            free(stStream.pstPack);
                            stStream.pstPack = NULL;
                            SAMPLE_PRT("save stream failed!
    ");
                            break;
                        }*/
                        /*******************************************************
                         step 2.5 : release stream
                        *******************************************************/
                        s32Ret = HI_MPI_VENC_ReleaseStream(i, &stStream);
                        if (HI_SUCCESS != s32Ret)
                        {
                            free(stStream.pstPack);
                            stStream.pstPack = NULL;
                            break;
                        }
                        /*******************************************************
                         step 2.6 : free pack nodes
                        *******************************************************/
                        free(stStream.pstPack);
                        stStream.pstPack = NULL;
                    }
                }

    b. HI_S32 HisiPutH264DataToBuffer(VENC_STREAM_S *pstStream)函数比较重要

    HI_S32 HisiPutH264DataToBuffer(VENC_STREAM_S *pstStream)
    {
        HI_S32 i,j,x;
        HI_S32 len=0,off=0,len2=2,uplen=0;
        unsigned char *pstr;
        int iframe=0;
        for (i = 0; i < pstStream->u32PackCount; i++)
        {
            len+=pstStream->pstPack[i].u32Len;
        }
    if(n<NMAX) { for (i = 0; i < pstStream->u32PackCount; i++) { memcpy(ringfifo[iput].buffer+off,pstStream->pstPack[i].pu8Addr,pstStream->pstPack[i].u32Len); off+=pstStream->pstPack[i].u32Len; pstr=pstStream->pstPack[i].pu8Addr; if(pstr[4]==0x67) { UpdateSps(pstr+4,pstStream->pstPack[i].u32Len-4); iframe=1; } if(pstr[4]==0x68) { UpdatePps(pstr+4,pstStream->pstPack[i].u32Len-4); } } ringfifo[iput].size= len; if(iframe) { // printf("I"); ringfifo[iput].frame_type = FRAME_TYPE_I; } else { ringfifo[iput].frame_type = FRAME_TYPE_P; // printf("P"); } iput = addring(iput); // printf("(%d)",iput); // fflush(stdout); n++; } return HI_SUCCESS; }

    c. VENC_STREAM_S相关结构体

    //定义帧码流类型结构体:  
    typedef structhiVENC_STREAM_S
    { 
     VENC_PACK_S *pstPack;  //帧码流包结构。
     HI_U32 u32PackCount;    //一帧码流的所有包的个数。
     HI_U32 u32Seq;             //码流序列号。 按帧获取帧序号;按包获取包序号。
    }VENC_STREAM_S;
     
    //定义帧码流包结构体:
    typedef structhiVENC_PACK_S
    {
     HI_U32   u32PhyAddr[2];  //码流包首地址。
     HI_U8   *pu8Addr[2];      //码流包物理地址。
     HI_U32   u32Len[2];        //码流包长度。
     VENC_DATA_TYPE_U DataType; //码流类型。
     HI_U64   u64PTS; //时间戳。单位:us。
     HI_BOOL   bFieldEnd;    //场结束标识。 取值范围: HI_TRUE:该码流包是该场的最后一个包。 HI_FALSE:该码流包不是该场的最后一个包。
     HI_BOOL   bFrameEnd; //帧结束标识。 取值范围: HI_TRUE:该码流包是该帧的最后一个包。 HI_FALSE:该码流包不是该场的最后一个包。
    }VENC_PACK_S;
    struct ringbuf {
        unsigned char *buffer;
        int frame_type;
        int size;
    };

    c. 数据采集到ringbuf缓存中,然后通过rtsp/rtmp/hls协议推送到服务端IP,客户端就可以通过网络来访问了。相关rtsp/rtmp/hls服务跟平台无关,在另外的随笔中已经整理了。

    3、 运行上面的程序,会发现图像偏色,需要调整海思算法ISP的相关参数

    HI3518平台视频画面偏色解决办法,有人已经整理了http://blog.csdn.net/zqj6893/article/details/50380092

    4、HI3520DV200+GV7601采集1080P视频

    http://blog.csdn.net/zqj6893/article/details/50386921

    5、osd

    http://bbs.ebaina.com/forum.php?mod=viewthread&tid=12659&extra=page%3D1&page=1

    6. mp4v2

    https://blog.csdn.net/weixin_43549602/article/details/84570642

  • 相关阅读:
    经过我修改的一个记录集分页插件(C#)[原创]
    基于javascript的asp数据库操作类,含分页、字符串截取、用户登陆验证[原创]
    .net中关于windows身份验证的一个教训[原创]
    IE功能汇总[网上收集]
    一些珍藏代码[网上收集]
    对以前改的c#分页插件的补充[原创]
    ASP验证码图形生成[网上收集]
    关于嵌套使用DataList的心得[原创]
    浏览器标签显式网页logo
    金日开博
  • 原文地址:https://www.cnblogs.com/dong1/p/6659932.html
Copyright © 2011-2022 走看看