RV1126画面质量四:GOP改善画质

一. 什么是 GOP
GOP 实际上就是两个 I 帧的间隔,比方说分辨率是 1920 * 1080 50 帧,假设 GOP 为 5,那就是大概 2s 插入一个 I 帧。我们再
回顾下,H264/H265 的帧结构。H264/H265 分别分为三种帧类型:I 帧、P 帧、B 帧。

  1. I 帧:全称是帧内编码图像帧,意思是它不需要其他参考帧,只需要利用本帧就可以知道具体的信息
  2. P 帧:全称是预测编码图像帧,需要利用前面的 I 帧或者 P 帧,采用运动预测的方式去进行编码。P 帧的压缩比高于 I 帧
  3. B 帧:全称是双向预测编码图像帧,B 帧提供了最高的压缩比,它既需要参考前面的 P 帧或 I 帧、也需要参考后面的 P 帧、I 帧

按照字节数来说, I 帧> P 帧 > B 帧。在码率不变的情况,一个 GOP 的值越大,P、B 帧的数量就会越多,画面质量就会相对较好。 所以在开发中,我们可以适当增加 GOP 的长度去改善画面质量。但是值得注意的是,GOP 的长度不适合设置太长,由于 P 帧、B 帧复杂度远比 I 帧高。若过长的 GOP 就会使得 P 帧、B 帧数量非常多,从而导致编码器压力较大编码效率降低。通
常来说,GOP_SIZE 要设置成帧率的 1-10 倍。

为什么 GOP 较大时画面质量较好?

  1. 长时间内的视觉连续性:当 GOP 较大时,I 帧的数量减少,但 P 帧和 B 帧通过差异编码的方式,提供了更多的“相似性”信息,使得视频在相邻的帧之间能够保持较高的画面质量,尤其是在动作较为平稳或者变化不大的场景中。

  2. B 帧和 P 帧的高效编码:P 帧和 B 帧通常相对较小,因为它们只是记录和前后帧之间的差异,不需要完整的图像数据。这使得它们相对来说更加节省带宽。因此,GOP 较大时,会有更多的 P 和 B 帧来提高编码效率和压缩效果

  3. 在网络推流中尽量不要引入b帧,本地的4k视频就可以。

二. RV1126 中的 GOP 模式
        在 RV1126 中,GOP 分为两种常见模式。一种是普通 GOP 模式,另外一种是智能编码 GOP 模式。下面我们都分别介绍一下:


 2.1. 普通 GOP 模式:
        普通的 GOP 模式,也是我们最常见的场景。就是每隔一段 GOP_SIZE 就会插入一个 I 帧,如下图所示:

        上图没有B帧,因为网络中传播不需要I帧,I帧的解码时间就,要参考前后的I帧P帧。       

假设我的 GOP_SIZE = 5,就相当于每隔 5 个 P 帧(这里假设没有 B 帧)插入一个 I 帧,这种场景下。编码模块只能适用在那种切换不频繁的场景,如一个画面大部分是运动场景,或者大部分是静止,它不能很好处理那种场景切换很好的场景。 

2.2. 智能编码 P 模式:

        这种模式下,分成两种 I 帧。一种是普通 I 帧,另外一种是虚拟 I 帧(也称之为 SMARTP 模式)。

        普通 I 帧主要是检测画面的静止区域,当检测到静止区域的时候,编码器将会利用长参考帧的相关性,大幅度降低码率,并且尽量防止了静止画面的呼吸效应。 假设码率是5M,会把码率拉低到1M。因为禁止的画面远远低于远动画面,因为运动画面的细节比较多。所以要加大码率。上图就是长参考的I帧。

        这里的P帧是短的参考帧,参考上一帧,作用就是在这里检查是否有运动画面产生。所以运动画面是有这些普通P帧检测的,如果有运动画面就插入 SMARTP帧

         SMARTP并且把码率从5M提高到和合适的码率,检查运动画面

        而在运动区域,利用短期参考帧(P帧)进行运动估计,并插入虚拟 I 帧,SMARTP直接参考I帧,就是长参考。这样可最大拉长 I 帧间隔让其提高码率并最大限度提高画面质量。(注意:SMARTP 和虚拟 I 帧是同样的意思)。

        但是这样的也有一个问题,就是消耗cpu的能力,因为算力比较高,看实际选择。

三. RV1126 中的 GOP 模式的设置

   RK_S32 RK_MPI_VENC_SetGopMode(VENC_CHN VeChn, VENC_GOP_ATTR_S GopMode);

  1. 第一个传参数:编码通道号
  2. 第二个传参数:VENC_GOP_ATTR_S 的结构体
  3. 返回值:0 成功,非 0 失败

VENC_GOP_ATTR_S 数据结构,作用是定义编码器 GOP 属性结构体。

  1.  enGopMode:编码 Gop 类型填SMARTP和NORMALP多
  2. u32GopSize:编码 Gop 大小
  3. s32IPQpDelta:I 帧相对 P 帧对 QP 差值。比如这个花,消除马赛克和用于调节呼吸效应,默认值 6。6 代表的是打开纹理级别的编码,比如窗帘上面的一些花纹,如果你不打开这个可能是编码不出来的;当关闭的时候为 2,
  4. u32BgInterval:长期参考帧的间隔,若选中 SMARTP 则填这个值,否则不填。
  5. s32ViQpDelta:虚拟 I 帧相对于普通 P 帧的 QP 差值。用于调节呼吸效应,默认值 6。6 代表的是打开纹理级别的编码;当关闭的时候为 2

 

 编码普通模式下参数的配置:

VENC_GOP_ATTR_S venc_gop_attr;
venc_gop_attr.enGopMode = VENC_GOPMODE_NORMALP; //不要虚拟帧,就是普通帧
venc_gop_attr.s32ViQpDelta = 0;       //没有虚拟帧这些都不要
venc_gop_attr.s32IPQpDelta = 6;     //这个可以减少调节呼吸效应,代表的是打开纹理级别的编码;
venc_gop_attr.u32BgInterval = 0;   //没有虚拟I帧,所以不填
venc_gop_attr.u32GopSize = 30; //大小30
ret = RK_MPI_VENC_SetGopMode(venc_id, &venc_gop_attr);
注意:在普通模式下,u32BgInterval = 0,u32GopSize 是我们配置的 GOPSIZE 的值

智能 P 帧参数的配置:
VENC_GOP_ATTR_S venc_gop_attr;
venc_gop_attr.enGopMode = VENC_GOPMODE_SMARTP;  //选择虚拟I帧
venc_gop_attr.s32ViQpDelta = 6;        //用于调节呼吸效应和纹理级别的编码
venc_gop_attr.s32IPQpDelta = 6;        //用于调节呼吸效应和纹理级别的编码 基本一样

venc_gop_attr.u32BgInterval = 180; //一般是Gop_size的6~10倍
venc_gop_attr.u32GopSize = 30;         //大小30
ret = RK_MPI_VENC_SetGopMode(venc_id, &venc_gop_attr);

注意:在 SMARTP 模式下,有两个重要的参数配置 u32BgInterval 指的是长参考帧,一般都是 GOP_SIZE 的整数倍。u32GopSize 就是 GOPSIZE。u32BgInterval 具体填多少,要根据经验值进行判断,一般是 6-10 倍。

编码: 这里的编码用普通模式,因为我这里没有频繁切换的场景,改变不同的gop_size,看看画质

