rkipc的h265设置

server/2025/3/30 11:39:15/

资料的位置

源代码在luckfox-pico/project/app/rkipc/rkipc/src/rv1106_ipc/video/video.c中,使用了rkmpi库,参考资料为"doc/zh/media/Rockchip_Developer_Guide_MPI.pdf"

通道设置设置

H265的通道设置主要由rkipc_pipe_0_init完成,之前要设置好isp,调用RK_MPI_SYS_Init()初始化好rkmpi系统
根据ini文件将参数填上

int rkipc_pipe_0_init() {int ret;//int video_width = rk_param_get_int("video.0:width", -1);video_width = 1920;//int video_height = rk_param_get_int("video.0:height", -1);video_height = 1080;//int buffer_line = rk_param_get_int("video.source:buffer_line", video_height / 4);int buffer_line = 1080;//int rotation = rk_param_get_int("video.source:rotation", 0);int rotation = 180;int buf_cnt = 2;//int frame_min_i_qp = rk_param_get_int("video.0:frame_min_i_qp", 26);int frame_min_i_qp = 26;//int frame_min_qp = rk_param_get_int("video.0:frame_min_qp", 28);int frame_min_qp = 28;//int frame_max_i_qp = rk_param_get_int("video.0:frame_max_i_qp", 51);int frame_max_i_qp = 51;//int frame_max_qp = rk_param_get_int("video.0:frame_max_qp", 51);int frame_max_qp = 51;//int scalinglist = rk_param_get_int("video.0:scalinglist", 0);int scalinglist = 0;// VI//VI输入通道//输入通道的参数VI_CHN_ATTR_S vi_chn_attr;memset(&vi_chn_attr, 0, sizeof(vi_chn_attr));//VI_ISP_OPT_S 获取图像为isp处理/直通数据的参数设置。//RW;输出通道总的缓存块数。2vi_chn_attr.stIspOpt.u32BufCount = buf_cnt;//获取图像的V4L2内存类型。vi_chn_attr.stIspOpt.enMemoryType = VI_V4L2_MEMORY_TYPE_DMABUF;//ISP的最大宽度//vi_chn_attr.stIspOpt.stMaxSize.u32Width = rk_param_get_int("video.0:max_width", 2560);vi_chn_attr.stIspOpt.stMaxSize.u32Width = 1920;//ISP的最大高度//vi_chn_attr.stIspOpt.stMaxSize.u32Height = rk_param_get_int("video.0:max_height", 1440);vi_chn_attr.stIspOpt.stMaxSize.u32Height = 1080;//通道的宽度 1920vi_chn_attr.stSize.u32Width = video_width;//通道高度 1080vi_chn_attr.stSize.u32Height = video_height;//目标图像像素格式。vi_chn_attr.enPixelFormat = RK_FMT_YUV420SP;//用户获取图像的队列深度。取值范围:[0,8];0不能手动获取vi_chn_attr.u32Depth = 0;//目标图像压缩格式。无压缩vi_chn_attr.enCompressMode = COMPRESS_MODE_NONE;//设置VI通道ret = RK_MPI_VI_SetChnAttr(pipe_id_, VIDEO_PIPE_0, &vi_chn_attr);if (ret) {LOG_ERROR("ERROR: create VI error! ret=%d\n", ret);return ret;}//使能VI通道ret = RK_MPI_VI_EnableChn(pipe_id_, VIDEO_PIPE_0);if (ret) {LOG_ERROR("ERROR: create VI error! ret=%d\n", ret);return ret;}// VENC//编码器//编码器属性结构体VENC_CHN_ATTR_S venc_chn_attr;memset(&venc_chn_attr, 0, sizeof(venc_chn_attr));//tmp_output_data_type = rk_param_get_string("video.0:output_data_type", NULL);tmp_output_data_type = H.265;//tmp_rc_mode = rk_param_get_string("video.0:rc_mode", NULL);//恒定码率tmp_rc_mode = CBR;//tmp_h264_profile = rk_param_get_string("video.0:h264_profile", NULL);tmp_h264_profile = high;//tmp_rc_mode, tmp_output_data_type 必填if ((tmp_output_data_type == NULL) || (tmp_rc_mode == NULL)) {LOG_ERROR("tmp_output_data_type or tmp_rc_mode is NULL\n");return -1;}LOG_DEBUG("tmp_output_data_type is %s, tmp_rc_mode is %s, tmp_h264_profile is %s\n",tmp_output_data_type, tmp_rc_mode, tmp_h264_profile);//h264模式的设置if (!strcmp(tmp_output_data_type, "H.264")) {//h264的格式 RK_VIDEO_ID_AVCvenc_chn_attr.stVencAttr.enType = RK_VIDEO_ID_AVC;//图像级别,高100, 主77,基础66,其它的错误if (!strcmp(tmp_h264_profile, "high"))venc_chn_attr.stVencAttr.u32Profile = 100;else if (!strcmp(tmp_h264_profile, "main"))venc_chn_attr.stVencAttr.u32Profile = 77;else if (!strcmp(tmp_h264_profile, "baseline"))venc_chn_attr.stVencAttr.u32Profile = 66;elseLOG_ERROR("tmp_h264_profile is %s\n", tmp_h264_profile);//tmp_rc_mode CBR 码率控制为恒定码率if (!strcmp(tmp_rc_mode, "CBR")) {//码率控制//模式恒定码率venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;//venc_chn_attr.stRcAttr.stH264Cbr.u32Gop = rk_param_get_int("video.0:gop", -1);//I帧间隔venc_chn_attr.stRcAttr.stH264Cbr.u32Gop = 50;//venc_chn_attr.stRcAttr.stH264Cbr.u32BitRate = rk_param_get_int("video.0:max_rate", -1);//平均 bitrate,以 kbps 为单位。venc_chn_attr.stRcAttr.stH264Cbr.u32BitRate = 2048;//venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = rk_param_get_int("video.0:dst_frame_rate_den", -1);//输出帧率分母venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 25;//venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = rk_param_get_int("video.0:dst_frame_rate_num", -1);//输出帧率分子venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = 1;//venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = rk_param_get_int("video.0:src_frame_rate_den", -1);//输入帧率分母venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 25;//venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = rk_param_get_int("video.0:src_frame_rate_num", -1);//输入帧率分子venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 1;} else { //可变码率 多了最大码率和最小码率venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264VBR;venc_chn_attr.stRcAttr.stH264Vbr.u32Gop = rk_param_get_int("video.0:gop", -1);venc_chn_attr.stRcAttr.stH264Vbr.u32BitRate = rk_param_get_int("video.0:mid_rate", -1);venc_chn_attr.stRcAttr.stH264Vbr.u32MaxBitRate =rk_param_get_int("video.0:max_rate", -1);venc_chn_attr.stRcAttr.stH264Vbr.u32MinBitRate =rk_param_get_int("video.0:min_rate", -1);venc_chn_attr.stRcAttr.stH264Vbr.fr32DstFrameRateDen =rk_param_get_int("video.0:dst_frame_rate_den", -1);venc_chn_attr.stRcAttr.stH264Vbr.fr32DstFrameRateNum =rk_param_get_int("video.0:dst_frame_rate_num", -1);venc_chn_attr.stRcAttr.stH264Vbr.u32SrcFrameRateDen =rk_param_get_int("video.0:src_frame_rate_den", -1);venc_chn_attr.stRcAttr.stH264Vbr.u32SrcFrameRateNum =rk_param_get_int("video.0:src_frame_rate_num", -1);}} else if (!strcmp(tmp_output_data_type, "H.265")) { //h265设置 和h264差不多venc_chn_attr.stVencAttr.enType = RK_VIDEO_ID_HEVC;if (!strcmp(tmp_rc_mode, "CBR")) {venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H265CBR;venc_chn_attr.stRcAttr.stH265Cbr.u32Gop = rk_param_get_int("video.0:gop", -1);venc_chn_attr.stRcAttr.stH265Cbr.u32BitRate = rk_param_get_int("video.0:max_rate", -1);venc_chn_attr.stRcAttr.stH265Cbr.fr32DstFrameRateDen =rk_param_get_int("video.0:dst_frame_rate_den", -1);venc_chn_attr.stRcAttr.stH265Cbr.fr32DstFrameRateNum =rk_param_get_int("video.0:dst_frame_rate_num", -1);venc_chn_attr.stRcAttr.stH265Cbr.u32SrcFrameRateDen =rk_param_get_int("video.0:src_frame_rate_den", -1);venc_chn_attr.stRcAttr.stH265Cbr.u32SrcFrameRateNum =rk_param_get_int("video.0:src_frame_rate_num", -1);} else { venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H265VBR;venc_chn_attr.stRcAttr.stH265Vbr.u32Gop = rk_param_get_int("video.0:gop", -1);venc_chn_attr.stRcAttr.stH265Vbr.u32BitRate = rk_param_get_int("video.0:mid_rate", -1);venc_chn_attr.stRcAttr.stH265Vbr.u32MaxBitRate =rk_param_get_int("video.0:max_rate", -1);venc_chn_attr.stRcAttr.stH265Vbr.u32MinBitRate =rk_param_get_int("video.0:min_rate", -1);venc_chn_attr.stRcAttr.stH265Vbr.fr32DstFrameRateDen =rk_param_get_int("video.0:dst_frame_rate_den", -1);venc_chn_attr.stRcAttr.stH265Vbr.fr32DstFrameRateNum =rk_param_get_int("video.0:dst_frame_rate_num", -1);venc_chn_attr.stRcAttr.stH265Vbr.u32SrcFrameRateDen =rk_param_get_int("video.0:src_frame_rate_den", -1);venc_chn_attr.stRcAttr.stH265Vbr.u32SrcFrameRateNum =rk_param_get_int("video.0:src_frame_rate_num", -1);}} else { //不是h264, h265则错误格式LOG_ERROR("tmp_output_data_type is %s, not support\n", tmp_output_data_type);return -1;}//tmp_gop_mode = rk_param_get_string("video.0:gop_mode", NULL);//P帧的设置,一般,智能tmp_gop_mode = "normalP";if (!strcmp(tmp_gop_mode, "normalP")) {venc_chn_attr.stGopAttr.enGopMode = VENC_GOPMODE_NORMALP;} else if (!strcmp(tmp_gop_mode, "smartP")) {venc_chn_attr.stGopAttr.enGopMode = VENC_GOPMODE_SMARTP;venc_chn_attr.stGopAttr.s32VirIdrLen = rk_param_get_int("video.0:smartp_viridrlen", 25);venc_chn_attr.stGopAttr.u32MaxLtrCount = 1; // long-term reference frame ltr is fixed to 1} else if (!strcmp(tmp_gop_mode, "TSVC4")) {venc_chn_attr.stGopAttr.enGopMode = VENC_GOPMODE_TSVC4;}// venc_chn_attr.stGopAttr.u32GopSize = rk_param_get_int("video.0:gop", -1);venc_chn_attr.stVencAttr.enPixelFormat = RK_FMT_YUV420SP;venc_chn_attr.stVencAttr.u32MaxPicWidth = rk_param_get_int("video.0:max_width", 2560);venc_chn_attr.stVencAttr.u32MaxPicHeight = rk_param_get_int("video.0:max_height", 1440);venc_chn_attr.stVencAttr.u32PicWidth = video_width;venc_chn_attr.stVencAttr.u32PicHeight = video_height;venc_chn_attr.stVencAttr.u32VirWidth = video_width;venc_chn_attr.stVencAttr.u32VirHeight = video_height;venc_chn_attr.stVencAttr.u32StreamBufCnt = rk_param_get_int("video.0:buffer_count", 4);venc_chn_attr.stVencAttr.u32BufSize = rk_param_get_int("video.0:buffer_size", 1843200);// venc_chn_attr.stVencAttr.u32Depth = 1;//创建ENC通道ret = RK_MPI_VENC_CreateChn(VIDEO_PIPE_0, &venc_chn_attr);if (ret) {LOG_ERROR("ERROR: create VENC error! ret=%#x\n", ret);return -1;}//智能编码,看文档,这里是closetmp_smart = rk_param_get_string("video.0:smart", "close");if (!strcmp(tmp_smart, "open"))RK_MPI_VENC_EnableSvc(VIDEO_PIPE_0, 1);//使能运动去模糊。这里为1 开启智能编码自动开启if (rk_param_get_int("video.0:enable_motion_deblur", 0)) {ret = RK_MPI_VENC_EnableMotionDeblur(VIDEO_PIPE_0, true);if (ret)LOG_ERROR("RK_MPI_VENC_EnableMotionDeblur error! ret=%#x\n", ret);}//静态开关,这里为1if (rk_param_get_int("video.0:enable_motion_static_switch", 0)) {ret = RK_MPI_VENC_EnableMotionStaticSwitch(VIDEO_PIPE_0, true);if (ret)LOG_ERROR("RK_MPI_VENC_EnableMotionStaticSwitch error! ret=%#x\n", ret);}//去除呼吸效应是否使能VENC_DEBREATHEFFECT_S debfrath_effect;memset(&debfrath_effect, 0, sizeof(VENC_DEBREATHEFFECT_S));//这里为关if (rk_param_get_int("video.0:enable_debreath_effect", 0)) {debfrath_effect.bEnable = true;debfrath_effect.s32Strength1 = rk_param_get_int("video.0:debreath_effect_strength", 16);//设置呼吸效应ret = RK_MPI_VENC_SetDeBreathEffect(VIDEO_PIPE_0, &debfrath_effect);if (ret)LOG_ERROR("RK_MPI_VENC_SetDeBreathEffect error! ret=%#x\n", ret);}// VENC_RC_PARAM_S h265_RcParam;// RK_MPI_VENC_GetRcParam(VIDEO_PIPE_0, &h265_RcParam);// h265_RcParam.s32FirstFrameStartQp = 26;// h265_RcParam.stParamH265.u32StepQp = 8;// h265_RcParam.stParamH265.u32MaxQp = 51;// h265_RcParam.stParamH265.u32MinQp = 10;// h265_RcParam.stParamH265.u32MaxIQp = 46;// h265_RcParam.stParamH265.u32MinIQp = 24;// h265_RcParam.stParamH265.s32DeltIpQp = -4;// RK_MPI_VENC_SetRcParam(VIDEO_PIPE_0, &h265_RcParam);tmp_rc_quality = rk_param_get_string("video.0:rc_quality", NULL);VENC_RC_PARAM_S venc_rc_param;RK_MPI_VENC_GetRcParam(VIDEO_PIPE_0, &venc_rc_param);if (!strcmp(tmp_output_data_type, "H.264")) {if (!strcmp(tmp_rc_quality, "highest")) {venc_rc_param.stParamH264.u32MinQp = 10;} else if (!strcmp(tmp_rc_quality, "higher")) {venc_rc_param.stParamH264.u32MinQp = 15;} else if (!strcmp(tmp_rc_quality, "high")) {venc_rc_param.stParamH264.u32MinQp = 20;} else if (!strcmp(tmp_rc_quality, "medium")) {venc_rc_param.stParamH264.u32MinQp = 25;} else if (!strcmp(tmp_rc_quality, "low")) {venc_rc_param.stParamH264.u32MinQp = 30;} else if (!strcmp(tmp_rc_quality, "lower")) {venc_rc_param.stParamH264.u32MinQp = 35;} else {venc_rc_param.stParamH264.u32MinQp = 40;}venc_rc_param.stParamH264.u32FrmMinIQp = frame_min_i_qp;venc_rc_param.stParamH264.u32FrmMinQp = frame_min_qp;venc_rc_param.stParamH264.u32FrmMaxIQp = frame_max_i_qp;venc_rc_param.stParamH264.u32FrmMaxQp = frame_max_qp;} else if (!strcmp(tmp_output_data_type, "H.265")) {if (!strcmp(tmp_rc_quality, "highest")) {venc_rc_param.stParamH265.u32MinQp = 10;} else if (!strcmp(tmp_rc_quality, "higher")) {venc_rc_param.stParamH265.u32MinQp = 15;} else if (!strcmp(tmp_rc_quality, "high")) {venc_rc_param.stParamH265.u32MinQp = 20;} else if (!strcmp(tmp_rc_quality, "medium")) {venc_rc_param.stParamH265.u32MinQp = 25;} else if (!strcmp(tmp_rc_quality, "low")) {venc_rc_param.stParamH265.u32MinQp = 30;} else if (!strcmp(tmp_rc_quality, "lower")) {venc_rc_param.stParamH265.u32MinQp = 35;} else {venc_rc_param.stParamH265.u32MinQp = 40;}venc_rc_param.stParamH265.u32FrmMinIQp = frame_min_i_qp;venc_rc_param.stParamH265.u32FrmMinQp = frame_min_qp;venc_rc_param.stParamH265.u32FrmMaxIQp = frame_max_i_qp;venc_rc_param.stParamH265.u32FrmMaxQp = frame_max_qp;} else {LOG_ERROR("tmp_output_data_type is %s, not support\n", tmp_output_data_type);return -1;}//设置编码通道码率控制器的高级参数。 qpRK_MPI_VENC_SetRcParam(VIDEO_PIPE_0, &venc_rc_param);//设置H.264协议编码通道的变换、量化属性。if (!strcmp(tmp_output_data_type, "H.264")) {VENC_H264_TRANS_S pstH264Trans;RK_MPI_VENC_GetH264Trans(VIDEO_PIPE_0, &pstH264Trans);pstH264Trans.bScalingListValid = scalinglist;RK_MPI_VENC_SetH264Trans(VIDEO_PIPE_0, &pstH264Trans);} else if (!strcmp(tmp_output_data_type, "H.265")) {VENC_H265_TRANS_S pstH265Trans;RK_MPI_VENC_GetH265Trans(VIDEO_PIPE_0, &pstH265Trans);pstH265Trans.bScalingListEnabled = scalinglist;RK_MPI_VENC_SetH265Trans(VIDEO_PIPE_0, &pstH265Trans);}//设置编码通道参考帧共享属性。节省内存VENC_CHN_REF_BUF_SHARE_S stVencChnRefBufShare;memset(&stVencChnRefBufShare, 0, sizeof(VENC_CHN_REF_BUF_SHARE_S));stVencChnRefBufShare.bEnable = rk_param_get_int("video.0:enable_refer_buffer_share", 0);RK_MPI_VENC_SetChnRefBufShareAttr(VIDEO_PIPE_0, &stVencChnRefBufShare);//旋转if (rotation == 0) {RK_MPI_VENC_SetChnRotation(VIDEO_PIPE_0, ROTATION_0);} else if (rotation == 90) {RK_MPI_VENC_SetChnRotation(VIDEO_PIPE_0, ROTATION_90);} else if (rotation == 180) {RK_MPI_VENC_SetChnRotation(VIDEO_PIPE_0, ROTATION_180);} else if (rotation == 270) {RK_MPI_VENC_SetChnRotation(VIDEO_PIPE_0, ROTATION_270);}//开始编码通道接收输入图像。VENC_RECV_PIC_PARAM_S stRecvParam;memset(&stRecvParam, 0, sizeof(VENC_RECV_PIC_PARAM_S));//接收帧数,-1表示自动接收不停止stRecvParam.s32RecvPicNum = -1;RK_MPI_VENC_StartRecvFrame(VIDEO_PIPE_0, &stRecvParam);//创建线程获取venc输出数据pthread_create(&venc_thread_0, NULL, rkipc_get_venc_0, NULL);// bindvi_chn.enModId = RK_ID_VI;vi_chn.s32DevId = 0;vi_chn.s32ChnId = VIDEO_PIPE_0;venc_chn.enModId = RK_ID_VENC;venc_chn.s32DevId = 0;venc_chn.s32ChnId = VIDEO_PIPE_0;//vi绑定vencret = RK_MPI_SYS_Bind(&vi_chn, &venc_chn);if (ret)LOG_ERROR("Bind VI and VENC error! ret=%#x\n", ret);elseLOG_DEBUG("Bind VI and VENC success\n");return 0;
}

