海思3518EV200 SDK中獲取和保存H.264碼流詳解

 1     /******************************************  2  step 2: Start to get streams of each channel.  3  ******************************************/
 4     while (HI_TRUE == pstPara->bThreadStart)  5  {  6         FD_ZERO(&read_fds);  7         for (i = 0; i < s32ChnTotal; i++)  8  {  9             FD_SET(VencFd[i], &read_fds);  10  }  11 
 12         TimeoutVal.tv_sec  = 2;  13         TimeoutVal.tv_usec = 0;  14         s32Ret = select(maxfd + 1, &read_fds, NULL, NULL, &TimeoutVal);//select非阻塞
 15         if (s32Ret < 0)  16  {  17             SAMPLE_PRT("select failed!\n");  18             break;  19  }  20         else if (s32Ret == 0)  21  {  22             SAMPLE_PRT("get venc stream time out, exit thread\n");  23             continue;  24  }  25         else
 26  {  27             for (i = 0; i < s32ChnTotal; i++)  28  {  29                 if (FD_ISSET(VencFd[i], &read_fds))  30  {  31                     /*******************************************************  32  step 2.1 : query how many packs in one-frame stream.  33  *******************************************************/
 34                     memset(&stStream, 0, sizeof(stStream));  35                     s32Ret = HI_MPI_VENC_Query(i, &stStat);  36                     if (HI_SUCCESS != s32Ret)  37  {  38                         SAMPLE_PRT("HI_MPI_VENC_Query chn[%d] failed with %#x!\n", i, s32Ret);  39                         break;  40  }  41                     
 42                     /*******************************************************  43  step 2.2 :suggest to check both u32CurPacks and u32LeftStreamFrames at the same time,for example:  44  if(0 == stStat.u32CurPacks || 0 == stStat.u32LeftStreamFrames)  45  {  46  SAMPLE_PRT("NOTE: Current frame is NULL!\n");  47  continue;  48  }  49  *******************************************************/
 50                     if(0 == stStat.u32CurPacks)  51  {  52                           SAMPLE_PRT("NOTE: Current frame is NULL!\n");  53                           continue;  54  }  55                     /*******************************************************  56  step 2.3 : malloc corresponding number of pack nodes.  57  *******************************************************/
 58                     stStream.pstPack = (VENC_PACK_S*)malloc(sizeof(VENC_PACK_S) * stStat.u32CurPacks);  59                     if (NULL == stStream.pstPack)  60  {  61                         SAMPLE_PRT("malloc stream pack failed!\n");  62                         break;  63  }  64                     
 65                     /*******************************************************  66  step 2.4 : call mpi to get one-frame stream  67  *******************************************************/
 68                     stStream.u32PackCount = stStat.u32CurPacks;  69                     s32Ret = HI_MPI_VENC_GetStream(i, &stStream, HI_TRUE);  70                     if (HI_SUCCESS != s32Ret)  71  {  72                         free(stStream.pstPack);  73                         stStream.pstPack = NULL;  74                         SAMPLE_PRT("HI_MPI_VENC_GetStream failed with %#x!\n", \  75  s32Ret);  76                         break;  77  }  78 
 79                     /*******************************************************  80  step 2.5 : save frame to file  81  *******************************************************/
 82                     s32Ret = SAMPLE_COMM_VENC_SaveStream(enPayLoadType[i], pFile[i], &stStream);  83                     if (HI_SUCCESS != s32Ret)  84  {  85                         free(stStream.pstPack);  86                         stStream.pstPack = NULL;  87                         SAMPLE_PRT("save stream failed!\n");  88                         break;  89  }  90                     /*******************************************************  91  step 2.6 : release stream  92  *******************************************************/
 93                     s32Ret = HI_MPI_VENC_ReleaseStream(i, &stStream);  94                     if (HI_SUCCESS != s32Ret)  95  {  96                         free(stStream.pstPack);  97                         stStream.pstPack = NULL;  98                         break;  99  } 100                     /******************************************************* 101  step 2.7 : free pack nodes 102  *******************************************************/
103                     free(stStream.pstPack); 104                     stStream.pstPack = NULL; 105  } 106             }

重點在這裏,調用API獲取H.264視頻流並保存node

 1                     /*******************************************************  2  step 2.4 : call mpi to get one-frame stream  3  *******************************************************/
 4                     stStream.u32PackCount = stStat.u32CurPacks;  5                     s32Ret = HI_MPI_VENC_GetStream(i, &stStream, HI_TRUE);  6                     if (HI_SUCCESS != s32Ret)  7  {  8                         free(stStream.pstPack);  9                         stStream.pstPack = NULL; 10                         SAMPLE_PRT("HI_MPI_VENC_GetStream failed with %#x!\n", \ 11  s32Ret); 12                         break; 13  } 14 
15                     /******************************************************* 16  step 2.5 : save frame to file 17  *******************************************************/
18                     s32Ret = SAMPLE_COMM_VENC_SaveStream(enPayLoadType[i], pFile[i], &stStream); 19                     if (HI_SUCCESS != s32Ret) 20  { 21                         free(stStream.pstPack); 22                         stStream.pstPack = NULL; 23                         SAMPLE_PRT("save stream failed!\n"); 24                         break; 25                     }

 

1)HI_MPI_VENC_GetStream(i, &stStream, HI_TRUE);spa

HiMPP IPC V2.0 媒體處理軟件開發參考P540

 

2)s32Ret = SAMPLE_COMM_VENC_SaveStream(enPayLoadType[i], pFile[i], &stStream);
相關文章
相關標籤/搜索