openh264 编码参数详细介绍

2024-06-06 07:52

本文主要是介绍openh264 编码参数详细介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

openh264

OpenH264 是 Cisco 开源的一个 H.264 编码器,它支持 H.264 高级视频编码标准。这个编码器库适用于实时通信和流媒体应用,如 WebRTC,并且它是完全免费和开源的。OpenH264 项目在 GitHub 上进行维护,并且有一个活跃的社区,为开发者提供了丰富的文档和示例代码。

TagEncParamBase参数结构体

(SEncParamBase, *PEncParamBase)

  • 说明:基础编码参数结构体
  • EUsageType iUsageType
    • 编码器使用类型,参考EUsageType的定义,主要有相机实时、桌面内容、相机非实时、桌面内容非实时、输入内容所有类型一共五种类型;
/**
* @brief Encoder usage type
*/
typedef enum {CAMERA_VIDEO_REAL_TIME,      ///< camera video for real-time communicationSCREEN_CONTENT_REAL_TIME,    ///< screen content signalCAMERA_VIDEO_NON_REAL_TIME,SCREEN_CONTENT_NON_REAL_TIME,INPUT_CONTENT_TYPE_ALL,
} EUsageType;
  • int iPicWidth
    • 亮度采样的图像宽,如果有多个空域层,则为最大值
  • int iPicHeight
    • 亮度采样的图像高,如果有多个空域层,则为最大值
  • int iTargetBitrate
    • 期望的目标比特率,单位是 bps
  • RC_MODES iRCMode
    • 码率控制方式,可以参考RC_MODES中定义,主要有质量模式、码率模式、自适应质量模式、基于时间戳模式、内置 rc 模式、关闭 rc 模式。
/**
* @brief Enumerate the type of rate control mode
*/
typedef enum {RC_QUALITY_MODE = 0,     ///< quality modeRC_BITRATE_MODE = 1,     ///< bitrate modeRC_BUFFERBASED_MODE = 2, ///< no bitrate control,only using buffer status,adjust the video qualityRC_TIMESTAMP_MODE = 3, //rate control based timestampRC_BITRATE_MODE_POST_SKIP = 4, ///< this is in-building RC MODE, WILL BE DELETED after algorithm tuning!RC_OFF_MODE = -1,         ///< rate control off mode
} RC_MODES;
  • float fMaxFrameRate
    • 最大输入帧率

TagEncParamExt参数结构体

(SEncParamExt)

  • 说明:扩展编码参数结构体
  • EUsageType iUsageType
    • 同TagEncParamBase
  • int iPicWidth
    • 同TagEncParamBase
  • int iPicHeight
    • 同TagEncParamBase
  • int iTargetBitrate
    • 同TagEncParamBase
  • RC_MODES iRCMode
    • 同TagEncParamBase
  • float fMaxFrameRate
    • 同TagEncParamBase
  • int iTemporalLayerNum
    • 时域分层数,最大时域层等于 4
  • int iSpatialLayerNum
    • 空域分层数,取值在 1~MAX_SPATIAL_LAYER_NUM,其中MAX_SPATIAL_LAYER_NUM取值 4
  • SSpatialLayerConfig sSpatialLayers[MAX_SPATIAL_LAYER_NUM]
    • 空域层配置,最大 4 层,为不同的空域层配置编码相关参数,具体可以参考SSpatialLayerConfig结构体