获取venc0的数据

static void *rkipc_get_venc_0(void *arg) {LOG_DEBUG("#Start %s thread, arg:%p\n", __func__, arg);prctl(PR_SET_NAME, "RkipcVenc0", 0, 0, 0);
/*
typedef struct rkVENC_STREAM_S {
VENC_PACK_S ATTRIBUTE* pstPack; //帧码流包结构。
RK_U32 ATTRIBUTE u32PackCount; //一帧码流的所有包的个数。
RK_U32 u32Seq; //码流序列号。按帧获取帧序号;按包获取包序号。
//码流特征信息。
union {
VENC_STREAM_INFO_H264_S stH264Info;
VENC_STREAM_INFO_JPEG_S stJpegInfo;
VENC_STREAM_INFO_H265_S stH265Info;
VENC_STREAM_INFO_PRORES_S stProresInfo;
};
//码流高级特征信息。
union {
VENC_STREAM_ADVANCE_INFO_H264_S stAdvanceH264Info;
VENC_STREAM_ADVANCE_INFO_JPEG_S stAdvanceJpegInfo;
VENC_STREAM_ADVANCE_INFO_H265_S stAdvanceH265Info;
VENC_STREAM_ADVANCE_INFO_PRORES_S stAdvanceProresInfo;
};
} VENC_STREAM_S;typedef struct rkVENC_PACK_S {
MB_BLK pMbBlk; //码流包缓存块句柄。
RK_U32 u32Len; //码流包长度。
RK_U64 u64PTS; //时间戳。单位:us。
RK_BOOL bFrameEnd; //帧结束标识。取值范围:RK_TRUE:该码流包是该帧的最后一个包RK_FALSE:该码流包不是该帧的最后一个包。
RK_BOOL bStreamEnd; //流结束标识。取值范围:RK_TRUE:该码流包是数据流的最后一个包,编码器将输出编码图像最后一帧码流。RK_FALSE:该码流包不是数据流的最后一个包。
VENC_DATA_TYPE_U DataType; //码流类型,支持 H.264/JPEG/ H.265 协议类型的数据包。
RK_U32 u32Offset; //没用
RK_U32 u32DataNum; //没用
VENC_PACK_INFO_S stPackInfo[8]; //没用
} VENC_PACK_S;DataType
typedef enum rkH264E_NALU_TYPE_E {
H264E_NALU_BSLICE = 0,
H264E_NALU_PSLICE = 1,
H264E_NALU_ISLICE = 2,
H264E_NALU_IDRSLICE = 5,
H264E_NALU_SEI = 6,
H264E_NALU_SPS = 7,
H264E_NALU_PPS = 8,
H264E_NALU_BUTT
} H264E_NALU_TYPE_E;*/VENC_STREAM_S stFrame;VI_CHN_STATUS_S stChnStatus;int loopCount = 0;int ret = 0;// FILE *fp = fopen("/data/venc.h265", "wb");stFrame.pstPack = malloc(sizeof(VENC_PACK_S));while (g_video_run_) {// 5.get the frame//获取数据ret = RK_MPI_VENC_GetStream(VIDEO_PIPE_0, &stFrame, 1000);if (ret == RK_SUCCESS) {//获取内存地址void *data = RK_MPI_MB_Handle2VirAddr(stFrame.pstPack->pMbBlk);// fwrite(data, 1, stFrame.pstPack->u32Len, fp);// fflush(fp);// LOG_DEBUG("Count:%d, Len:%d, PTS is %" PRId64", enH264EType is %d\n", loopCount,// stFrame.pstPack->u32Len, stFrame.pstPack->u64PTS,// stFrame.pstPack->DataType.enH264EType);//发送数据if (g_rtsplive && g_rtsp_session_0) {pthread_mutex_lock(&g_rtsp_mutex);rtsp_tx_video(g_rtsp_session_0, data, stFrame.pstPack->u32Len,stFrame.pstPack->u64PTS);rtsp_do_event(g_rtsplive);pthread_mutex_unlock(&g_rtsp_mutex);}if ((stFrame.pstPack->DataType.enH264EType == H264E_NALU_IDRSLICE) ||(stFrame.pstPack->DataType.enH264EType == H264E_NALU_ISLICE) ||(stFrame.pstPack->DataType.enH265EType == H265E_NALU_IDRSLICE) ||(stFrame.pstPack->DataType.enH265EType == H265E_NALU_ISLICE)) {rk_storage_write_video_frame(0, data, stFrame.pstPack->u32Len,stFrame.pstPack->u64PTS, 1);if (enable_rtmp)rk_rtmp_write_video_frame(0, data, stFrame.pstPack->u32Len,stFrame.pstPack->u64PTS, 1);} else {rk_storage_write_video_frame(0, data, stFrame.pstPack->u32Len,stFrame.pstPack->u64PTS, 0);if (enable_rtmp)rk_rtmp_write_video_frame(0, data, stFrame.pstPack->u32Len,stFrame.pstPack->u64PTS, 0);}// 7.release the frameret = RK_MPI_VENC_ReleaseStream(VIDEO_PIPE_0, &stFrame);if (ret != RK_SUCCESS) {LOG_ERROR("RK_MPI_VENC_ReleaseStream fail %x\n", ret);}loopCount++;} else {LOG_ERROR("RK_MPI_VENC_GetStream timeout %x\n", ret);}}if (stFrame.pstPack)free(stFrame.pstPack);// if (fp)// fclose(fp);return 0;
}