#include <stdio.h>
#include "rkmedia_public.h"void *collect_venc_thread(void *args)
{pthread_detach(pthread_self());MEDIA_BUFFER mb;FILE *h264_file = fopen("./test_output_smart_gop.h264", "w+");while (1){mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, 0, -1);if (!mb){printf("Get Venc Buffer Break....\n");break;}printf("mmmmmm\n");//采集到的文件保存到文件中fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, h264_file);RK_MPI_MB_ReleaseBuffer(mb);}return NULL;
}int main()
{RK_U32 u32Width = 1920;RK_U32 u32Height = 1080;RK_CHAR *pDeviceName = "rkispp_scale0";RK_CHAR *pOutPath = NULL;RK_CHAR *pIqfilesPath = NULL;CODEC_TYPE_E enCodecType = RK_CODEC_TYPE_H264;RK_CHAR *pCodecName = "H264";RK_S32 s32CamId = 0;RK_U32 u32BufCnt = 3;//isp的配置rk_aiq_working_mode_t hdr_mode = RK_AIQ_WORKING_MODE_NORMAL;SAMPLE_COMM_ISP_Init(hdr_mode, RK_FALSE);SAMPLE_COMM_ISP_Run();SAMPLE_COMM_ISP_SetFrameRate(30);int ret;RK_MPI_SYS_Init(); //初始化rkmedia//VI模块VI_CHN_ATTR_S vi_chn_attr;vi_chn_attr.pcVideoNode = pDeviceName;vi_chn_attr.u32BufCnt = u32BufCnt;vi_chn_attr.u32Width = u32Width;vi_chn_attr.u32Height = u32Height;vi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;vi_chn_attr.enBufType = VI_CHN_BUF_TYPE_MMAP;vi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL;ret = RK_MPI_VI_SetChnAttr(s32CamId, 1, &vi_chn_attr);ret |= RK_MPI_VI_EnableChn(s32CamId, 1);if (ret){printf("ERROR: create VI[0] error! ret=%d\n", ret);return 0;}//VENC模块VENC_CHN_ATTR_S venc_chn_attr;memset(&venc_chn_attr, 0, sizeof(venc_chn_attr));venc_chn_attr.stVencAttr.enType = RK_CODEC_TYPE_H264;venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;venc_chn_attr.stRcAttr.stH264Cbr.u32Gop = 5;venc_chn_attr.stRcAttr.stH264Cbr.u32BitRate = u32Width * u32Height * 3;// frame rate: in 30/1, out 30/1.venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1;venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = 30;venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1;venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 30;venc_chn_attr.stVencAttr.imageType = IMAGE_TYPE_NV12;venc_chn_attr.stVencAttr.u32PicWidth = u32Width;venc_chn_attr.stVencAttr.u32PicHeight = u32Height;venc_chn_attr.stVencAttr.u32VirWidth = u32Width;venc_chn_attr.stVencAttr.u32VirHeight = u32Height;venc_chn_attr.stVencAttr.u32Profile = 77;ret = RK_MPI_VENC_CreateChn(0, &venc_chn_attr);if (ret){printf("ERROR: create VENC[0] error! ret=%d\n", ret);return 0;}//配置gop模式VENC_GOP_ATTR_S venc_gop_attr;venc_gop_attr.enGopMode = VENC_GOPMODE_NORMALP; //普通gop模式venc_gop_attr.u32BgInterval = 0;venc_gop_attr.u32GopSize = 5;//5 60 这里大家可以试试一下,分别用60和50,看看效果venc_gop_attr.s32IPQpDelta = 6;venc_gop_attr.s32ViQpDelta = 0;ret = RK_MPI_VENC_SetGopMode(0, &venc_gop_attr);if (ret != 0){printf("Gop Mode Success.....\n");return -1;}else{printf("Gop Mode Failed.....\n");}//绑定vi和vencMPP_CHN_S stSrcChn;stSrcChn.enModId = RK_ID_VI;stSrcChn.s32DevId = 0;stSrcChn.s32ChnId = 1;MPP_CHN_S stDestChn;stDestChn.enModId = RK_ID_VENC;stDestChn.s32DevId = 0;stDestChn.s32ChnId = 0;ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);if (ret){printf("ERROR: Bind VI[0] and VENC[0] error! ret=%d\n", ret);return 0;}//开启线程采集pthread_t pid;ret = pthread_create(&pid, NULL, collect_venc_thread, NULL);if (ret != 0){printf("Create Venc Thread Failed....\n");}while (1){sleep(20);}return 0;
}

        效果演示后面不回来,开发板坏了,要寄回修了,没办法做实验         

