1. 程式人生 > >HISI VENC 實際輸出幀率控制

HISI VENC 實際輸出幀率控制

平臺:HI3516EV100

SDK : Hi3516CV300_SDK_V1.0.2.0

系統 : LiteOS

海思MPP文件裡寫的我就不多說了,不知道是我理解有問題還是什麼,反正很多次都不能準確的控制實際的編碼(VENC)輸出幀率,就是  cat /proc/venc  能看到的通道輸出幀率,今天特地花時間來研究下,發下有如下規律:

  • 海思的幀率控制無非就是如下這些地方涉及到:
  1. ISP  -----------------------------------------> HI_MPI_ISP_SetPubAttr
  2. VI  -----------------------------------------> HI_MPI_VI_SetChnAttr
  3. VPSS  -----------------------------------------> HI_MPI_VPSS_SetChnAttr
  4. VENC  -----------------------------------------> HI_MPI_VENC_SetChnAttr 主要修改RC(位元速率控制器)

    另外  :

         HI_MPI_VENC_CreateChn 建立通道也會設定幀率。

         HI_MPI_VENC_SetFrameRate 也能控制編碼幀率

重點就在上邊的4個步驟裡邊:

畫了一張草圖幫助理解

如上圖: 

ISP處理為30幀/s   

VI處幀率不做控制(mpp文件推薦的,影響抓拍) ,其實應該就是ISP處的30幀/s

VPSS 設定src:30   dst:15 ,理解為VPSS接收到 ( VI ) 的幀,每src幀只處理dst幀

VENC 設定 src:15  dst : 15  , 理解為VENC 接收到 ( VPSS ) 的幀,每src幀只處理dst幀

這樣理解就能清楚的多了,如此,比如要得到實際輸出 12幀的幀率,只需要最後將VENC設定成src:15  dst : 12 就可以了。

相關介面引數設定:

  • HI_MPI_ISP_SetPubAttr

               stPubAttr.f32FrameRate = 30; 

  • HI_MPI_VI_SetChnAttr 此處不進行幀率控制:

              stChnAttr.s32SrcFrameRate = -1;

              stChnAttr.s32DstFrameRate = -1;

  • HI_MPI_VPSS_SetChnAttr;

              chnAttr.s32SrcFrameRate = 30;

              chnAttr.s32DstFrameRate = 15;

  • HI_MPI_VENC_SetChnAttr  主要修改RC(位元速率控制器)

             vencAtt0.stRcAttr.stAttrH264Vbr.fr32DstFrmRate = 15;

            vencAtt0.stRcAttr.stAttrH264Vbr.u32SrcFrmRate = 15;

自測按照該方法去設定能準確的控制實際編碼輸出幀率,如有問題,希望各位不吝指正,萬分感謝。

結果截圖:

cat /proc/rc

cat /proc/venc