- 項(xiàng)目介紹:
本章節(jié)講的是RV1126通過(guò)VI模塊和VENC的綁定獲取VENC碼流。視頻編碼流程主要分三步:VI的初始化、VENC的初始化、綁定VI和VENC節(jié)點(diǎn)、開(kāi)啟VENC線程進(jìn)行視頻編碼的采集。
- VI和VENC的流程圖:

2.1. VI設(shè)備的初始化


VI設(shè)備的初始化,需要用到以下參數(shù):pcVideoNode(設(shè)備節(jié)點(diǎn))、u32Width(寬度)、u32Height(高度)、enPixFmt(圖片格式)、u32BufCnt(buf的數(shù)量)、enWorkMode(工作模式)。設(shè)置完成之后,則調(diào)用RK_MPI_VI_SetChnAttr設(shè)置VI的屬性,并使能VI設(shè)備(RK_MPI_VI_EnableChn)
RV1126視頻設(shè)備節(jié)點(diǎn):

2.2. VENC模塊的初始化


VENC模塊的初始化,下面有幾個(gè)重要參數(shù):enType(編碼類(lèi)型)、imageType(圖片格式)、u32VirWidth(圖片虛寬)、u32VirHeight(圖片虛高)、u32Profile(編碼等級(jí))、bByFrame(預(yù)留參數(shù)默認(rèn)0)****、u32PicWidth(圖片寬度)、u32PicHeight(圖片高度)、enRotation(是否旋轉(zhuǎn))。設(shè)置完成之后,使用RK_MPI_VENC_CreateChn創(chuàng)建VENC編碼器。
2.3. 綁定VI和VENC節(jié)點(diǎn)

使用RK_MPI_SYS_Bind把VI節(jié)點(diǎn)和VENC進(jìn)行綁定,其中enModId是模塊ID號(hào)、s32ChnId是通道號(hào)。VI_CHN的enModId是RK_ID_VI,通道ID則是從VI_CONTAINER容器獲取。
VENC_CHN的enModId是RK_ID_VENC,通道ID則是從VENC_CONTAINER容器獲取
2.4. 開(kāi)啟VENC線程采集每一幀視頻編碼數(shù)據(jù)并存儲(chǔ)到視頻隊(duì)列

在這個(gè)camera_venc_thread線程里面,利用RK_MPI_SYS_GetMediaBuffer的API采集VENC的數(shù)據(jù),并把數(shù)據(jù)賦值到video_data_packet_t結(jié)構(gòu)體里面(這個(gè)結(jié)構(gòu)體里面主要存儲(chǔ)編碼后視頻的緩沖區(qū)數(shù)據(jù)和長(zhǎng)度)。并且把這個(gè)結(jié)構(gòu)體的數(shù)據(jù)入到video_packet_queue隊(duì)列里面(具體操作:putVideoPacketQueue)。
注意:RK_MPI_SYS_GetMediaBuffer只是拿到一個(gè)整體的緩沖區(qū)數(shù)據(jù),這個(gè)緩沖區(qū)數(shù)據(jù)包含緩沖區(qū)指針數(shù)據(jù)和緩沖區(qū)長(zhǎng)度。如果我們需要真正獲取緩沖區(qū)指針的數(shù)據(jù),就要用RK_MPI_MB_GetPtr去獲取。若要拿到緩沖區(qū)長(zhǎng)度則需要調(diào)用RK_MPI_MB_GetSize去獲取。
