bit rate / frame rate /sample rate等等

本文深入解析视频编码的核心概念,包括码率、封装格式及优化策略,详细解释了码率类型(固定码率、可变码率)、封装格式(MP4、AVI等)及其在不同场景下的应用与优缺点,同时探讨了帧率、采样率、单次/双次编码等关键参数如何影响视频质量和存储效率。


原文地址

码率:Bit Rate,指视频或音频文件在单位时间内使用的数据流量,该参数的单位通常是Kbps,也就是千比特每秒。通常2000kbps~3000kbps就已经足以将画质效果表现到极致了。码率参数与视频文件最终体积大小有直接性的关系。 (编码码率---软件)

  混合码率:Overall Bit Rate,指视频文件中视频和音频混合后的整体平均码率。一般描述一个视频文件的码率都是指OBR,如新浪播客允许的OBR上限为523Kbps。 

  固定码率:Constant Bit Rate,指的是编码器的输出码率(或者解码器的输入码率)应该是固定制(常数)。CBR不适合高清晰度视频的编码,因为CBR将导致没有足够的码率应对复杂多变内容部分进行编码(从而导致画质下降),同时在简单的内容部分会浪费一些码率。 

  可变码率:Variable Bit Rate,编码器的输出码率(或者解码器的输入码率)可以根据编码器的输入源信号的负责度自适应的调整,目的是达到保持输出质量保持不变而不是保持输出码率保持不变。VBR编码会消耗较多的计算时间,但可以更好的利用有限的存储空间:用比较多的码率对复杂度高的段进行编码,用比较少的码率对复杂度低的段进行编码。总之需要清晰度高且体积小的视频,选择VBR是明智的选择。 

  平均码率:Average Bit Rate,指音频或视频的平均码率,可以简单的认为等于文件大小除以播放时间。在音频编码方面与CBR基本相同,会按照设定的目标码率进行编码。但当编码器认为“适当”的时候,会使用高于目标码率的数值来进行编码以保证更好的质量。 

  帧率:Frame Rate,是用于测量画面显示帧数的量度。所谓的测量单位为每秒显示帧数(Frames per Second,缩写:FPS)。如电影的帧率一般是25fps和29.97fps,而第一人称射击游戏等要求画面极为顺畅的特殊场合,则需要30fps以上的效果,高于60fps就没有必要了。 

  采样率:每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。一般音乐CD的采样率是44100Hz,所以视频编码中的音频采样率保持在这个级别就完全足够了,通常视频转换器也将这个采样率作为默认设置。(芯片采样次数---硬件,得到的是原始波形文件pcm) 

  Single Pass:在编码的时候只进行一次运算,直接生成经过编码的视频文件。 

  Two Pass:需要运算两次,可以理解为先进行一次全局的计算,收集画面信息,并将这些信息记录到信息文件。第二次才根据采集的信息,正式进行压缩,生成压缩文件。 

  Single pass模式编码较简单,编码速度较快,但是最终质量不如Two pass模式好,对于视频源本身画质就不佳的编码过程可以采用。Two pass通过第一次运算的信息采集,可以让需要高码率的运动画面可以分配更的码率来保证画面质量。而对于不包含太多运动信息的静态画面,则可以消减分配的码率。Twopass模式可以在影片容量与画面质量之间找到最佳平衡点。所以要求画面清晰的视频,肯定要选择Two Pass,只是编码速度惨不忍睹。

  封装格式:多媒体封装格式也称多媒体容器 (Multimedia Container),它不同于H.264、 AAC这类编码格式,它只是为多媒体编码提供了一个“外壳”,也就是所谓的视频格式。如MP4、AVI、MKV、FLV、WMA等。 

  画面比例:Aspect Ratio,指视频画面宽和高的比例。常见的比例有16:9和4:3。电视媒体有严格的视频制式要求,视频比例和帧数都是固定的,而网络传播的视频比例则较为自由。一般DVD和BD电影的视频比例大多是宽屏或者超宽屏。在视频编码过程中一定要注意画面比例是否正确,不然就会出现画面拉伸变形。 

  分辨率:指视频宽高的像素数值,单位为Px。通常视频分辨率的数值宽高比要等于画面比例,不然视频文件就会产生黑边。标准1080P的分辨率为1920×1080,帧率为60fps,也就是真高清。而最常见的网络传播的1080P高清片帧率通常为23.976 fps。