gop调节效果 <   QP调节效果的,因为qp调节直接把编码器的一些细致弄出来。所以效果没有qp那么好,如果在码率不够的情况下也是经常可以用到的。以后得用那一种做开发,应该根据情况。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7455.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文了解二叉树的基本概念

文章目录 二叉树1二叉树的定义及其主要特征1.1二叉树的定义1.2二叉树的特点1.3二叉树的五种形态1.4二叉树与度为2的有序树的区别1.5几个特殊的二叉树1.6二叉树的性质 2二叉树的存储结构2.1二叉树的顺序存储2.2二叉树的链式存储 二叉树 1二叉树的定义及其主要特征 1.1二叉树的定…

MAX98357A一款数字脉冲编码调制(PCM)输入D类音频功率放大器

MAX98357A是一款数字脉冲编码调制&#xff08;PCM&#xff09;输入D类音频功率放大器&#xff0c;以下是对其的详细介绍&#xff1a; 一、主要特性 音频性能&#xff1a; 提供D类效率与AB类音频性能。支持高达3.2W&#xff08;4Ω负载&#xff0c;5V供电&#xff09;的输出功率…

nacos(基于docker最详细安装)

1、什么是Spring Cloud Spring Cloud是一系列框架的集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用Spring Boot的开发风格做到一键启动和部署。…

78,【2】BUUCTF WEB .[安洵杯 2019]不是文件

进入靶场 解题过程 点击最下面的英文字即可上传图片 新建一个文本文档 里面内容为空 更改名字为 1,2,3,4,0x4f3a363a2268656c706572223a323a7b733a393a22002a00696676696577223b623a313b733a393a22002a00636f6e666967223b733a353a222f666c6167223b7d)#.png 知道id1&#x…

Git 如何将旧仓库迁移新仓库中,但不显示旧的提交记录

一、异常错误 场景&#xff1a;我想把旧仓库迁移新仓库中&#xff0c;放进去之后&#xff0c;新仓库会显示这个项目之前的所有提交&#xff0c;如何不显示这些旧的提交&#xff1f; 二、原因 我们需要将旧仓库迁移新仓库中&#xff0c;但是又不想在新仓库中显示旧的提交记录…

Mysql索引(学习自用)

目录 一、索引概述 优缺点 二、索引结构 1、索引数据结构 2、索引支持结构 3、B树 4、B树 5、hash索引 6、为啥采用B树索引 三、索引分类 四、索引语法 五、索引性能分析 5.1查看执行频率 5.2慢查询日志 5.3profiling 5.4explain 六、索引使用规则 6.1验证索…

PSD是什么图像格式?如何把PSD转为JPG格式?

在图形设计的世界里&#xff0c;Photoshop 文档&#xff08;PSD&#xff09;格式是 Adobe Photoshop 的原生文件格式&#xff0c;它允许设计师保存图像中的图层、蒙版、透明度和不同色彩模式等信息。对于需要进一步编辑的设计作品来说&#xff0c;PSD 文件提供了极大的灵活性。…

基于物联网的风机故障检测装置的设计与实现

1 系统总体设计方案 通过对风机故障检测装置的设计与实现的需求、可行性进行分析&#xff0c;本设计风机故障检测装置的设计与实现的系统总体架构设计如图2-1所示&#xff0c;系统风机故障检测装置采用STM32F103单片机作为控制器&#xff0c;并通过DS18B20温度传感器、ACS712电…

全面评测 DOCA 开发环境下的 DPU:性能表现、机器学习与金融高频交易下的计算能力分析

本文介绍了我在 DOCA 开发环境下对 DPU 进行测评和计算能力测试的一些真实体验和记录。在测评过程中&#xff0c;我主要关注了 DPU 在高并发数据传输和深度学习场景下的表现&#xff0c;以及基本的系统性能指标&#xff0c;包括 CPU 计算、内存带宽、多线程/多进程能力和 I/O 性…

websocket实现

由于安卓资源管理器展示的路径不尽相同,各种软件保存文件的位置也不一定一样.对于普通用户上传文件时,查找文件可能是一个麻烦的事情.后来想到了一个办法,使用pc端进行辅助上传. 文章目录 实现思路1.0 实现定义web与客户端通信数据类型和数据格式web端websocket实现web端对客户…

