rkipc的h265設置

資料的位置

源代碼在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.pswp.cn/news/899106.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899106.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899106.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

成都國際數字影像產業園:打造數字影像產業新高地

成都國際數字影像產業園:打造數字影像產業新高地 成都國際數字影像產業園正致力于構筑數字影像產業的新高地,成為推動區域數字經濟發展的重要引擎。 核心定位與目標 該園區精準定位于數字影像文創產業,旨在打造集內容創作、技術研發、人才…

各類神經網絡學習:(三)RNN 循環神經網絡(中集),同步多對多結構的詳細解釋

上一篇下一篇RNN(上集)RNN(下集) 同步多對多結構 1)結構詳解 ①圖解: ②參數含義: x t x_t xt? :表示每一個時刻的輸入; o t o_t ot? :表示每一個時刻的輸…

Perl 環境安裝指南

Perl 環境安裝指南 引言 Perl是一種廣泛使用的解釋型、動態編程語言,以其強大的文本處理能力和靈活性著稱。本文將為您詳細介紹Perl環境的安裝過程,包括系統要求、安裝步驟以及注意事項。 系統要求 在安裝Perl之前,請確保您的計算機滿足以下基本要求: 操作系統:Window…

【嵌入式學習2】C語言 - VScode環境搭建

目錄 ## 語言分類 ## c語言編譯器 ## VScode相關配置 ## 語言分類 編譯型語言:C,C解釋型語言:python,JS ## c語言編譯器 分類GCC 系列MinGWCygwinMSVC系列一套編程語言編譯器將GCC編譯器和GNU Binutils移植到Win32平臺下的產物…

qt+opengl 加載三維obj文件

1前面我們已經熟悉了opengl自定義頂點生成一個立方體,并且我們實現了立方體的旋轉,光照等功能。下面我們來用opengl來加載一個obj文件。準備我們首先準備一個簡單的obj文件(head.obj)。資源在本頁下載 2 在obj文件里面&#xff0c…

0326-Java 字符串方法

package com.qc.字符串;import java.util.Arrays;public class Test {public static void main(String[] args) { // String x"hello";//字符串 char[] // x x"demo";//字符串拼接 // xx2450; // xxtrue; // System.out.println(x);//hellodemo2450t…

<command-line>:0:1: error: macro names must be identifiers m

報錯::0:1: error: macro names must be identifiers 排查類很久 原來是: add_compile_definitions(_GLIBCXX_USE_CXX11_ABI$ABI_VERSION)寫成了 add_compile_definitions(-D_GLIBCXX_USE_CXX11_ABI$ABI_VERSION)多了個 -D。

風光互補智慧路燈的燈桿設計有哪些要求?

嘿,朋友們!叁仟風光互補智慧路燈的燈桿設計那可是超級重要的事兒,得全方位綜合考量各種因素,就是為了確保咱們的路燈能兼具超棒的功能性、絕對的安全性、無敵的美觀性以及超厲害的耐用性!下面就來看看這些超贊的常見要…

06、RAG

LLM的知識僅限于它所接受到的訓練數據。如果我們希望讓它了解特定領域的專有知識,則可以使用下面的方式操作: 使用RAG使用專有數據對LLM進行微調RAG與數據微調方式結合使用 什么是RAG 簡單地說,RAG就是把數據發送給LLM之前從數據中查找相關…

自然語言處理:第一百零二章 如何去掉DeepSeek R1思考過程

本人項目地址大全:Victor94-king/NLP__ManVictor: CSDN of ManVictor 寫在前面: 筆者更新不易,希望走過路過點個關注和贊,筆芯!!! 寫在前面: 筆者更新不易,希望走過路過點個關注和贊,筆芯!!! 寫在前面: 筆者更新不易…

flink 安裝與訪問 ui

官方文檔:First steps | Apache Flink 版本:v2.0.0 下載Flink Flink運行在所有類UNIX環境中,即Linux,Mac OS X和Cygwin(適用于Windows)。您需要安裝Java 11。要檢查安裝的Java版本,請在終端中…

WPF TextBox實現鍵盤enter后實時讀取TextBox中的值

代碼 <TextBox Grid.Column"0" x:Name"textBox" Margin"10,5,0,5" TextWrapping"Wrap" Text"{Binding SendMessage,UpdateSourceTriggerPropertyChanged}" VerticalContentAlignment"Center" CaretBrush&qu…

PyTorch實現Transformer模型

首先&#xff0c;我得回顧一下Transformer的基本結構&#xff0c;確保自己沒有記錯。Transformer由編碼器和解碼器組成&#xff0c;每個編碼器層包含多頭自注意力機制和前饋網絡&#xff0c;解碼器層則還有編碼器-解碼器注意力。 接下來&#xff0c;用戶需要的是手把手的代碼解…

詳細介紹sentinel的使用,并列舉經常出的面試題以及答案

Sentinel 是一款由阿里巴巴開源的分布式系統的流量防衛系統&#xff0c;能夠實時響應并滿足高并發的流量控制需求。它提供了流量監控、流量控制、熔斷降級、系統保護等核心功能&#xff0c;可幫助開發人員實時發現系統的流量異常并快速做出相應的限流策略。 Sentinel 的使用步…

mysql-connector-java-5.1.37.jarJava連接器

mysql-connector-java-5.1.37.jar是MySQL官方提供的Java連接器&#xff0c;用于在Java應用程序中與MySQL數據庫進行通信。具體來說&#xff0c;這個JAR文件是MySQLJDBC驅動程序的一個版本&#xff0c;允許Java程序通過JDBC&#xff08;JavaDatabaseConnectivity&#xff09;接口…

Python基于Django的智能旅游推薦系統(附源碼,文檔說明)

博主介紹&#xff1a;?IT徐師兄、7年大廠程序員經歷。全網粉絲15W、csdn博客專家、掘金/華為云//InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&#x1f3…

【博客節選】再談Unity 的 root motion

節選自 【Unity實戰筆記】第二十三 root motion變更方向攻擊 &#xff08;OnStateMove rootmotion rigidbody 使用的一些問題&#xff09; 小伙伴們應該對root motion非常困惑&#xff0c;包括那個bake into pose。 當xz bake into pose后&#xff0c;角色攻擊動畫與父節點產…

網站服務器常見的CC攻擊防御秘籍!

CC攻擊對網站的運營是非常不利的&#xff0c;因此我們必須積極防范這種攻擊&#xff0c;但有些站長在防范這種攻擊時可能會陷入誤區。讓我們先了解下CC攻擊&#xff01; CC攻擊是什么 CC是DDoS攻擊的一種&#xff0c;CC攻擊是借助代理服務器生成指向受害主機的合法請求&#x…

JAVA:Spring Boot @Conditional 注解詳解及實踐

1、簡述 在 Spring Boot 中&#xff0c;Conditional 注解用于實現 條件化 Bean 裝配&#xff0c;即根據特定的條件來決定是否加載某個 Bean。它是 Spring 框架中的一個擴展機制&#xff0c;常用于實現模塊化、可配置的組件加載。 本文將詳細介紹 Conditional 相關的注解&…

使用python爬取網絡資源

整體思路 網絡資源爬取通常分為以下幾個步驟&#xff1a; 發送 HTTP 請求&#xff1a;使用requests庫向目標網站發送請求&#xff0c;獲取網頁的 HTML 內容。解析 HTML 內容&#xff1a;使用BeautifulSoup庫解析 HTML 內容&#xff0c;從中提取所需的數據。處理數據&#xff…