我现在的帧率大概在40左右,我用编25帧率的方式去编码,发现在video enc中,帧有丢失,通过打印,发现是buffer队列满了,没有可用的output buffer,所以导致input frame 被free。
我现在修改如下:
用编码60帧的方式去编码,发现队列还是会堵塞。
我发现有个高速模式,不知道怎么设置?
MULTICH_INIT_STRUCT(EncLink_CreateParams,encPrm);
{
EncLink_ChCreateParams *pLinkChPrm;
EncLink_ChDynamicParams *pLinkDynPrm;
VENC_CHN_DYNAMIC_PARAM_S *pDynPrm;
VENC_CHN_PARAMS_S *pChPrm;
UInt32 i;
for (i = 0; i < VENC_PRIMARY_CHANNELS; i++)
{
pLinkChPrm = &encPrm.chCreateParams[i];
pLinkDynPrm = &pLinkChPrm->defaultDynamicParams;
pChPrm = &gVencModuleContext.vencConfig.encChannelParams[i];
pDynPrm = &pChPrm->dynamicParam;
// pLinkChPrm->format = IVIDEO_MJPEG;
pLinkChPrm->format = IVIDEO_H264HP;
pLinkChPrm->profile = gVencModuleContext.vencConfig.h264Profile[i];
pLinkChPrm->dataLayout = IVIDEO_PROGRESSIVE;
pLinkChPrm->fieldMergeEncodeEnable = FALSE;
pLinkChPrm->enableAnalyticinfo = pChPrm->enableAnalyticinfo;
// pLinkChPrm->maxBitRate = pChPrm->maxBitRate;
// pLinkChPrm->maxBitRate = 4000000;
pLinkChPrm->maxBitRate = 4000000;
pLinkChPrm->encodingPreset = XDM_HIGH_SPEED;//pChPrm->encodingPreset;
pLinkChPrm->rateControlPreset = IVIDEO_USER_DEFINED;
pLinkChPrm->enableHighSpeed = TRUE;//FALSE;
pLinkChPrm->enableWaterMarking = pChPrm->enableWaterMarking;
pLinkChPrm->StreamPreset = gUI_mcfw_config.StreamPreset[i];
pLinkDynPrm->intraFrameInterval = pDynPrm->intraFrameInterval;
// pLinkDynPrm->targetBitRate = pDynPrm->targetBitRate;
// pLinkDynPrm->targetBitRate = 2000000;
pLinkDynPrm->targetBitRate = 8000000;//8000000
pLinkDynPrm->interFrameInterval = 1;
pLinkDynPrm->mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
pLinkDynPrm->inputFrameRate = pDynPrm->inputFrameRate;
pLinkDynPrm->rcAlg = pDynPrm->rcAlg;
pLinkDynPrm->qpMin = pDynPrm->qpMin;
pLinkDynPrm->qpMax = pDynPrm->qpMax;
pLinkDynPrm->qpInit = pDynPrm->qpInit;
pLinkDynPrm->vbrDuration = pDynPrm->vbrDuration;
pLinkDynPrm->vbrSensitivity = pDynPrm->vbrSensitivity;
encPrm.numBufPerCh[i] = NUM_ENCODE_BUFFERS;
gVencModuleContext.encFormat[i] = pLinkChPrm->format;
}
}
encPrm.chCreateParams[0].defaultDynamicParams.inputFrameRate = 60;//30;
encPrm.chCreateParams[1].defaultDynamicParams.inputFrameRate = 60;//30;
encPrm.vsEnable = 0;
encPrm.isVaUseCase = 0;
encPrm.inQueParams.prevLinkId = gIpcInVideoId;
encPrm.inQueParams.prevLinkQueId = 0;
encPrm.outQueParams.nextLink = gIpcBitsOutVideoId;
ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = gEncId;
ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcBitsOutVideoPrm.baseCreateParams.numOutQue = 1;
ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = gIpcBitsInHLOSId;
ipcBitsOutVideoPrm.baseCreateParams.inputFrameRate = 60;//30;
ipcBitsOutVideoPrm.baseCreateParams.outputFrameRate = 60;//30;
ipcBitsOutVideoPrm.baseCreateParams.processLink = SYSTEM_LINK_ID_INVALID;
Ternence_Hsu:
你好;
设置高速编码模式: pLinkChPrm->enableHighSpeed = TRUE;//FALSE
已经配置为快速编码了;
发现丢帧,你可以把link的状态信息打印出来,查看是哪个link没有处理过来,导致丢帧的;
bing bing:
回复 Ternence_Hsu:
你好,我直接在enc编码完成后释放,发现没有丢帧,但是通过 outvideo–》inhost 在host中释放,产生了丢帧,具体原因还不详,不知道在配置的时候有没有什么要求?
Ternence_Hsu:
回复 bing bing:
ipcbit 是否丢帧,你可以再统计一下; (没有遇到过这样的情况,应当是不会丢帧的,这里实际只是一个地址的传递)
这里你需要注意,输出的实际帧率,并不是你编码帧率参数的设置的值是多少; M3VIDEO的link在处理数据的过程中,没有绝对时间概念的,不是指定30帧输出实际就是输出30帧,还需要看输入数据