houyongnan

houyongnan

1个粉丝

32

问答

0

专栏

0

资料

houyongnan  发布于  2018-01-21 14:12:33
采纳率 0%
32个问答
2325

用venc录像有时录的视频会出现快进的感觉,有时正常怎么回事

 
HI_VOID *vedio_recorde()

{

    fd_set read_fds;

    int i;

    VENC_STREAM_S stStream;

    VENC_CHN_STAT_S stStat;

    MP4FileHandle hMP4File[2];

    MP4TrackId video[2];

    HI_CHAR aszFileName[2][64];

    //HI_S32 VencFd[2];

    HI_S32 s32Ret;

    int w=0;

    /*for(i=0;i<2;i++)

    {

        VencFd = HI_MPI_VENC_GetFd(i*2+1);

        if (VencFd < 0)

        {

            SAMPLE_PRT("HI_MPI_VENC_GetFd failed with %#x!\n",VencFd);

            return NULL;

        }

        if (maxfd <= VencFd)

        maxfd = VencFd;

    }*/

    for(i=0;i<2;i++)

    {

        sprintf(aszFileName, "video/stream_chnxu%d_%d%s", i*2+1,j,".mp4");

            hMP4File= MP4CreateEx(aszFileName,  0, 1, 1, 0, 0, 0, 0);

            if (hMP4File == MP4_INVALID_FILE_HANDLE)

        {

                printf("open mp4 file fialed.\n");

                return NULL;

            }

        MP4SetTimeScale(hMP4File, 90000);

            video= MP4AddH264VideoTrack(hMP4File, 90000, 90000 / 25, 3840, 2160,

                                        0x64, //sps[1] AVCProfileIndication

                                        0x00, //sps[2] profile_compat

                                        0x1f, //sps[3] AVCLevelIndication

                                        3); // 4 bytes length before each NAL unit

            if (video == MP4_INVALID_TRACK_ID)  

        {

                printf("add video mp4 track fialed.\n");

                return NULL;

            }

    }MP4Close(hMP4File, 0);

  while(1)

  {

    FD_ZERO(&read_fds);

    struct timeval TimeoutVal;

    for (i = 0; i <2; i++)

    {

        FD_SET(VencFd[i*2+1], &read_fds);

            

    }



    TimeoutVal.tv_sec  = 2;

    TimeoutVal.tv_usec = 0;

    s32Ret = select(maxfd + 1, &read_fds, NULL, NULL, &TimeoutVal);

    //printf("s32Ret:%d",s32Ret);

    if (s32Ret < 0)

    {

        SAMPLE_PRT("select failed!\n");

        break;

    }

    else if (s32Ret == 0)

    {

        SAMPLE_PRT("get venc stream time out, exit thread\n");

        continue;

    }

    else

    {

        for (i = 0; i <2; i++)

        {

                    //printf("venc[%d]:",i);

            if (FD_ISSET(VencFd[i*2+1], &read_fds))

            {

                /*******************************************************

                step 2.1 : query how many packs in one-frame stream.

                *******************************************************/

                memset(&stStream, 0, sizeof(stStream));

                s32Ret = HI_MPI_VENC_Query(i*2+1, &stStat);

                if (HI_SUCCESS != s32Ret)

                {

                    SAMPLE_PRT("HI_MPI_VENC_Query chn[%d] failed with %#x!\n", i*2+1, s32Ret);

                    break;

                }

                                        HI_S32 s32Ret;

                                if(0 == stStat.u32CurPacks)

                                {

                                                 

                                SAMPLE_PRT("NOTE: Current  frame is NULL!\n");

                                    continue;

                                }

                /*******************************************************

                step 2.3 : 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!\n");

                    break;

                }

                    

                /*******************************************************

                step 2.4 : call mpi to get one-frame stream

                *******************************************************/

                stStream.u32PackCount = stStat.u32CurPacks;

                s32Ret = HI_MPI_VENC_GetStream(i*2+1, &stStream, HI_TRUE);

                if (HI_SUCCESS != s32Ret)

                {

                    free(stStream.pstPack);

                    stStream.pstPack = NULL;

                    SAMPLE_PRT("HI_MPI_VENC_GetStream failed with %#x!\n",s32Ret);

                    break;

                }

                        MP4WriteSample(hMP4File, video, stStream.pstPack[0].pu8Addr+stStream.pstPack[0].u32Offset,stStream.pstPack[0].u32Len-stStream.pstPack[0].u32Offset,MP4_INVALID_DURATION, 0, 1);

                        if(w==1300)

                {   printf("pthread w=%d\n");

                    flag=0;

                }

                //printf("HI_S32 VencFd[VENC_MAX_CHN_NUM];venc[%d]:%d\n",i,stStream.pstPack[0].u32Len-stStream.pstPack[0].u32Offset);

                //printf("FD_ISSET success\n");

                /*******************************************************

                    step 2.6 : release stream

                *******************************************************/

                //if(flag=1)

                //{

                    s32Ret = HI_MPI_VENC_ReleaseStream(i*2+1,&stStream);

                    if (HI_SUCCESS != s32Ret)

                    {

                        free(stStream.pstPack);

                                    SAMPLE_PRT("HI_MPI_VENC_ReleaseStream chn[%d] failed with %#x!\n", i*2+1, s32Ret);                    

                        stStream.pstPack = NULL;

                        break;

                    }

                //}

                /*******************************************************

                    step 2.7 : free pack nodes

                *******************************************************/

                free(stStream.pstPack);

                        //printf("free  stStream.pstPack--%d\n",i);

                stStream.pstPack = NULL;                 

                        }                              

        }  

    }

    if(w==1500)

        {

          for (i = 0; i <2; i++)

                {                          

                    MP4Close(hMP4File, 0);

                    //printf("mp4 close\n");                                    

                }

        break;

    }

    w++;

  }

  printf("pthread over\n");

}