/**
* @brief  Structure for spatial layer configuration
*/
typedef struct {int   iVideoWidth;           ///< width of picture in luminance samples of a layerint   iVideoHeight;          ///< height of picture in luminance samples of a layerfloat fFrameRate;            ///< frame rate specified for a layerint   iSpatialBitrate;       ///< target bitrate for a spatial layer, in unit of bpsint   iMaxSpatialBitrate;    ///< maximum  bitrate for a spatial layer, in unit of bpsEProfileIdc  uiProfileIdc;   ///< value of profile IDC (PRO_UNKNOWN for auto-detection)ELevelIdc    uiLevelIdc;     ///< value of profile IDC (0 for auto-detection)int          iDLayerQp;      ///< value of level IDC (0 for auto-detection)SSliceArgument sSliceArgument;// Note: members bVideoSignalTypePresent through uiColorMatrix below are also defined in SWelsSPS in parameter_sets.h.bool      bVideoSignalTypePresent;  // false => do not write any of the following information to the headerunsigned charuiVideoFormat;        // EVideoFormatSPS; 3 bits in header; 0-5 => component, kpal, ntsc, secam, mac, undefbool      bFullRange;         // false => analog video data range [16, 235]; true => full data range [0,255]bool      bColorDescriptionPresent; // false => do not write any of the following three items to the headerunsigned charuiColorPrimaries;     // EColorPrimaries; 8 bits in header; 0 - 9 => ???, bt709, undef, ???, bt470m, bt470bg,//    smpte170m, smpte240m, film, bt2020unsigned charuiTransferCharacteristics;  // ETransferCharacteristics; 8 bits in header; 0 - 15 => ???, bt709, undef, ???, bt470m, bt470bg, smpte170m,//   smpte240m, linear, log100, log316, iec61966-2-4, bt1361e, iec61966-2-1, bt2020-10, bt2020-12unsigned charuiColorMatrix;        // EColorMatrix; 8 bits in header (corresponds to FFmpeg "colorspace"); 0 - 10 => GBR, bt709,//   undef, ???, fcc, bt470bg, smpte170m, smpte240m, YCgCo, bt2020nc, bt2020cbool bAspectRatioPresent; ///< aspect ratio present in VUIESampleAspectRatio eAspectRatio; ///< aspect ratio idcunsigned short sAspectRatioExtWidth; ///< use if aspect ratio idc == 255unsigned short sAspectRatioExtHeight; ///< use if aspect ratio idc == 255} SSpatialLayerConfig;
  • ECOMPLEXITY_MODE iComplexityMode
    • 复杂度模式,用来平衡编码复杂度和编码质量,具体可参考ECOMPLEXITY_MODE 共用体,取值有LOW_COMPLEXITY、MEDIUM_COMPLEXITY、HIGH_COMPLEXITY三种模式
/**
* @brief Enumulate the complexity mode
*/
typedef enum {LOW_COMPLEXITY = 0,              ///< the lowest compleixty,the fastest speed,MEDIUM_COMPLEXITY,          ///< medium complexity, medium speed,medium qualityHIGH_COMPLEXITY             ///< high complexity, lowest speed, high quality
} ECOMPLEXITY_MODE;
  • unsigned int uiIntraPeriod
    • 帧内编码帧的间隔,即 GOP 长度
  • int iNumRefFrame
    • 被使用的参考帧的数量
  • EParameterSetStrategy eSpsPpsIdStrategy
    • 在不同的 ID 中SPS/PPS 使用不同的策略,具体可以参考EParameterSetStrategy中定义,主要有固定 ID、每个 IDR 帧增加 ID、使用现有的 sps、使用现有 sps 同时 pps 增加、使用现有的 sps、pps。
/*** @brief Enumulate for the stategy of SPS/PPS strategy*/
typedef enum {CONSTANT_ID = 0,           ///< constant id in SPS/PPSINCREASING_ID = 0x01,      ///< SPS/PPS id increases at each IDRSPS_LISTING  = 0x02,       ///< using SPS in the existing list if possibleSPS_LISTING_AND_PPS_INCREASING  = 0x03,SPS_PPS_LISTING  = 0x06,
} EParameterSetStrategy;
  • bool bPrefixNalAddingCtrl
    • false 不使用Prefix NAL,true 使用Prefix NAL
    • Prefix NAL(前缀NAL单元)是视频编码中,特别是在H.264/AVC标准里使用的一种技术。它是一种特定的NAL单元,用于在发送新的NAL单元之前提供一些额外的信息或控制指令。这种前缀可以包含重要的编码参数,比如时间戳信息、解码参数集合(如SPS和PPS)的变化信息等。
  • bool bEnableSSEI
    • false 不使用 SSEI,true 使用 SSEI,todo:计划移除 SSEI 接口
  • bool bSimulcastAVC
    • false 使用 svc 语法为更高层当空域层多于 1 层时,true 使用Simulcast avc
  • int iPaddingFlag
    • 0 不填充,1 填充,
  • int iEntropyCodingModeFlag
    • 熵编码方式,0 为 cavlc,1 为 cabac
  • bool bEnableFrameSkip
    • false 无法跳帧,即使 vbv缓存溢出,true 允许跳帧保持码率在限制范围内
  • int iMaxBitrate
    • 最大码率,单位是 bps,如果不需要设置为UNSPECIFIED_BIT_RATE
  • int iMaxQp
    • 编码器支持的最大 qp 值
  • int iMinQp
    • 编码器支持的最小 qp 值
  • unsigned int uiMaxNalSize
    • 最大 NAL 大小,对于动态切片模式,该值不应该为0
  • bool bEnableLongTermReference
    • 长参考开关,1 开启长参考,0 关闭长参考
  • int iLTRRefNum
    • 长参考帧数量,todo:还不支持任意设置
  • unsigned int iLtrMarkPeriod
    • 在反馈中标记长参考的间隔周期
  • unsigned short iMultipleThreadIdc
    • 多线程设置,0 auto, 1 禁用多线程,大于 1 时计数多线程数量
  • bool bUseLoadBalancing
    • 仅当uiSliceMode=1或3时使用,将在多线程编码的运行期间更改图片的切片,因此每次运行的结果可能不同
  • int iLoopFilterDisableIdc
    • 去块环路滤波器,0:开启,1:关闭,2:开启,除了切片边界
  • int iLoopFilterAlphaC0Offset
    • Alpha偏移量设置,取值范围[-6, 6],默认 0
  • int iLoopFilterBetaOffset
    • Beta偏移量设置,取值范围[-6, 6],默认 0
  • bool bEnableDenoise
    • 去噪控制
  • bool bEnableBackgroundDetection
    • 背景检测控制
  • bool bEnableAdaptiveQuant
    • 自适应量化控制
  • bool bEnableFrameCroppingFlag
    • 使能帧裁剪标志:在应用中始终为TRUE
  • bool bEnableSceneChangeDetect
    • 场景变化检测
  • bool bIsLosslessLink
    • 长参考高级设置

编码参数默认设置

  • 在 param_svc.h 文件中FillDefault (SEncParamExt& param)函数设置编码参数默认值。
static void FillDefault (SEncParamExt& param) {memset (&param, 0, sizeof (param));param.uiIntraPeriod         = 0;                    // intra period (multiple of GOP size as desired)param.iNumRefFrame          = AUTO_REF_PIC_COUNT;// number of reference frame usedparam.iPicWidth             = 0;    //   actual input picture widthparam.iPicHeight            = 0;    //   actual input picture heightparam.fMaxFrameRate         = MAX_FRAME_RATE;       // maximal frame rate [Hz / fps]param.iComplexityMode       = LOW_COMPLEXITY;param.iTargetBitrate        = UNSPECIFIED_BIT_RATE; // overall target bitrate introduced in RC moduleparam.iMaxBitrate           = UNSPECIFIED_BIT_RATE;param.iMultipleThreadIdc    = 1;param.bUseLoadBalancing = true;param.iLTRRefNum            = 0;param.iLtrMarkPeriod        = 30;   //the min distance of two int32_t referencesparam.bEnableSSEI           = false;param.bSimulcastAVC         = false;param.bEnableFrameCroppingFlag = true; // enable frame cropping flag: true alwayse in application// false: Streaming Video Sharing; true: Video Conferencing Meeting;/* Deblocking loop filter */param.iLoopFilterDisableIdc         = 0;    // 0: on, 1: off, 2: on except for slice boundariesparam.iLoopFilterAlphaC0Offset      = 0;    // AlphaOffset: valid range [-6, 6], default 0param.iLoopFilterBetaOffset         = 0;    // BetaOffset:  valid range [-6, 6], default 0/* Rate Control */param.iRCMode                       = RC_QUALITY_MODE;param.iPaddingFlag                  = 0;param.iEntropyCodingModeFlag        = 0;param.bEnableDenoise                = false;        // denoise controlparam.bEnableSceneChangeDetect      = true;         // scene change detection controlparam.bEnableBackgroundDetection    = true;         // background detection controlparam.bEnableAdaptiveQuant          = true;         // adaptive quantization controlparam.bEnableFrameSkip              = true;         // frame skippingparam.bEnableLongTermReference      = false;        // long term reference controlparam.eSpsPpsIdStrategy             = INCREASING_ID;// pSps pPps id addition controlparam.bPrefixNalAddingCtrl          = false;        // prefix NAL adding controlparam.iSpatialLayerNum              = 1;            // number of dependency(Spatial/CGS) layers used to be encodedparam.iTemporalLayerNum             = 1;            // number of temporal layer specifiedparam.iMaxQp = QP_MAX_VALUE;param.iMinQp = QP_MIN_VALUE;param.iUsageType = CAMERA_VIDEO_REAL_TIME;param.uiMaxNalSize = 0;param.bIsLosslessLink = false;for (int32_t iLayer = 0; iLayer < MAX_SPATIAL_LAYER_NUM; iLayer++) {param.sSpatialLayers[iLayer].uiProfileIdc = PRO_UNKNOWN;param.sSpatialLayers[iLayer].uiLevelIdc = LEVEL_UNKNOWN;param.sSpatialLayers[iLayer].iDLayerQp = SVC_QUALITY_BASE_QP;param.sSpatialLayers[iLayer].fFrameRate = param.fMaxFrameRate;param.sSpatialLayers[iLayer].iMaxSpatialBitrate = UNSPECIFIED_BIT_RATE;param.sSpatialLayers[iLayer].sSliceArgument.uiSliceMode = SM_SINGLE_SLICE;param.sSpatialLayers[iLayer].sSliceArgument.uiSliceNum = 0; //AUTO, using number of CPU coresparam.sSpatialLayers[iLayer].sSliceArgument.uiSliceSizeConstraint = 1500;param.sSpatialLayers[iLayer].bAspectRatioPresent = false; // do not write any of the following information to the headerparam.sSpatialLayers[iLayer].eAspectRatio = ASP_UNSPECIFIED;param.sSpatialLayers[iLayer].sAspectRatioExtWidth = 0;param.sSpatialLayers[iLayer].sAspectRatioExtHeight = 0;const int32_t kiLesserSliceNum = ((MAX_SLICES_NUM < MAX_SLICES_NUM_TMP) ? MAX_SLICES_NUM : MAX_SLICES_NUM_TMP);for (int32_t idx = 0; idx < kiLesserSliceNum; idx++)param.sSpatialLayers[iLayer].sSliceArgument.uiSliceMbNum[idx] = 0; //default, using one row a slice if uiSliceMode is SM_RASTER_MODE// See codec_app_def.h for more info about members bVideoSignalTypePresent through uiColorMatrix.  The default values// used below preserve the previous behavior; i.e., no additional information will be written to the output file.param.sSpatialLayers[iLayer].bVideoSignalTypePresent = false;     // do not write any of the following information to the headerparam.sSpatialLayers[iLayer].uiVideoFormat = VF_UNDEF;        // undefinedparam.sSpatialLayers[iLayer].bFullRange = false;            // analog video data range [16, 235]param.sSpatialLayers[iLayer].bColorDescriptionPresent = false;    // do not write any of the following three items to the headerparam.sSpatialLayers[iLayer].uiColorPrimaries = CP_UNDEF;       // undefinedparam.sSpatialLayers[iLayer].uiTransferCharacteristics = TRC_UNDEF; // undefinedparam.sSpatialLayers[iLayer].uiColorMatrix = CM_UNDEF;        // undefined}}

这篇关于openh264 编码参数详细介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035518

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &