首页 > 编程语言 >openh264 帧级码率控制源码分析

openh264 帧级码率控制源码分析

时间:2024-06-20 15:59:45浏览次数:22  
标签:编码 调用 码率 源码 pWelsSvcRc pEncCtx 参数 openh264

openh264 码率控制结构

关于 openh264 码率控制整体结构,可以参考:openh264 码率控制原理框架

openh264 帧级码率控制介绍

  1. 函数关系图:从图可以看出,帧级码控的核心函数就是WelsRcPictureInitGomWelsRcPictureInfoUpdateGom函数。
    在这里插入图片描述

帧级码率控制核心函数介绍

  1. WelsRcPictureInitGom函数
  • 功能:负责设置编码周期的初始参数,包括码率、帧率、量化参数等,以确保视频编码过程中码率的稳定性和视频质量的一致性。通过调整这些参数,编码器可以在保持视频质量的同时,控制输出视频的比特率。
  • 原理过程
  • 函数声明:
    • WelsRcPictureInitGom 是函数的名称,用于初始化编码周期的率控制参数。
    • 参数 pEncCtx 是指向编码器上下文的指针。
    • 参数 uiTimeStamp 是当前帧的时间戳。
  • 局部变量声明:
    • pWelsSvcRc 指向当前依赖层的率控制结构体。
    • kiSliceNum 是当前编码层最大切片数量。
  • 连续跳帧计数器重置:
    • pWelsSvcRc->iContinualSkipFrames 重置为0,这可能用于跟踪连续跳过的帧数。
  • IDR帧的特殊处理:
    • 如果编码类型是I帧(关键帧),并且IDR帧计数器 iIdrNum 为0(表示编码器刚初始化),则调用 RcInitRefreshParameter 来初始化刷新参数。
  • 码率和帧率更新判断:
    • 如果需要,调用 RcJudgeBitrateFpsUpdate 判断并使用 RcUpdateBitrateFps 更新码率和帧率。
  • 时间层0的特殊处理:
    • 如果时间ID为0,则调用 RcUpdateTemporalZero 更新时间层0的参数。
  • 基于时间戳的码率决定:
    • 如果RC模式是时间戳模式,则调用 RcDecideTargetBitsTimestamp 根据时间戳决定目标比特数,并更新最后的时间戳。
    • 如果不是时间戳模式,则调用 RcDecideTargetBits 决定目标比特数。
  • 全局优化移动平均量化参数(GOM QP)的启用与禁用:
    • 如果切片数大于1,或者在码率模式下且编码类型为I帧,则禁用GOM QP。
    • 否则,启用GOM QP。
  • 全局量化参数计算:
    • 根据帧类型(I帧或非I帧),调用 RcCalculateIdrQpRcCalculatePictureQp 计算全局量化参数。
  • 切片信息初始化:
    • 调用 RcInitSliceInformation 初始化切片信息。
  • GOM参数初始化:
    • 调用 RcInitGomParameters 初始化GOM参数。
  • 源码