/******************************************************************************

* funciton : get stream from each channels and save them

******************************************************************************/

HI_VOID* SAMPLE_COMM_VENC_GetVencStreamProc(HI_VOID *p)

{   

   

    HI_S32 i;

    //HI_S32 j=0;

    HI_S32 s32ChnTotal;

    VENC_CHN_ATTR_S stVencChnAttr;

    SAMPLE_VENC_GETSTREAM_PARA_S *pstPara;

    //HI_S32 maxfd = 0;

    struct timeval TimeoutVal;

    fd_set read_fds;

    //HI_S32 VencFd[VENC_MAX_CHN_NUM];

    HI_CHAR aszFileName[VENC_MAX_CHN_NUM][64];

    //HI_CHAR aszFileName2[VENC_MAX_CHN_NUM][64];

    //FILE *pFile[VENC_MAX_CHN_NUM];//自己注释

    MP4FileHandle hMP4File[VENC_MAX_CHN_NUM];

    MP4TrackId video[VENC_MAX_CHN_NUM];

    char szFilePostfix[10];

    VENC_CHN_STAT_S stStat;

    VENC_STREAM_S stStream;

    HI_S32 s32Ret;

    VENC_CHN VencChn;

    PAYLOAD_TYPE_E enPayLoadType[VENC_MAX_CHN_NUM];   

    pstPara = (SAMPLE_VENC_GETSTREAM_PARA_S*)p;

    s32ChnTotal = pstPara->s32Cnt;

     pthread_t pt=1;

        /******************************************

        step 1:  check & prepare save-file & venc-fd

        ******************************************/

    if (s32ChnTotal >= VENC_MAX_CHN_NUM)

    {

        SAMPLE_PRT("input count invaild\n");

        return NULL;

    }

    for (i = 0; i < s32ChnTotal; i++)

    {

        /* decide the stream file name, and open file to save stream */

        VencChn = i;

        s32Ret = HI_MPI_VENC_GetChnAttr(VencChn, &stVencChnAttr);

        if(s32Ret != HI_SUCCESS)

        {FD_SET(VencFd, &read_fds);

        SAMPLE_PRT("HI_MPI_VENC_GetChnAttr chn[%d] failed with %#x!\n", \

                   VencChn, s32Ret);

        return NULL;

        }

        /* Set Venc Fd. */

        VencFd = HI_MPI_VENC_GetFd(i);

        if (VencFd < 0)

        {

        SAMPLE_PRT("HI_MPI_VENC_GetFd failed with %#x!\n",

                   VencFd);

        return NULL;

        }

        if (maxfd <= VencFd)

        {



            maxfd = VencFd;

            printf("macfd:%d\n",maxfd);

        }

    }

   while(1)

    {

    int w=0;

    int l_flag=0;

    printf("mp4:%d\n",j);

        for(i=0;i
        {

            sprintf(aszFileName, "video/stream_chn%d_%d%s", i,j,".mp4");

                hMP4File= MP4CreateEx(aszFileName,  0, 1, 1, 0, 0, 0, 0);

                if (hMP4File == MP4_INVALID_FILE_HANDLE)

            {

                        printf("open mp4 file fialed.\n");

                        return NULL;

                }

            MP4SetTimeScale(hMP4File, 90000);

                video= MP4AddH264VideoTrack(hMP4File, 90000, 90000 / 25, 3840, 2160,

                                        0x64, //sps[1] AVCProfileIndication

                                        0x00, //sps[2] profile_compat

                                        0x1f, //sps[3] AVCLevelIndication

                                        3); // 4 bytes length before each NAL unit

                if (video == MP4_INVALID_TRACK_ID)  

            {

                    printf("add video mp4 track fialed.\n");

                    return NULL;

                }

        }

        if(flag==1)

        {   

            printf("pthread join\n");

            while(flag);

            printf("pthread go\n");

        }

        /******************************************

         step 2:  Start to get streams of each channel.

        ******************************************/

        while (HI_TRUE == pstPara->bThreadStart)

        {

                FD_ZERO(&read_fds);

                for (i = 0; i < s32ChnTotal; i++)

                {

                    FD_SET(VencFd, &read_fds);

            

                }



                TimeoutVal.tv_sec  = 2;

                TimeoutVal.tv_usec = 0;

                s32Ret = select(maxfd + 1, &read_fds, NULL, NULL, &TimeoutVal);

                    //printf("s32Ret:%d",s32Ret);

                if (s32Ret < 0)

                {

                    SAMPLE_PRT("select failed!\n");

                    break;

                }

                else if (s32Ret == 0)

                {

                    SAMPLE_PRT("get venc stream time out, exit thread\n");

                    continue;

                }

                else

                {

                    for (i = 0; i < s32ChnTotal; i++)

                    {

                                //printf("venc[%d]:",i);

                        if (FD_ISSET(VencFd, &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!\n", i, s32Ret);

                                break;

                            }

                                       

                                                if(0 == stStat.u32CurPacks)

                                                {

                                                 

                                                        SAMPLE_PRT("NOTE: Current  frame is NULL!\n");

                                                        continue;

                                                }

                            /*******************************************************

                            step 2.3 : 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!\n");

                                    break;

                                }

                    

                            /*******************************************************

                            step 2.4 : 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!\n",s32Ret);

                                break;

                            }                    

                                    MP4WriteSample(hMP4File, video, stStream.pstPack[0].pu8Addr+stStream.pstPack[0].u32Offset,stStream.pstPack[0].u32Len-stStream.pstPack[0].u32Offset,MP4_INVALID_DURATION, 0, 1);

                            //printf("venc[%d]:%d\n",i,stStream.pstPack[0].u32Len-stStream.pstPack[0].u32Offset);

                            //printf("FD_ISSET success\n");

                            /*******************************************************

                                step 2.6 : release stream

                            *******************************************************/

                            //if(flag==0)

                            //{

                                s32Ret = HI_MPI_VENC_ReleaseStream(i, &stStream);

                                if (HI_SUCCESS != s32Ret)

                                {

                                    free(stStream.pstPack);

                                                printf("HI_SUCCESS != s32Ret free  stStream.pstPack--%d\n",i);        

                                    stStream.pstPack = NULL;

                                    break;

                                }

                           // }

                            /*******************************************************

                            step 2.7 : free pack nodes

                            *******************************************************/

                            free(stStream.pstPack);

                                    //printf("free  stStream.pstPack--%d\n",i);

                            stStream.pstPack = NULL;                 

                                    }

                                        /*for(i=0; i<2; i++)

                                            {

                                                VencChn = i*2;

                                                VpssGrp = i;   

                                                    SAMPLE_COMM_VENC_UnBindVpss(VencChn,VpssGrp,0);

                                                VencChn++;

                                                SAMPLE_COMM_VENC_UnBindVpss(VencChn,VpssGrp,1);

                                        }*/                                                      else

                        {

                           // printf("FD_ISSET fail\n");



                        }

                    }

                    if(w==1300)

                    {

                        flag=1;

                    }

                    if(flag==1&&l_flag==0)

                    {

                        printf("pthrad_begin\n");

                        pthread_create(&pt,0,vedio_recorde,NULL);

                        l_flag=1;      

                    }

                    if(w==1500)

                                {

                                    int VencChn,VpssGrp;

                                    for (i = 0; i <4; i++)

                                        {

                                    //fclose(pFile);                               

                                        MP4Close(hMP4File,0);

                                        //printf("mp4 close\n");                                    

                                        }

                    break;

                    }

                    w++;

                }

   

        }

    j++;

    }

    return NULL;

}

我来回答
回答4个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-01-22 07:44:35
认可0
MP4WriteSample(hMP4File, video, stStream.pstPack[0].pu8Addr+stStream.pstPack[0].u32Offset,stStream.pstPack[0].u32Len-stStream.pstPack[0].u32Offset,MP4_INVALID_DURATION, 0, 1);

楼主确定码流是单包模式吗? 如果不是,那么上面的写法是不是就有问题了

houyongnan

1个粉丝

32

问答

0

专栏

0

资料

houyongnan 2018-01-22 09:07:34
认可0
是单包模式

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-01-22 09:11:53
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=83665&ptid=38724]houyongnan 发表于 2018-1-22 09:07[/url]
是单包模式[/quote]

先写裸码吧, 把事情搞复杂了不利于调试

houyongnan

1个粉丝

32

问答

0

专栏

0

资料

houyongnan 2018-01-22 09:12:34
认可0
出现这个原因可能是文件没有正常关闭
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区