http://www.ppmy.cn/server/179542.html

相关文章

工作中遇到的spark SQL小问题:包含某个或某些字符的条件

今天又来总结工作中遇到的问题了,今天是SQL,spark引擎 需求描述,筛选渠道包含”线上化“的数据 也就是讨论where里面的这个筛选条件怎么写 一般起手都是 where QD like %线上化%‘ 学习了其他的写法: 1.INSTR函数 where INSTR(QD,&quo…

《大语言模型》学习笔记(四)--Transformer 模型

1.Transformer架构 当前主流的大语言模型都基于Transformer模型进行设计的。Transformer是由多层的多头自注意力(Multi-headSelf-attention)模块堆叠而成的神经网络模型。2017 年,Google 在论文 Attentions is All you need(论文…

5.go切片和map

切片的概念 数组和切片相比较切片的长度是不固定的,可以追加元素,在追加时可能会使切片的容量增大,所以可以将切片理解成 "动态数组",但是,它不是数组,而是构建在数组基础上的更高级的数据结构。…

C++20 中的std::c8rtomb和 std::mbrtoc8

文章目录 1. 引言2. std::c8rtomb 函数详解3. std::mbrtoc8 函数详解4. 使用示例5. 注意事项6. 总结 1. 引言 C20 标准引入了对 UTF-8 编码的更好支持,其中包括两个重要的函数:std::c8rtomb 和 std::mbrtoc8。这两个函数分别用于将 UTF-8 编码的字符转换…

深入理解垃圾收集算法:从分代理论到经典回收策略

垃圾收集(Garbage Collection, GC)是现代虚拟机自动内存管理的核心机制。它不仅能自动回收不再使用的对象,还能极大减轻开发者在内存管理上的负担。本文将详细讲解垃圾收集算法的基本思想、分代收集理论以及几种经典的垃圾收集算法。 注&…

Ceph集群2025(Squid版)导出高可用NFS集群(上集)

#创建一个CephFS 文件系统 ceph fs volume create cephfs02#创建子卷 ceph fs subvolumegroup create cephfs02 myfsg2#查看子卷 ceph fs subvolumegroup ls cephfs02[{"name": "myfsg2"} ]创建 NFS Ganesha 集群 #例子 $ ceph nfs cluster create <c…

【BFS染色问题】P1162填涂颜色例题+核心逻辑

文章目录 【算法思路】【代码示例】 BFS处理染色问题的核心逻辑 【算法思路】 要判断一个数字 0 是否在闭合圈内&#xff0c;可以换个角度思考。不在闭合圈内的 0 是可以从方阵的边界出发&#xff0c;通过上下左右移动&#xff0c;只经过其他 0 到达的。 思路①.我们可以从方…

用Deepseek写扫雷uniapp小游戏

扫雷作为Windows系统自带的经典小游戏&#xff0c;承载了许多人的童年回忆。本文将详细介绍如何使用Uniapp框架从零开始实现一个完整的扫雷游戏&#xff0c;包含核心算法、交互设计和状态管理。无论你是Uniapp初学者还是有一定经验的开发者&#xff0c;都能从本文中获得启发。 …