void  WelsRcPictureInitGom (sWelsEncCtx* pEncCtx, long long uiTimeStamp) {
  SWelsSvcRc* pWelsSvcRc           = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
  const int32_t kiSliceNum         = pEncCtx->pCurDqLayer->iMaxSliceNum;
  pWelsSvcRc->iContinualSkipFrames = 0;

  if (pEncCtx->eSliceType == I_SLICE) {
    if (0 == pWelsSvcRc->iIdrNum) { //iIdrNum == 0 means encoder has been initialed
      RcInitRefreshParameter (pEncCtx);
    }
  }
  if (RcJudgeBitrateFpsUpdate (pEncCtx)) {
    RcUpdateBitrateFps (pEncCtx);
  }
  if (pEncCtx->uiTemporalId == 0) {
    RcUpdateTemporalZero (pEncCtx);
  }
  if (pEncCtx->pSvcParam->iRCMode == RC_TIMESTAMP_MODE) {
    RcDecideTargetBitsTimestamp (pEncCtx);
    pWelsSvcRc->uiLastTimeStamp = uiTimeStamp;
  } else {
    RcDecideTargetBits (pEncCtx);
  }
  //turn off GOM QP when slicenum is larger 1
  if ((kiSliceNum > 1) || ((pEncCtx->pSvcParam->iRCMode == RC_BITRATE_MODE)
                           && (pEncCtx->eSliceType == I_SLICE))) {
    pWelsSvcRc->bEnableGomQp = false;
  } else
    pWelsSvcRc->bEnableGomQp = true;

  //decide globe_qp
  if (pEncCtx->eSliceType == I_SLICE) {
    RcCalculateIdrQp (pEncCtx);
  } else {
    RcCalculatePictureQp (pEncCtx);
  }
  RcInitSliceInformation (pEncCtx);
  RcInitGomParameters (pEncCtx);
} 
  1. WelsRcPictureInfoUpdateGom函数
  • 功能:负责在编码一帧后更新相关的率控制参数。通过这些更新,编码器可以动态调整编码参数,以确保在达到目标码率的同时,尽可能保持视频质量。此外,跳帧和填充的计算有助于在编码过程中进一步控制码率和视频文件的大小。
  • 原理过程
  • 函数声明:
    • WelsRcPictureInfoUpdateGom 是函数的名称,用于更新编码周期中帧的信息。
    • 参数 pEncCtx 是指向编码器上下文的指针。
    • 参数 iLayerSize 是当前编码层的大小,以字节为单位。
  • 局部变量声明:
    • pWelsSvcRc 指向当前依赖层的率控制结构体。
    • iCodedBits 是编码后帧的比特数,通过对 iLayerSize 左移3位(相当于乘以8)计算得出。
  • 更新编码后的量化参数和比特数:
    • 调用 RcUpdatePictureQpBits 函数,使用 pEncCtx 和 iCodedBits 更新编码帧的量化参数和比特数。
  • 更新帧复杂度:
    • 如果编码类型是P帧(前向预测帧),调用 RcUpdateFrameComplexity 更新帧的复杂度。
    • 如果编码类型是I帧(关键帧),调用 RcUpdateIntraComplexity 更新帧的复杂度。
  • 更新剩余比特数:
    • pWelsSvcRc->iRemainingBits 减去当前帧的比特数 pWelsSvcRc->iFrameDqBits,更新剩余的比特数。
  • 跳帧判断:
    • 如果启用了帧跳过功能(bEnableFrameSkip 为真),并且当前依赖层是最后一个空间层,则调用 RcVBufferCalculationSkip 函数进行跳帧计算。
  • 填充判断:
    • 如果设置了填充标志(iPaddingFlag),调用 RcVBufferCalculationPadding 函数进行填充计算。
  • 更新编码帧计数器:
    • pWelsSvcRc->iFrameCodedInVGop 增加1,表示在当前视频组(Video Group of Pictures, VGop)中又编码了一帧。
  • 源码
void  WelsRcPictureInfoUpdateGom (sWelsEncCtx* pEncCtx, int32_t iLayerSize) {
  SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
  int32_t iCodedBits = (iLayerSize << 3);

  RcUpdatePictureQpBits (pEncCtx, iCodedBits);

  if (pEncCtx->eSliceType == P_SLICE) {
    RcUpdateFrameComplexity (pEncCtx);
  } else {
    RcUpdateIntraComplexity (pEncCtx);
  }
  pWelsSvcRc->iRemainingBits -= pWelsSvcRc->iFrameDqBits;

  if (pEncCtx->pSvcParam->bEnableFrameSkip /*&&
      pEncCtx->uiDependencyId == pEncCtx->pSvcParam->iSpatialLayerNum - 1*/) {
    RcVBufferCalculationSkip (pEncCtx);
  }

  if (pEncCtx->pSvcParam->iPaddingFlag)
    RcVBufferCalculationPadding (pEncCtx);
  pWelsSvcRc->iFrameCodedInVGop++;
}

