HISI VENC 實際輸出幀率控制
平臺:HI3516EV100
SDK : Hi3516CV300_SDK_V1.0.2.0
系統 : LiteOS
海思MPP文件裡寫的我就不多說了,不知道是我理解有問題還是什麼,反正很多次都不能準確的控制實際的編碼(VENC)輸出幀率,就是 cat /proc/venc 能看到的通道輸出幀率,今天特地花時間來研究下,發下有如下規律:
- 海思的幀率控制無非就是如下這些地方涉及到:
- ISP -----------------------------------------> HI_MPI_ISP_SetPubAttr
- VI -----------------------------------------> HI_MPI_VI_SetChnAttr
- VPSS -----------------------------------------> HI_MPI_VPSS_SetChnAttr
- 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