HI_S32 SAMPLE_COMM_VENC_Creat(VENC_CHN VencChn, PAYLOAD_TYPE_E enType, PIC_SIZE_E enSize, SAMPLE_RC_E enRcMode, HI_U32 u32Profile, HI_BOOL bRcnRefShareBuf,VENC_GOP_ATTR_S *pstGopAttr) { HI_S32 s32Ret; SIZE_S stPicSize; VENC_CHN_ATTR_S stVencChnAttr; VENC_ATTR_JPEG_S stJpegAttr; SAMPLE_VI_CONFIG_S stViConfig; HI_U32 u32FrameRate; HI_U32 u32StatTime; #if defined(LSGK_VERSION) HI_U32 u32Gop = 2;//25;//30; #else HI_U32 u32Gop = 25;//30; #endif s32Ret = SAMPLE_COMM_SYS_GetPicSize( enSize, &stPicSize); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Get picture size failed!\n"); return HI_FAILURE; } SAMPLE_COMM_VI_GetSensorInfo(&stViConfig); if(SAMPLE_SNS_TYPE_BUTT == stViConfig.astViInfo[0].stSnsInfo.enSnsType) { SAMPLE_PRT("Not set SENSOR%d_TYPE !\n",0); return HI_FALSE; } s32Ret = SAMPLE_COMM_VI_GetFrameRateBySensor(stViConfig.astViInfo[0].stSnsInfo.enSnsType, &u32FrameRate); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("SAMPLE_COMM_VI_GetFrameRateBySensor failed!\n"); return s32Ret; } /****************************************** step 1: Create Venc Channel ******************************************/ stVencChnAttr.stVencAttr.enType = enType; stVencChnAttr.stVencAttr.u32MaxPicWidth = stPicSize.u32Width; stVencChnAttr.stVencAttr.u32MaxPicHeight = stPicSize.u32Height; stVencChnAttr.stVencAttr.u32PicWidth = stPicSize.u32Width;/*the picture width*/ stVencChnAttr.stVencAttr.u32PicHeight = stPicSize.u32Height;/*the picture height*/ u32FrameRate = getDevFramerate(0, 1); printf("enRcMode=%d\n",enRcMode); if (enType == PT_MJPEG || enType == PT_JPEG) { stVencChnAttr.stVencAttr.u32BufSize = ALIGN_UP(stPicSize.u32Width, 16) * ALIGN_UP(stPicSize.u32Height, 16); } else { stVencChnAttr.stVencAttr.u32BufSize = ALIGN_UP(stPicSize.u32Width * stPicSize.u32Height * 3 / 4, 64);/*stream buffer size*/ } stVencChnAttr.stVencAttr.u32Profile = u32Profile; stVencChnAttr.stVencAttr.bByFrame = HI_TRUE;/*get stream mode is slice mode or frame mode?*/ if(VENC_GOPMODE_SMARTP == pstGopAttr->enGopMode) { u32StatTime = pstGopAttr->stSmartP.u32BgInterval/u32Gop; } else { u32StatTime = 1; } switch (enType) { case PT_H265: { if (SAMPLE_RC_CBR == enRcMode) { VENC_H265_CBR_S stH265Cbr; stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265CBR; stH265Cbr.u32Gop = u32Gop; stH265Cbr.u32StatTime = u32StatTime; /* stream rate statics time(s) */ stH265Cbr.u32SrcFrameRate = u32FrameRate; /* input (vi) frame rate */ stH265Cbr.fr32DstFrameRate = u32FrameRate; /* target frame rate */ switch (enSize) { case PIC_VGA: stH265Cbr.u32BitRate = 1024 + 512*u32FrameRate/30; break; case PIC_720P: stH265Cbr.u32BitRate = 1024 * 2 + 1024*u32FrameRate/30; break; case PIC_1080P: stH265Cbr.u32BitRate = 1024 * 2 + 2048*u32FrameRate/30; break; case PIC_2592x1944: stH265Cbr.u32BitRate = 1024 * 3 + 3072*u32FrameRate/30; break; case PIC_3840x2160: stH265Cbr.u32BitRate = 1024 * 5 + 5120*u32FrameRate/30; break; default : //other small resolution stH265Cbr.u32BitRate = 256; break; } memcpy(&stVencChnAttr.stRcAttr.stH265Cbr, &stH265Cbr, sizeof(VENC_H265_CBR_S)); } else if (SAMPLE_RC_FIXQP == enRcMode) { VENC_H265_FIXQP_S stH265FixQp; stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265FIXQP; stH265FixQp.u32Gop = 30; stH265FixQp.u32SrcFrameRate = u32FrameRate; stH265FixQp.fr32DstFrameRate = u32FrameRate; stH265FixQp.u32IQp = 25; stH265FixQp.u32PQp = 30; stH265FixQp.u32BQp = 32; memcpy(&stVencChnAttr.stRcAttr.stH265FixQp, &stH265FixQp, sizeof(VENC_H265_FIXQP_S)); } else if (SAMPLE_RC_VBR == enRcMode) { VENC_H265_VBR_S stH265Vbr; stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265VBR; stH265Vbr.u32Gop = u32Gop; stH265Vbr.u32StatTime = u32StatTime; stH265Vbr.u32SrcFrameRate = u32FrameRate; stH265Vbr.fr32DstFrameRate = u32FrameRate; switch (enSize) { case PIC_VGA: stH265Vbr.u32MaxBitRate = 1024 + 512*u32FrameRate/30; break; case PIC_720P: stH265Vbr.u32MaxBitRate = 1024 * 2 + 1024*u32FrameRate/30; break; case PIC_1080P: stH265Vbr.u32MaxBitRate = 1024 * 2 + 2048*u32FrameRate/30; break; case PIC_2592x1944: stH265Vbr.u32MaxBitRate = 1024 * 3 + 3072*u32FrameRate/30; break; default : stH265Vbr.u32MaxBitRate = 1024 * 15 + 2048*u32FrameRate/30; break; } memcpy(&stVencChnAttr.stRcAttr.stH265Vbr, &stH265Vbr, sizeof(VENC_H265_VBR_S)); } else if(SAMPLE_RC_AVBR == enRcMode) { VENC_H265_AVBR_S stH265AVbr; stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265AVBR; stH265AVbr.u32Gop = u32Gop; stH265AVbr.u32StatTime = u32StatTime; stH265AVbr.u32SrcFrameRate = u32FrameRate; stH265AVbr.fr32DstFrameRate = u32FrameRate; switch (enSize) { case PIC_VGA: stH265AVbr.u32MaxBitRate = 1024 + 512*u32FrameRate/30; break; case PIC_720P: stH265AVbr.u32MaxBitRate = 1024 * 2 + 1024*u32FrameRate/30; break; case PIC_1080P: stH265AVbr.u32MaxBitRate = 1024 * 2 + 2048*u32FrameRate/30; break; case PIC_2592x1944: stH265AVbr.u32MaxBitRate = 1024 * 3 + 3072*u32FrameRate/30; break; case PIC_3840x2160: stH265AVbr.u32MaxBitRate = 1024 * 5 + 5120*u32FrameRate/30; break; default : stH265AVbr.u32MaxBitRate = 1024 * 15 + 2048*u32FrameRate/30; break; } memcpy(&stVencChnAttr.stRcAttr.stH265AVbr, &stH265AVbr, sizeof(VENC_H265_AVBR_S)); } else if(SAMPLE_RC_QVBR == enRcMode) { VENC_H265_QVBR_S stH265QVbr; stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265QVBR; stH265QVbr.u32Gop = u32Gop; stH265QVbr.u32StatTime = u32StatTime; stH265QVbr.u32SrcFrameRate = u32FrameRate; stH265QVbr.fr32DstFrameRate = u32FrameRate; switch (enSize) { case PIC_VGA: stH265QVbr.u32TargetBitRate = 1024 + 512*u32FrameRate/30; break; case PIC_720P: stH265QVbr.u32TargetBitRate= 1024 * 2 + 1024*u32FrameRate/30; break; case PIC_1080P: stH265QVbr.u32TargetBitRate = 1024 * 2 + 2048*u32FrameRate/30; break; case PIC_2592x1944: stH265QVbr.u32TargetBitRate = 1024 * 3 + 3072*u32FrameRate/30; break; case PIC_3840x2160: stH265QVbr.u32TargetBitRate = 1024 * 5 + 5120*u32FrameRate/30; break; case PIC_4000x3000: stH265QVbr.u32TargetBitRate = 1024 * 10 + 5120*u32FrameRate/30; break; case PIC_7680x4320: stH265QVbr.u32TargetBitRate = 1024 * 20 + 5120*u32FrameRate/30; break; default : stH265QVbr.u32TargetBitRate = 1024 * 15 + 2048*u32FrameRate/30; break; } memcpy(&stVencChnAttr.stRcAttr.stH265QVbr, &stH265QVbr, sizeof(VENC_H265_QVBR_S)); } else if(SAMPLE_RC_CVBR == enRcMode) { VENC_H265_CVBR_S stH265CVbr; stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265CVBR; stH265CVbr.u32Gop = u32Gop; stH265CVbr.u32StatTime = u32StatTime; stH265CVbr.u32SrcFrameRate = u32FrameRate; stH265CVbr.fr32DstFrameRate = u32FrameRate; stH265CVbr.u32LongTermStatTime = 1; stH265CVbr.u32ShortTermStatTime = u32StatTime; switch (enSize) { case PIC_VGA: stH265CVbr.u32MaxBitRate = 1024 + 512*u32FrameRate/30; stH265CVbr.u32LongTermMaxBitrate = 1024 + 512*u32FrameRate/30; stH265CVbr.u32LongTermMinBitrate = 256; break; case PIC_720P: stH265CVbr.u32MaxBitRate = 1024 * 3 + 1024*u32FrameRate/30; stH265CVbr.u32LongTermMaxBitrate = 1024 * 2 + 1024*u32FrameRate/30; stH265CVbr.u32LongTermMinBitrate = 512; break; case PIC_1080P: stH265CVbr.u32MaxBitRate = 1024 * 2 + 2048*u32FrameRate/30; stH265CVbr.u32LongTermMaxBitrate = 1024 * 2 + 2048*u32FrameRate/30; stH265CVbr.u32LongTermMinBitrate = 1024; break; case PIC_2592x1944: stH265CVbr.u32MaxBitRate = 1024 * 4 + 3072*u32FrameRate/30; stH265CVbr.u32LongTermMaxBitrate = 1024 * 3 + 3072*u32FrameRate/30; stH265CVbr.u32LongTermMinBitrate = 1024*2; break; case PIC_3840x2160: stH265CVbr.u32MaxBitRate = 1024 * 8 + 5120*u32FrameRate/30; stH265CVbr.u32LongTermMaxBitrate = 1024 * 5 + 5120*u32FrameRate/30; stH265CVbr.u32LongTermMinBitrate = 1024*3; break; case PIC_4000x3000: stH265CVbr.u32MaxBitRate = 1024 * 12 + 5120*u32FrameRate/30; stH265CVbr.u32LongTermMaxBitrate = 1024 * 10 + 5120*u32FrameRate/30; stH265CVbr.u32LongTermMinBitrate = 1024*4; break; case PIC_7680x4320: stH265CVbr.u32MaxBitRate = 1024 * 24 + 5120*u32FrameRate/30; stH265CVbr.u32LongTermMaxBitrate = 1024 * 20 + 5120*u32FrameRate/30; stH265CVbr.u32LongTermMinBitrate = 1024*6; break; default : stH265CVbr.u32MaxBitRate = 1024 * 24 + 5120*u32FrameRate/30; stH265CVbr.u32LongTermMaxBitrate = 1024 * 15 + 2048*u32FrameRate/30; stH265CVbr.u32LongTermMinBitrate = 1024*5; break; } memcpy(&stVencChnAttr.stRcAttr.stH265CVbr, &stH265CVbr, sizeof(VENC_H265_CVBR_S)); } else if(SAMPLE_RC_QPMAP == enRcMode) { VENC_H265_QPMAP_S stH265QpMap; stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265QPMAP; stH265QpMap.u32Gop = u32Gop; stH265QpMap.u32StatTime = u32StatTime; stH265QpMap.u32SrcFrameRate = u32FrameRate; stH265QpMap.fr32DstFrameRate = u32FrameRate; stH265QpMap.enQpMapMode = VENC_RC_QPMAP_MODE_MEANQP; memcpy(&stVencChnAttr.stRcAttr.stH265QpMap, &stH265QpMap, sizeof(VENC_H265_QPMAP_S)); } else { SAMPLE_PRT("%s,%d,enRcMode(%d) not support\n",__FUNCTION__,__LINE__,enRcMode); return HI_FAILURE; } stVencChnAttr.stVencAttr.stAttrH265e.bRcnRefShareBuf = bRcnRefShareBuf; } break; case PT_H264: { if (SAMPLE_RC_CBR == enRcMode) { VENC_H264_CBR_S stH264Cbr; printf("1111111111111111111111111111\n"); printf("2222222222 u32FrameRate = %u\n", u32FrameRate); stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR; stH264Cbr.u32Gop = u32Gop; /*the interval of IFrame*/ stH264Cbr.u32StatTime = u32StatTime; /* stream rate statics time(s) */ stH264Cbr.u32SrcFrameRate = u32FrameRate; /* input (vi) frame rate */ stH264Cbr.fr32DstFrameRate = u32FrameRate; /* target frame rate */ switch (enSize) { case PIC_VGA: stH264Cbr.u32BitRate = 1024 + 512*u32FrameRate/30; break; case PIC_720P: stH264Cbr.u32BitRate = 1024 * 2 + 1024*u32FrameRate/30; break; case PIC_1080P: stH264Cbr.u32BitRate = 1024 * 2 + 2048*u32FrameRate/30; break; case PIC_2592x1944: stH264Cbr.u32BitRate = 1024 * 3 + 3072*u32FrameRate/30; break; case PIC_3840x2160: stH264Cbr.u32BitRate = 1024 * 5 + 5120*u32FrameRate/30; break; default : //other small resolution stH264Cbr.u32BitRate = 512; break; } memcpy(&stVencChnAttr.stRcAttr.stH264Cbr, &stH264Cbr, sizeof(VENC_H264_CBR_S)); } else if (SAMPLE_RC_FIXQP == enRcMode) { VENC_H264_FIXQP_S stH264FixQp; stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264FIXQP; stH264FixQp.u32Gop = 30; stH264FixQp.u32SrcFrameRate = u32FrameRate; stH264FixQp.fr32DstFrameRate = u32FrameRate; stH264FixQp.u32IQp = 25; stH264FixQp.u32PQp = 30; stH264FixQp.u32BQp = 32; memcpy(&stVencChnAttr.stRcAttr.stH264FixQp, &stH264FixQp, sizeof(VENC_H264_FIXQP_S)); } else if (SAMPLE_RC_VBR == enRcMode) { VENC_H264_VBR_S stH264Vbr; printf("2222222222222222222222222222222222\n"); printf("2222222222 u32FrameRate = %u\n", u32FrameRate); stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264VBR; stH264Vbr.u32Gop = u32Gop; stH264Vbr.u32StatTime = u32StatTime; stH264Vbr.u32SrcFrameRate = u32FrameRate; #ifdef LSGK_1 #ifdef LSGK_VERSION stH264Vbr.fr32DstFrameRate = 20; #else stH264Vbr.fr32DstFrameRate = u32FrameRate; #endif #else stH264Vbr.fr32DstFrameRate = u32FrameRate; #endif switch (enSize) { case PIC_VGA: stH264Vbr.u32MaxBitRate = 1024 + 512*u32FrameRate/30; break; case PIC_720P: stH264Vbr.u32MaxBitRate = 1024 * 2 + 1024*u32FrameRate/30; break; case PIC_1080P: stH264Vbr.u32MaxBitRate = 1024 * 2 + 2048*u32FrameRate/30; break; case PIC_2592x1944: stH264Vbr.u32MaxBitRate = 1024 * 3 + 3072*u32FrameRate/30; break; case PIC_3840x2160: stH264Vbr.u32MaxBitRate = 1024 * 5 + 5120*u32FrameRate/30; break; default : #ifdef YLOK_1 stH264Vbr.u32MaxBitRate = 512; #else stH264Vbr.u32MaxBitRate = 1024 * 15 + 2048*u32FrameRate/30; #endif break; } memcpy(&stVencChnAttr.stRcAttr.stH264Vbr, &stH264Vbr, sizeof(VENC_H264_VBR_S)); } else if (SAMPLE_RC_AVBR == enRcMode) { VENC_H264_VBR_S stH264AVbr; stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264AVBR; stH264AVbr.u32Gop = u32Gop; stH264AVbr.u32StatTime = u32StatTime; stH264AVbr.u32SrcFrameRate = u32FrameRate; stH264AVbr.fr32DstFrameRate = u32FrameRate; switch (enSize) { case PIC_VGA: stH264AVbr.u32MaxBitRate = 1024 + 512*u32FrameRate/30; break; case PIC_720P: stH264AVbr.u32MaxBitRate = 1024 * 2 + 1024*u32FrameRate/30; break; case PIC_1080P: stH264AVbr.u32MaxBitRate = 1024 * 2 + 2048*u32FrameRate/30; break; case PIC_2592x1944: stH264AVbr.u32MaxBitRate = 1024 * 3 + 3072*u32FrameRate/30; break; case PIC_3840x2160: stH264AVbr.u32MaxBitRate = 1024 * 5 + 5120*u32FrameRate/30; break; case PIC_4000x3000: stH264AVbr.u32MaxBitRate = 1024 * 10 + 5120*u32FrameRate/30; break; case PIC_7680x4320: stH264AVbr.u32MaxBitRate = 1024 * 20 + 5120*u32FrameRate/30; break; default : stH264AVbr.u32MaxBitRate = 1024 * 15 + 2048*u32FrameRate/30; break; } memcpy(&stVencChnAttr.stRcAttr.stH264AVbr, &stH264AVbr, sizeof(VENC_H264_AVBR_S)); } else if (SAMPLE_RC_QVBR == enRcMode) { VENC_H264_QVBR_S stH264QVbr; stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264QVBR; stH264QVbr.u32Gop = u32Gop; stH264QVbr.u32StatTime = u32StatTime; stH264QVbr.u32SrcFrameRate = u32FrameRate; stH264QVbr.fr32DstFrameRate = u32FrameRate; switch (enSize) { case PIC_VGA: stH264QVbr.u32TargetBitRate = 1024 + 512*u32FrameRate/30; break; case PIC_360P: stH264QVbr.u32TargetBitRate = 1024 * 2 + 1024*u32FrameRate/30; break; case PIC_720P: stH264QVbr.u32TargetBitRate = 1024 * 2 + 1024*u32FrameRate/30; break; case PIC_1080P: stH264QVbr.u32TargetBitRate = 1024 * 2 + 2048*u32FrameRate/30; break; case PIC_2592x1944: stH264QVbr.u32TargetBitRate = 1024 * 3 + 3072*u32FrameRate/30; break; case PIC_3840x2160: stH264QVbr.u32TargetBitRate = 1024 * 5 + 5120*u32FrameRate/30; break; case PIC_4000x3000: stH264QVbr.u32TargetBitRate = 1024 * 10 + 5120*u32FrameRate/30; break; case PIC_7680x4320: stH264QVbr.u32TargetBitRate = 1024 * 20 + 5120*u32FrameRate/30; break; default : stH264QVbr.u32TargetBitRate = 1024 * 15 + 2048*u32FrameRate/30; break; } memcpy(&stVencChnAttr.stRcAttr.stH264QVbr, &stH264QVbr, sizeof(VENC_H264_QVBR_S)); } else if(SAMPLE_RC_CVBR == enRcMode) { VENC_H264_CVBR_S stH264CVbr; stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264CVBR; stH264CVbr.u32Gop = u32Gop; stH264CVbr.u32StatTime = u32StatTime; stH264CVbr.u32SrcFrameRate = u32FrameRate; stH264CVbr.fr32DstFrameRate = u32FrameRate; stH264CVbr.u32LongTermStatTime = 1; stH264CVbr.u32ShortTermStatTime = u32StatTime; switch (enSize) { case PIC_VGA: stH264CVbr.u32MaxBitRate = 1024 + 512*u32FrameRate/30; stH264CVbr.u32LongTermMaxBitrate = 1024 + 512*u32FrameRate/30; stH264CVbr.u32LongTermMinBitrate = 256; break; case PIC_720P: stH264CVbr.u32MaxBitRate = 1024 * 3 + 1024*u32FrameRate/30; stH264CVbr.u32LongTermMaxBitrate = 1024 * 2 + 1024*u32FrameRate/30; stH264CVbr.u32LongTermMinBitrate = 512; break; case PIC_1080P: stH264CVbr.u32MaxBitRate = 1024 * 2 + 2048*u32FrameRate/30; stH264CVbr.u32LongTermMaxBitrate = 1024 * 2 + 2048*u32FrameRate/30; stH264CVbr.u32LongTermMinBitrate = 1024; break; case PIC_2592x1944: stH264CVbr.u32MaxBitRate = 1024 * 4 + 3072*u32FrameRate/30; stH264CVbr.u32LongTermMaxBitrate = 1024 * 3 + 3072*u32FrameRate/30; stH264CVbr.u32LongTermMinBitrate = 1024*2; break; case PIC_3840x2160: stH264CVbr.u32MaxBitRate = 1024 * 8 + 5120*u32FrameRate/30; stH264CVbr.u32LongTermMaxBitrate = 1024 * 5 + 5120*u32FrameRate/30; stH264CVbr.u32LongTermMinBitrate = 1024*3; break; case PIC_4000x3000: stH264CVbr.u32MaxBitRate = 1024 * 12 + 5120*u32FrameRate/30; stH264CVbr.u32LongTermMaxBitrate = 1024 * 10 + 5120*u32FrameRate/30; stH264CVbr.u32LongTermMinBitrate = 1024*4; break; case PIC_7680x4320: stH264CVbr.u32MaxBitRate = 1024 * 24 + 5120*u32FrameRate/30; stH264CVbr.u32LongTermMaxBitrate = 1024 * 20 + 5120*u32FrameRate/30; stH264CVbr.u32LongTermMinBitrate = 1024*6; break; default : stH264CVbr.u32MaxBitRate = 1024 * 24 + 5120*u32FrameRate/30; stH264CVbr.u32LongTermMaxBitrate = 1024 * 15 + 2048*u32FrameRate/30; stH264CVbr.u32LongTermMinBitrate = 1024*5; break; } memcpy(&stVencChnAttr.stRcAttr.stH264CVbr, &stH264CVbr, sizeof(VENC_H264_CVBR_S)); } else if(SAMPLE_RC_QPMAP == enRcMode) { VENC_H264_QPMAP_S stH264QpMap; stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264QPMAP; stH264QpMap.u32Gop = u32Gop; stH264QpMap.u32StatTime = u32StatTime; stH264QpMap.u32SrcFrameRate = u32FrameRate; stH264QpMap.fr32DstFrameRate = u32FrameRate; memcpy(&stVencChnAttr.stRcAttr.stH264QpMap, &stH264QpMap, sizeof(VENC_H264_QPMAP_S)); } else { SAMPLE_PRT("%s,%d,enRcMode(%d) not support\n",__FUNCTION__,__LINE__,enRcMode); return HI_FAILURE; } stVencChnAttr.stVencAttr.stAttrH264e.bRcnRefShareBuf = bRcnRefShareBuf; } break; case PT_MJPEG: { if (SAMPLE_RC_FIXQP == enRcMode) { VENC_MJPEG_FIXQP_S stMjpegeFixQp; stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_MJPEGFIXQP; stMjpegeFixQp.u32Qfactor = 95; stMjpegeFixQp.u32SrcFrameRate = u32FrameRate; stMjpegeFixQp.fr32DstFrameRate = u32FrameRate; memcpy(&stVencChnAttr.stRcAttr.stMjpegFixQp, &stMjpegeFixQp,sizeof(VENC_MJPEG_FIXQP_S)); } else if (SAMPLE_RC_CBR == enRcMode) { VENC_MJPEG_CBR_S stMjpegeCbr; stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_MJPEGCBR; stMjpegeCbr.u32StatTime = u32StatTime; stMjpegeCbr.u32SrcFrameRate = u32FrameRate; stMjpegeCbr.fr32DstFrameRate = u32FrameRate; switch (enSize) { case PIC_VGA: stMjpegeCbr.u32BitRate = 1024 * 3 + 1024*u32FrameRate/30; break; case PIC_720P: stMjpegeCbr.u32BitRate = 1024 * 5 + 1024*u32FrameRate/30; break; case PIC_1080P: stMjpegeCbr.u32BitRate = 1024 * 8 + 2048*u32FrameRate/30; break; case PIC_2592x1944: stMjpegeCbr.u32BitRate = 1024 * 20 + 3072*u32FrameRate/30; break; case PIC_3840x2160: stMjpegeCbr.u32BitRate = 1024 * 25 + 5120*u32FrameRate/30; break; case PIC_4000x3000: stMjpegeCbr.u32BitRate = 1024 * 30 + 5120*u32FrameRate/30; break; case PIC_7680x4320: stMjpegeCbr.u32BitRate = 1024 * 40 + 5120*u32FrameRate/30; break; default : stMjpegeCbr.u32BitRate = 1024 * 20 + 2048*u32FrameRate/30; break; } memcpy(&stVencChnAttr.stRcAttr.stMjpegCbr, &stMjpegeCbr,sizeof(VENC_MJPEG_CBR_S)); } else if (SAMPLE_RC_VBR == enRcMode) { VENC_MJPEG_VBR_S stMjpegVbr; stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_MJPEGVBR; stMjpegVbr.u32StatTime = u32StatTime; stMjpegVbr.u32SrcFrameRate = u32FrameRate; stMjpegVbr.fr32DstFrameRate = 5; switch (enSize) { case PIC_VGA: stMjpegVbr.u32MaxBitRate = 1024 * 3 + 1024*u32FrameRate/30; break; case PIC_720P: stMjpegVbr.u32MaxBitRate = 1024 * 5 + 1024*u32FrameRate/30; break; case PIC_1080P: stMjpegVbr.u32MaxBitRate = 1024 * 8 + 2048*u32FrameRate/30; break; case PIC_2592x1944: stMjpegVbr.u32MaxBitRate = 1024 * 20 + 3072*u32FrameRate/30; break; case PIC_3840x2160: stMjpegVbr.u32MaxBitRate = 1024 * 25 + 5120*u32FrameRate/30; break; case PIC_4000x3000: stMjpegVbr.u32MaxBitRate = 1024 * 30 + 5120*u32FrameRate/30; break; case PIC_7680x4320: stMjpegVbr.u32MaxBitRate = 1024 * 40 + 5120*u32FrameRate/30; break; default : stMjpegVbr.u32MaxBitRate = 1024 * 20 + 2048*u32FrameRate/30; break; } memcpy(&stVencChnAttr.stRcAttr.stMjpegVbr, &stMjpegVbr,sizeof(VENC_MJPEG_VBR_S)); } else { SAMPLE_PRT("cann't support other mode(%d) in this version!\n",enRcMode); return HI_FAILURE; } } break; case PT_JPEG: stJpegAttr.bSupportDCF = HI_FALSE; stJpegAttr.stMPFCfg.u8LargeThumbNailNum = 0; stJpegAttr.enReceiveMode = VENC_PIC_RECEIVE_SINGLE; memcpy(&stVencChnAttr.stVencAttr.stAttrJpege, &stJpegAttr, sizeof(VENC_ATTR_JPEG_S)); break; default: SAMPLE_PRT("cann't support this enType (%d) in this version!\n",enType); return HI_ERR_VENC_NOT_SUPPORT; } if(PT_MJPEG == enType || PT_JPEG == enType ) { stVencChnAttr.stGopAttr.enGopMode = VENC_GOPMODE_NORMALP; stVencChnAttr.stGopAttr.stNormalP.s32IPQpDelta = 0; } else { memcpy(&stVencChnAttr.stGopAttr,pstGopAttr,sizeof(VENC_GOP_ATTR_S)); if((VENC_GOPMODE_BIPREDB == pstGopAttr->enGopMode)&&(PT_H264 == enType)) { if(0 == stVencChnAttr.stVencAttr.u32Profile) { stVencChnAttr.stVencAttr.u32Profile = 1; SAMPLE_PRT("H.264 base profile not support BIPREDB, so change profile to main profile!\n"); } } if((VENC_RC_MODE_H264QPMAP == stVencChnAttr.stRcAttr.enRcMode)||(VENC_RC_MODE_H265QPMAP == stVencChnAttr.stRcAttr.enRcMode)) { if(VENC_GOPMODE_ADVSMARTP == pstGopAttr->enGopMode) { stVencChnAttr.stGopAttr.enGopMode = VENC_GOPMODE_SMARTP; SAMPLE_PRT("advsmartp not support QPMAP, so change gopmode to smartp!\n"); } } } printf("-------------------------- stVencChnAttr.stRcAttr.stH264Cbr.u32BitRate=%d\n", stVencChnAttr.stRcAttr.stH264Cbr.u32BitRate); printf("chn_attr is stVencChnAttr.stVencAttr.u32PicWidth=%u\n\ stVencChnAttr.stVencAttr.u32PicHeight=%u\n\ stVencChnAttr.stVencAttr.enType=%u\n\ stVencChnAttr.stVencAttr.u32Profile=%u\n\ stVencChnAttr.stRcAttr.enRcMode=%u\n\ stVencChnAttr.stRcAttr.stH264Vbr.u32Gop=%u\n\ stVencChnAttr.stRcAttr.stH264Vbr.u32MaxBitRate=%u\n\ stVencChnAttr.stRcAttr.stH264Vbr.u32SrcFrameRate=%u\n\ stVencChnAttr.stRcAttr.stH264Vbr.fr32DstFrameRateFZ=%u\n\ stVencChnAttr.stRcAttr.stH264Vbr.fr32DstFrameRateFM=%u\n\ stVencChnAttr.stRcAttr.stH264Vbr.u32StatTime=%u\n\ stVencChnAttr.stGopAttr.enGopMode=%u\n",\ stVencChnAttr.stVencAttr.u32PicWidth,stVencChnAttr.stVencAttr.u32PicHeight,stVencChnAttr.stVencAttr.enType,\ stVencChnAttr.stVencAttr.u32Profile,stVencChnAttr.stRcAttr.enRcMode,stVencChnAttr.stRcAttr.stH264Vbr.u32Gop,\ stVencChnAttr.stRcAttr.stH264Vbr.u32MaxBitRate,stVencChnAttr.stRcAttr.stH264Vbr.u32SrcFrameRate,(stVencChnAttr.stRcAttr.stH264Vbr.fr32DstFrameRate & (HI_U32)65535),\ ((stVencChnAttr.stRcAttr.stH264Vbr.fr32DstFrameRate >> 16) & (HI_U32)65535),stVencChnAttr.stRcAttr.stH264Vbr.u32StatTime,stVencChnAttr.stGopAttr.enGopMode); printf("chn_attr is stVencChnAttr.stVencAttr.u32PicWidth=%u\n\ stVencChnAttr.stVencAttr.u32PicHeight=%u\n\ stVencChnAttr.stVencAttr.enType=%u\n\ stVencChnAttr.stVencAttr.u32Profile=%u\n\ stVencChnAttr.stRcAttr.enRcMode=%u\n\ stVencChnAttr.stRcAttr.stH264Cbr.u32Gop=%u\n\ stVencChnAttr.stRcAttr.stH264Cbr.u32MaxBitRate=%u\n\ stVencChnAttr.stRcAttr.stH264Cbr.u32SrcFrameRate=%u\n\ stVencChnAttr.stRcAttr.stH264Cbr.fr32DstFrameRateFZ=%u\n\ stVencChnAttr.stRcAttr.stH264Cbr.fr32DstFrameRateFM=%u\n\ stVencChnAttr.stRcAttr.stH264Cbr.u32StatTime=%u\n\ stVencChnAttr.stGopAttr.enGopMode=%u\n",\ stVencChnAttr.stVencAttr.u32PicWidth,stVencChnAttr.stVencAttr.u32PicHeight,stVencChnAttr.stVencAttr.enType,\ stVencChnAttr.stVencAttr.u32Profile,stVencChnAttr.stRcAttr.enRcMode,stVencChnAttr.stRcAttr.stH264Cbr.u32Gop,\ stVencChnAttr.stRcAttr.stH264Cbr.u32BitRate,stVencChnAttr.stRcAttr.stH264Cbr.u32SrcFrameRate,(stVencChnAttr.stRcAttr.stH264Cbr.fr32DstFrameRate & (HI_U32)65535),\ ((stVencChnAttr.stRcAttr.stH264Cbr.fr32DstFrameRate >> 16) & (HI_U32)65535),stVencChnAttr.stRcAttr.stH264Cbr.u32StatTime,stVencChnAttr.stGopAttr.enGopMode); s32Ret = HI_MPI_VENC_CreateChn(VencChn, &stVencChnAttr); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("HI_MPI_VENC_CreateChn [%d] faild with %#x! ===\n", \ VencChn, s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VENC_CloseReEncode(VencChn); if (HI_SUCCESS != s32Ret) { HI_MPI_VENC_DestroyChn(VencChn); return s32Ret; } return HI_SUCCESS; }
最新发布
11-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值