视频编码码率控制

news2024/10/1 3:23:58

什么是码率控制

码率控制是编码器的一个重要模块,主要的作用就是用算法来控制编码器输出码流的大小。虽然它是编码器的一个非常重要的部分,但是它并不是编码标准的一部分,也就是说,标准并没有给码控设定规则。我们平时用的编码器的码控都是编码器程序自己实现的。
那码控的原理是什么呢?其实码控就是为每一帧编码图像选择一个合适的 QP 值的过程。
我们知道当一帧图像的画面确定了之后,画面的复杂度和 QP 值几乎决定了它编码之后的大小。由于编码器无法决定画面的复杂度,因此,码控的目标就是选择一个合适的 QP 值,以此来控制编码后码流的大小。当然有些码控算法是可以直接外部指定使用哪个 QP 值去编码的,就不需要编码器的码控算法去做决策了。但是最后的原理是一样的。那接下来我们就来看一下都有哪些码控算法吧。

码控的类型

常用的码控算法主要有:VBR(动态码率)、 CBR(恒定码率)、CVBR(受限动态码率)、CQP(恒定 QP)和CRF(恒定码率因子), 这几种。

VBR

VBR 指的是编码器输出码率随着原始视频画面复杂度的变化不断的变化。通常当画面复杂或者说运动比较多的时候使用的码率会比较高;而当画面比较简单的时候使用的码率会比较低。VBR 主要的目标是保证视频画面质量,因此比较适合视频点播和短视频场景使用

CBR

另外一种码控算法就是 CBR 了,它是恒定码率的。这种码控方式用户需要设置一个目标码率值给编码器。编码器在编码的时候不管图像画面复杂或简单、运动多或运动少的时候,都尽量使得输出的码率接近设置的目标码率。
这种方式非常适合 RTC 场景,因为 RTC 场景希望编码的码率跟实际预测的带宽值接近,不能超出目标码率太多,也希望能够尽量有效地利用可用带宽,不能太低于目标码率,从而尽量保证编码后图像画面清晰。因此,在 RTC 场景中,我们会将预估带宽分出一定比例给视频数据,并将这部分带宽值当作目标码率设置给编码器。需要编码器的码控算法,能够在各种网络状况下和各种画面变化的情况下,都能使得输出的码率尽量接近于当前预估带宽得到的目标码率。

在这里插入图片描述

CVBR(Constrained VariableBit Rate)

),这样翻译成中文就比较难听了,它是VBR的一种改进方法。但是Constrained又体现在什么地方呢?这种算法对应的Maximum bitRate恒定或者Average BitRate恒定。这种方法的兼顾了CBR,VBR方法的优点:在图像内容静止时,节省带宽,有Motion发生时,利用前期节省的带宽来尽可能的提高图像质量,达到同时兼顾带宽和图像质量的目的。这种方法通常会让用户输入最大码率和最小码率,静止时,码率稳定在最小码率,运动时,码率大于最小码率,但是又不超过最大码率。

在这里插入图片描述

CQP

CQP 很简单就是从头到尾每一个画面都是用同一个 QP 值去编码。
根据我们视频编码的课程可知:

  • 在画面复杂的时候,残差比较大,相同 QP 值做量化之后的残差还是比较大的,编码之后的图像大小就会比较大。
  • 而画面简单的时候,残差很小,同一个 QP 值量化之后残差可能很小,甚至都为 0 了,编码之后的大小就会很小。

其实,我个人觉得 CQP 是一种特殊的 VBR。但要注意的是 CQP 一般用来衡量编码算法的性能,在实际工程当中不会使用。

CRF

CRF 是 x264 默认的码控算法。它与 CQP 不同的是它的 QP 是会变化的。
在画面运动大的时候,它会根据具体算法提高 QP 值;
在画面运动小的时候,它会降低 QP 值。它的思想是:运动很大的时候,人眼不太关注细节,因此 QP 可以稍微大一点;
运动比较小的时候,人眼会将注意力放在细节上面,因此 QP 稍微小一点。所以相比 CQP,CRF 能够更省码率一些。
但是 CRF 码控总体上得到的编码后图像的大小,还是随着图像的画面复杂度在变化的。因此,我觉得 CRF 也算是一种特殊的 VBR。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sql_lab之sqli注入中的cookie注入

Cookei注入(gxa的从cookei注入) 1.打开控制台 2.验证id2时的值 document.cookie"id2" 3.判断是上面闭合方式 document.cookie"id2 -- s" 有回显 说明是’单引号闭合 4.用order by 判断字段数 5.用联合查询判断回显点 接下来的…

html5 实现网页截屏 页面生成图片

效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"referrer" content"no-referrer" /><meta name"viewport"content"widthdevice-width,intial-sc…

前端开发新趋势:Web3 与虚拟现实的技术融合

在当今互联网技术日新月异的时代&#xff0c;Web技术也在不断地发展和变革。从前端开发的角度来看&#xff0c;新技术的涌现和旧技术的迭代让前端开发者们面临着前所未有的挑战和机遇。Web3 与虚拟现实&#xff08;VR&#xff09;的技术融合&#xff0c;正是当前前端开发领域的…

dpc与线程切换

中断服务例程 延迟过程调用 线程切换 键盘信号传输 1. 背景 我一般用ctrlaltdel能否呼出winlogon桌面作为Windows卡死&#xff08;hang&#xff09;还是个别程序卡死的鉴别手段。因为一则用户态的程序没办法干扰这个呼出流程&#xff0c;二则如果不能呼出任务管理器来终止进程…

openmediavault基本操作