【科研建模】Pycaret自动机器学习框架使用流程及多分类项目实战案例详解

Pycaret自动机器学习框架使用流程及项目实战案例详解 1 Pycaret介绍2 安装及版本需求3 Pycaret自动机器学习框架使用流程3.1 Setup3.2 Compare Models3.3 Analyze Model3.4 Prediction3.5 Save Model4 多分类项目实战案例详解4.1 ✅ Setup4.2 ✅ Compare Models4.3 ✅ Experime…

CY T 4 BB 5 CEB Q 1 A EE GS MCAL配置 - MCU组件

1、ResourceM 配置 选择芯片信号: 2、MCU 配置 2.1 General配置 1) McuDevErrorDetect: - 启用或禁用MCU驱动程序模块的开发错误通知功能。 - 注意:采用DET错误检测机制作为安全机制(故障检测)时,不能禁用开发错误检测。2) McuGetRamStateApi - enable/disable th…

docker 安装 mysql 详解

在平常的开发工作中&#xff0c;我们经常需要用到 mysql 数据库。那么在docker容器中&#xff0c;应该怎么安装mysql数据库呢。简单来说&#xff0c;第一步&#xff1a;拉取镜像&#xff1b;第二步&#xff1a;创建挂载目录并设置 my.conf&#xff1b;第三步&#xff1a;启动容…

【2025年数学建模美赛E题】(农业生态系统)完整解析+模型代码+论文

生态共生与数值模拟&#xff1a;生态系统模型的物种种群动态研究 摘要1Introduction1.1Problem Background1.2Restatement of the Problem1.3Our Work 2 Assumptions and Justifications3 Notations4 模型的建立与求解4.1 农业生态系统模型的建立与求解4.1.1 模型建立4.1.2求解…

编码器和扩散模型

目录 摘要abstract1.自动编码器2.变分编码器&#xff08;VAE&#xff09;3.论文阅读3.1 介绍3.2 方法3.3 结论 4.总结参考文献 摘要 本周学习了自动编码器&#xff08;AE&#xff09;和变分自动编码器&#xff08;VAE&#xff09;的基本原理与实现&#xff0c;分析其在数据降维…

【C++】类与对象初级应用篇:打造自定义日期类与日期计算器(2w5k字长文附源码)

文章目录 一、日期类的实现1. 日期类的默认成员函数的分析与实现构造函数其它默认成员函数 2. 各种逻辑比较运算符重载3. 日期加与减天数日期加天数系列日期减天数系列日期加减天数的最后修定和- -系列 4. 日期减日期方法一方法二 5. 流插入与流提取重载流插入重载流提取重载(含…

Redis实战(黑马点评)——关于缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、Redis工具)

redis实现查询缓存的业务逻辑 service层实现 Overridepublic Result queryById(Long id) {String key CACHE_SHOP_KEY id;// 现查询redis内有没有数据String shopJson (String) redisTemplate.opsForValue().get(key);if(StrUtil.isNotBlank(shopJson)){ // 如果redis的数…

ThinkPhp伪静态设置后,访问静态资源也提示找不到Controller

ThinkPhp没有配置伪静态时&#xff0c;除了默认的IndexController能访问&#xff0c;其他路由Controller都访问不到&#xff0c;提示404错误。配置了伪静态后就解决了这个问题。 但是当我的ThinkPhp后台项目中有静态资源放在public目录&#xff08;或子目录&#xff09;中需要…

2013年蓝桥杯第四届CC++大学B组真题及代码

目录 1A&#xff1a;高斯日记&#xff08;日期计算&#xff09; 2B&#xff1a;马虎的算式&#xff08;暴力模拟&#xff09; 3C&#xff1a;第39级台阶&#xff08;dfs或dp&#xff09; 4D&#xff1a;黄金连分数&#xff08;递推大数运算&#xff09; 5E&#xff1a;前缀…

【数据分享】1929-2024年全球站点的逐月平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff01;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站点…