标签:编码,调用,码率,源码,pWelsSvcRc,pEncCtx,参数,openh264
From: https://blog.csdn.net/yanceyxin/article/details/139834825

相关文章

  • 搭建取图系统app源码开发,满足广泛应用需求
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档前言图片已成为信息传递的重要媒介,广泛应用于各个领域。为满足日益增长的图片需求,搭建一款高效的取图系统,可以为用户提供便捷、全面的图片服务。一、取图系统是什么?取图系统是一款用于搜集各种图片的系统......
  • 窥探Mybatis配置到执行源码剖析
    mybatis自动配置过程首先我们项目中使用mybatis如果是mybatis的话会引入依赖<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</ve......
  • 可预约上门服务的在线DIY预约小程序源码系统 带完整的安装代码包以及搭建教程
    系统概述这款可预约上门服务的在线DIY预约小程序源码系统是为满足各类上门服务需求而设计的。它允许用户通过小程序方便地预约各种服务,如家政服务、维修服务、美容美发服务等。同时,商家可以在后台管理系统中方便地管理预约信息、服务项目、员工信息等。代码示例系统特色......
  • 万能DIY预约小程序源码系统 适合任何行业在线预约报名 带完整的安装代码包以及搭建教
    系统概述在当今数字化时代,线上预约和报名系统已经成为各行各业不可或缺的工具。为了满足市场需求,万能DIY预约小程序源码系统应运而生,它为各类企业和组织提供了一种便捷、高效、灵活的解决方案,可适用于任何行业的在线预约和报名需求。代码示例系统特色功能一览  预约......
  • 【ASeeker】Android 源码捞针,服务接口扫描神器
    ASeeker是一个Android源码应用系统服务接口扫描工具。项目已开源:☞Github☜如果您也喜欢ASeeker,别忘了给我们点个星。说明ASeeker项目是我们在做虚拟化分身产品(『空壳』)过程中的内部开发工具,目的是为了提升Android系统各版本适配效率。由于产品需支持Android9......
  • Java计算机毕业设计+Vue实习实训管理系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今社会,实习实训已成为高等教育中不可或缺的一部分,对于学生实践能力和职业素养的提升具有重要意义。然而,传统的实习实训管理方式存在着诸多不便,如......
  • 前端网站(一) - 登录页面及账号密码验证(完善版)【附源码】
    登录页面及账号密码验证开篇(请大家看完):此网站写给挚爱,后续页面还会慢慢更新,大家敬请期待~~~轻舟所编写这个前端框架的设计初衷,纯粹是为了哄对象开心。除此之外,并无其它任何用途或目的。此前端框架,主要侧重于前端页面的视觉效果和交互体验。通过运用各种前端技术和创意,......
  • 广告变现小游戏对接广告平台开发 源码搭建
    对接广告平台以实现小游戏广告变现,并搭建相应的源码,是一个包含多个技术环节的过程。这涉及到游戏开发、广告SDK集成、后端服务配置等多个方面。以下是一个大致的开发与搭建流程:一、游戏开发需求分析:首先明确小游戏的定位、玩法、特色以及目标用户群体,为后续的广告变现策略奠......
  • 基于java的酒店管理系统(ppt+ER图+流程图+需求背景数据库+架构说明有文视频源码齐全)
    1引言1.1编写目的本文档为阳光酒店管理系统概要设计说明书,为阳光酒店管理系统详细设计的主要依据。1.2背景本软件全称为XX酒店管理系统。本软件为清华IT学习认证中心1123班顾俊小组毕业设计项目,由小组成员顾俊、董丰共同完成。软件适用于普通二星级酒店、宾馆。1.3参考资......
  • 基于springboot实现课程答疑管理系统项目【项目源码+论文说明】计算机毕业设计
    摘要随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势,针对这个问题开发一个专门适应师生交流形式的网站。本文介绍了课程答疑系统的开发全过程。通过分析企业对于课程答疑系统的需求,创建了一个计算机管理课程答疑系统的方案。文章介绍了课程答疑系统的系统分析部分......