omv基本操作 使用hostname访问共享文件夹设置1.挂载磁盘2.提交更改3.新建用户4.建立共享文件夹5.设置SMB/CIFS服务7.测试7.1.速度测试 使用hostname访问 把网口和wifi设置成DHCP,使用hostname访问,这样把NAS拿到任何地方都不需要配置了,自动联网进行访问. #网络->常规 #设…

搭建谷歌 Gemini,体验谷歌版GPT4

12.06 日谷歌 DeepMind CEO 和联合创始人 Demis Hassabis 正式推出了大模型Gemini 目前&#xff0c;Gemini 1.0 提供了三个不同的尺寸版本&#xff0c;分别如下&#xff1a; Gemini Ultra&#xff1a;规模最大、能力最强&#xff0c;用于处理高度复杂的任务&#xff1b;Gemin…

map容器的基本使用

文章目录 mapmap模板参数默认构造迭代器[ ]{ }inserterasefindlower_bound && upper_boundcountequal_range map和set容器&#xff0c;multimap和multiset是树形结构的关联式容器&#xff0c;这四种容器底层原理都是红黑树&#xff0c;容器中的元素是一个有序序列。 ma…

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。…

存储卡显示0字节怎么办?恢复0字节的存储小技巧

存储卡显示0字节是一个常见的故障现象&#xff0c;可能由多种原因引起。本文将详细分析存储卡出现此类问题的各种原因&#xff0c;并提供针对性的解决方法。通过深入了解这些原因和解决方案&#xff0c;读者可以有效地应对存储卡显示0字节的故障&#xff0c;从而恢复存储卡的正…

博主自制PDF转换工具丨支持PDF转图片丨PDF转word丨PDF转Excel丨PDF文本识别丨免费使用在线下载

博主自制PDF转换工具丨支持PDF转图片丨PDF转word丨PDF转Excel丨PDF文本识别丨免费使用在线下载 点我立即下载

CSB文件上传漏洞 -->Day4(图片挂马)

22二号&#xff0c;冬至啦&#xff0c;深圳这边只有5&#xff08;尊嘟好冷啊&#xff09;&#xff0c;写这篇文章的时候都已经是凌晨一点了&#xff0c;相信大部分的人都在温暖的被窝里面了吧&#xff01;&#xff01;&#xff08;可怜的我&#xff0c;还得写writeup&#xff0…

【XML】TinyXML 详解(一):介绍

【C】郭老二博文之&#xff1a;C目录 1、简介 优点&#xff1a; TinyXML 是一个简单、小型的 C XML 解析器&#xff0c;可以轻松集成到项目中。 TinyXML 解析 XML 文档&#xff0c;并根据该文档构建可读取、修改和保存的文档对象模型 (DOM) TinyXML 是在 ZLib 许可下发布的&a…

UG凸起命令

凸起命令是拉伸命令的补充&#xff0c;可以方便的对曲面进行拉伸切除。 当端盖中几何体类型选择默认的截面平面的时候&#xff0c;相当于拉伸命令 当端盖中几何体类型选择凸起的面的时候&#xff0c;相当于拉伸其实曲线变为选择曲线在凸起面的投影曲线&#xff0c;然后基于凸起…

栈的常见题型

1.有效的括号 char pairs(char a) {if(a})return {;if(a])return [;if(a))return (;return 0; } bool isValid(char* s) {char* stack(char*)malloc(sizeof(char)*10000);int top0;int lenstrlen(s);if(len%21)return false;for(int i0;s[i];i){char chpairs(s[i]);if(ch){if(t…

BTF:实践指南

本文地址&#xff1a;BTF&#xff1a;实践指南 | 深入浅出 eBPF 1. BPF 的常见限制 1.1 调试限制1.2 可移植性2. BTF 是什么&#xff1f;3. BTF 快速入门 3.1 BPF 快速入门3.1 BTF 和 CO-RE4. 结论 BPF 是 Linux 内核中基于寄存器的虚拟机&#xff0c;可安全、高效和事件驱动…

【STM32】STM32学习笔记-TIM定时中断(13)

00. 目录 文章目录 00. 目录01. TIM简介02. 定时器类型03. 基本定时器04. 通用定时器05. 高级定时器06. 定时中断基本结构07. 预分频器时序08. 计数器时序09. 计数器无预装时序10. 计数器有预装时序11. RCC时钟树12. 附录 01. TIM简介 TIM&#xff08;Timer&#xff09;定时器…

数据库中间件介绍

文章目录 什么是数据库中间件&#xff1f;Smart-client 模式优点缺点 Proxy 模式优点缺点 单元化架构优点缺点 总结 数据库中间件是连接数据库和应用程序之间的软件层&#xff0c;用于简化数据库管理、提高性能和可伸缩性&#xff0c;同时提供额外的功能和服务。在分布式系统和…

mybatis的二级缓存使用以及禁用

目录 mybatis 二级缓存配置有两处 全局设置 mapper 设置 测试代码 执行结果 源码执行逻辑 创建 SqlSession 二级缓存配置是否添加 解析 cache 标签 XMLMapperBuilder MapperBuilderAssistant CacheBuilder PerpetualCache SerializedCache LoggingCache 将 cach…

Python教程(17)——python模块是什么?python模块详解

Python模块简介 模块是一个包含了Python定义和语句的文件&#xff0c;可用于将功能组织成可重用和可维护的代码块。每个Python文件都可以作为一个模块&#xff0c;模块可以包含变量、函数、类或可执行代码。通过使用模块&#xff0c;我们可以将代码分离成逻辑单元&#xff0c;…

【vtkWidgetRepresentation】第十八期 vtkHoverWidget

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkHoverWidget,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. vtkHoverWidget vtkHoverWidget用于在呈现窗口中…