算能科技
直播中

孙奕

7年用户 879经验值
私信 关注
[问答]

H264硬编码CVI_VENC_StartRecvFrame报错的原因?怎么解决?

环境:
芯片:cv1812h
步骤:
s32Ret = CVI_VENC_CreateChn(vencChn, pstVencChnAttr);
if (s32Ret != CVI_SUCCESS) {
        ERR_COUT << "CVI_VENC_CreateChn failed: " << s32Ret << END_COUT;
        assert("encoder init CVI_VENC_CreateChn() failed"    false);
    }

........  配置h264信息步骤省略 ...........

s32Ret = CVI_VENC_SetChnParam(vencChn, pstChnParam);
    if (s32Ret != CVI_SUCCESS) {
        ERR_COUT << "CVI_VENC_SetH264Dblk failed: " << s32Ret << END_COUT;
    }


stRecvParam.s32RecvPicNum = -1;
    std::cout << "CVI_VENC_StartRecvFramen";
    s32Ret = CVI_VENC_StartRecvFrame(vencChn,  stRecvParam);
    if (s32Ret != CVI_SUCCESS) {
        ERR_COUT << "CVI_VENC_StartRecvFrame failed: " << s32Ret << END_COUT;
        assert("encoder init CVI_VENC_StartRecvFrame() failed"    false);
    }
问题:
调用CVI_VENC_StartRecvFrame 返回错误码
输出结果
[12439.247775] ion allocated len=0x3b9aca00 failed
[12439.266376] CVI_VENC_StartRecvFrame with -1
      


回帖(2)

刘鹏

2024-1-15 14:30:35
  vencChn = 0;
    PAYLOAD_TYPE_E enType = PT_H264;
    SAMPLE_RC_E enRcMode = SAMPLE_RC_CBR;
    VB_SOURCE_E source = VB_SOURCE_COMMON;
    VENC_GOP_MODE_E gopMode = CVI_H26X_GOP_MODE_DEFAULT;
    CVI_S32 s32Ret;
 
    VB_CONFIG_S stVbConf;
    VENC_GOP_ATTR_S stGopAttr, *pstGopAttr =  stGopAttr;
    VENC_CHN_ATTR_S stVencChnAttr, *pstVencChnAttr =  stVencChnAttr;
    VENC_RC_PARAM_S stRcParam, *pstRcParam =  stRcParam;
    VENC_REF_PARAM_S stRefParam, *pstRefParam =  stRefParam;
    VENC_CU_PREDICTION_S stCuPrediction, *pstCuPrediction =  stCuPrediction;
    VENC_FRAMELOST_S stFL, *pstFL =  stFL;
    VENC_SUPERFRAME_CFG_S stsf, *pstsf =  stsf;
    VENC_CHN_PARAM_S stChnParam, *pstChnParam =  stChnParam;
    VENC_RECV_PIC_PARAM_S stRecvParam;
 
    memset( stVbConf, 0, sizeof(VB_CONFIG_S));
    stVbConf.u32MaxPoolCnt = 0;
 
    if (initSystemAndVb( stVbConf, _Width, _Height) != CVI_SUCCESS)
        assert("encoder init initSystemAndVb() failed"    false);
 
    if (setModParam(source) != CVI_SUCCESS)
        assert("encoder init setModParam() failed"    false);
 
    if (setGopAttr(pstGopAttr, gopMode) != CVI_SUCCESS)
        assert("encoder init setGopAttr() failed"    false);
 
    if (setChnAttr(pstVencChnAttr, pstGopAttr, _Width, _Height, _Fps, enType, enRcMode) != CVI_SUCCESS)
        assert("encoder init setChnAttr() failed"    false);
 
    s32Ret = CVI_VENC_CreateChn(vencChn, pstVencChnAttr);
    if (s32Ret != CVI_SUCCESS) {
        ERR_COUT << "CVI_VENC_CreateChn failed: " << s32Ret << END_COUT;
        assert("encoder init CVI_VENC_CreateChn() failed"    false);
    }
 
    if (enType != PT_JPEG)
    {
        if (setRcParam(pstRcParam, enType, enRcMode) != CVI_SUCCESS) {
            CVI_VENC_DestroyChn(vencChn);
            assert("encoder init setRcParam() failed"    false);
        }
 
        if (setRefParam(pstRefParam) != CVI_SUCCESS) {
            CVI_VENC_DestroyChn(vencChn);
            assert("encoder init setRefParam() failed"    false);
        }
 
        if (setCuPrediction(pstCuPrediction) != CVI_SUCCESS) {
            CVI_VENC_DestroyChn(vencChn);
            assert("encoder init setCuPrediction() failed"    false);
        }
 
        if (setFrameLost(pstFL) != CVI_SUCCESS) {
            CVI_VENC_DestroyChn(vencChn);
            assert("encoder init setFrameLost() failed"    false);
        }
 
        if (setSuperFrame(pstsf) != CVI_SUCCESS) {
            CVI_VENC_DestroyChn(vencChn);
            assert("encoder init setSuperFrame() failed"    false);
        }
 
        if (enType != PT_MJPEG)
        {
            if (attachVbPoolIfSourceUser(enType) != CVI_SUCCESS) {
                CVI_VENC_DestroyChn(vencChn);
                assert("encoder init attachVbPoolIfSourceUser() failed"    false);
            }
        }
    }
 
    if (enType == PT_H264)
    {
        if (setH264Entropy() != CVI_SUCCESS) {
            CVI_VENC_DestroyChn(vencChn);
            assert("encoder init setH264Entropy() failed"    false);
        }
 
        if (setH264Trans() != CVI_SUCCESS) {
            CVI_VENC_DestroyChn(vencChn);
            assert("encoder init setH264Trans() failed"    false);
        }
 
        if (setH264Vui() != CVI_SUCCESS) {
            CVI_VENC_DestroyChn(vencChn);
            assert("encoder init setH264Vui() failed"    false);
        }
 
        if (setH264SliceSplit(_Height) != CVI_SUCCESS) {
            CVI_VENC_DestroyChn(vencChn);
            assert("encoder init setH264SliceSplit() failed"    false);
        }
 
        // if (setH264Dblk() != CVI_SUCCESS) {
        //     CVI_VENC_DestroyChn(vencChn);
        //     assert("encoder init setH264Dblk() failed"    false);
        // }
 
        // if (setH264IntraPred() != CVI_SUCCESS) {
        //     CVI_VENC_DestroyChn(vencChn);
        //     assert("encoder init setH264IntraPred() failed"    false);
        // }
    }
 
    if (setChnParam(pstChnParam, _Width, _Height, _Fps) != CVI_SUCCESS) {
        CVI_VENC_DestroyChn(vencChn);
        assert("encoder init setChnParam() failed"    false);
    }
 
    /*
     *  编码通道连续接收并编码的帧数。
     *  范围:[-1,0)∪(0 ∞]
     */
    stRecvParam.s32RecvPicNum = -1;
    s32Ret = CVI_VENC_StartRecvFrame(vencChn,  stRecvParam);
    if (s32Ret != CVI_SUCCESS) {
        ERR_COUT << "CVI_VENC_StartRecvFrame failed: " << s32Ret << END_COUT;
        assert("encoder init CVI_VENC_StartRecvFrame() failed"    false);
    }
 
 
举报

贾埃罗

2024-1-15 18:54:51
在调用CVI_VENC_CreateChn函数创建编码通道之后,调用CVI_VENC_StartRecvFrame函数开始接收视频帧编码时,出现了错误。这种错误通常有多种原因,可能是参数配置有误、芯片硬件不支持该功能或者其他原因。

要解决这个问题,可以采取以下步骤:

1. 确保参数配置正确:检查CVI_VENC_CreateChn函数的输入参数pstVencChnAttr是否正确配置,包括编码分辨率、编码码率、编码格式等。可以参考编码器的配置手册进行正确设置。

2. 确保芯片硬件支持该功能:查阅芯片的技术文档和开发手册,确认芯片是否支持H264硬编码功能,并检查是否存在其他硬件设置相关的限制或要求。

3. 检查其他错误:在调用CVI_VENC_StartRecvFrame函数之前,可以添加一些错误检查的代码,例如检查CVI_VENC_CreateChn函数返回值是否为CVI_SUCCESS,以及CVI_VENC_StartRecvFrame函数调用之后的返回值等。

4. 联系芯片厂商支持:如果以上步骤均无法解决问题,建议联系芯片厂商的技术支持团队,提供错误日志和相关调用代码,以便他们能够更好地分析和解决问题。

总之,解决H264硬编码CVI_VENC_StartRecvFrame报错的关键是正确配置参数、确认硬件支持、检查其他错误以及与芯片厂商技术支持团队进行沟通和协助。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分