H264/H265基本编码参数1

news2024/9/30 15:36:51

本文主要讲解一些视频编码相关的基本概念

像素

像素是图像的基本单元,一个个像素就组成了图像。你可以认为像素就是图像中的一个点。我们来直观地看看像素是怎么组成图像的。在下面这张图中,你可以看到一个个方块,这些方块就是像素。
在这里插入图片描述

分辨率

图像(或视频)的分辨率是指图像的大小或尺寸。我们一般用像素个数来表示图像的尺寸。比如说一张 1920x1080 的图像,前者 1920 指的是该图像的宽度方向上有 1920 个像素点,而后者 1080 指的是图像的高度方向上有 1080 个像素点。
视频行业常见的分辨率有 360P(640x360)、720P(1280x720)、1080P(1920x1080)、4K(3840x2160)、8K(7680x4320)等。
下面是一组不同分辨率的图片:
在这里插入图片描述
1x1 的时候我们只能看到一个像素,只有一种颜色,根本就不是我们想象中的图像了。而 10x10 的图像几乎都是糊的,只能看到一点点轮廓。随着图像的分辨率越来越高,图像的细节就越来越清晰。由此,我们可以总结出:

  • 像素就只是一个带有颜色的小块。
  • 图像的分辨率越高,图像就越清晰。
    但从更加专业的角度来说,第 2 句话不够严谨。原始图像的话,分辨率越高确实会越清晰,但是我们看到的图像往往是经过后期处理的,比如放大缩小,或者磨皮美颜。经过处理过后的图像,尤其是放大之后的图像,分辨率很高,但是它并没有很清晰。这是因为放大的图像是通过“插值”处理得到的,而插值的像素是使用邻近像素经过插值算法计算得到的,跟实际相机拍摄的像素是不一样的,相当于“脑补”出来的像素值。因此,放大的图像还是会存在偏差,表现出来就是会模糊。我们会在之后的课程中来具体聊聊这个过程是怎么做的。总之,我们不能简单地认为分辨率数值越高的图像就越清晰。刚才我们在前面还提到,像素就是一个带有颜色的小块,那这个小块到底是怎么组成的呢?这里我们就来讲讲 RGB 图像像素和位深的概念。

位深

一般来说,我们看到的彩色图像中,都有三个通道,这三个通道就是 R、G、B 通道。简单来说就是,彩色图像中的像素是有三个颜色值的,分别是红、绿、蓝三个值。也就是说我们看到的那个带有颜色的块其实是由 R、G、B 三个值组成的(有的时候还会有 Alpha 值,代表透明度,我们这里不展开讨论)。
通常 R、G、B 各占 8 个位,也就是一个字节。8 个位能表示 256 种颜色值,那 3 个通道的话就是 256 的 3 次方个颜色值,总共是 1677 万种颜色。我们称这种图像是 8bit 图像,而这个 8bit 就是位深。
我们可以看到,位深越大,我们能够表示的颜色值就越多。因此,图像就可以更精确地展示你拍摄的真实世界。比如现在有 10bit 图像和 12bit 图像,8bit 图像的每一个像素需要占用 3x8 总共 24 个位,3 个字节,同理 10bit、12bit 就会占用更多。所以,图像的位深越大,需要的存储空间就会越大,传输这张图像使用的流量就会越多。目前我们大多数情况下看到的图像以及视频还是 8bit 位深的。

Stride

接下来我们来看一个特别的概念——Stride。这个 Stride 不是图像本身的属性,但是视频开发者经常会碰到,也是经常会出问题的一个东西。
Stride 也可以称之为跨距,是图像存储的时候有的一个概念。它指的是图像存储时内存中每行像素所占用的空间。你可能会问,一张图像的分辨率确定了,那一行的像素值不就确定了吗?为什么还需要跨距这个东西呢?其实,为了能够快速读取一行像素,我们一般会对内存中的图像实现内存对齐,比如 16 字节对齐。

举个例子,我们现在有一张 RGB 图像,分辨率是 1278x720。我们将它存储在内存当中,一行像素需要 1278x3=3834 个字节,3834 除以 16 无法整除。因此,没有 16 字节对齐。所以如果需要对齐的话,我们需要在 3834 个字节后面填充 6 个字节,也就是 3840 个字节做 16 字节对齐,这样这幅图像的 Stride 就是 3840 了。如下图所示:
在这里插入图片描述
这个地方你一定要注意,每读取一行数据的时候需要跳过这多余的 6 个字节。如果没有跳过的话,这 6 个字节的像素就会被我们误认为是下一行开始的 2 个像素(每个像素 R、G、B 各占 1 个字节,2 个像素共 6 个字节)。那这样得到的图像就完全错了,显示出来的就是“花屏”现象,屏幕会出现一条条的斜线。
所以,不管你去读取还是渲染一张图片,还是说你将这张图片存储下来,都需要设置正确的 Stride。很多时候,尤其是不规则分辨率的时候,它和图像的 Width(R、G、B 的话就是 Width x 3)是不一样的。
有的时候即便图像的 Width 是一个规则的值,比如说 1920 或者 1280 等能被 16 整除的宽度,图像存储在内存中有可能 Stride 和 Width(R、G、B 的话就是 Width x 3)也是不一样的,尤其是不同的视频解码器内部实现的不同,会导致输出的图像的 Stride 不一样。

帧率

以上就是图像的基本概念,接下来我们来讲讲视频的一些基本概念。
前面我们说到,视频是由一系列图像组成的,即“连续”的一帧帧图像就可以组成视频。但事实上,视频中的图像并不是真正意义上的连续。也就是说,在 1 秒钟之内,图像的数量是有限的。只是当数量达到一定值之后,人的眼睛的灵敏度就察觉不出来了,看起来就是连续的视频了。
这个 1 秒钟内图像的数量就是帧率。据研究表明,一般帧率达到 10~12 帧每秒,人眼就会认为是流畅的了。当然,可能会有个体差异。通常,我们在电影院看的电影帧率一般是 24fps(帧每秒),监控行业常用 25fps,而我们声网常用的帧率有 15fps、24fps 和 30fps。你可以根据自己的使用场景来具体设定你想使用的帧率值。

选择帧率的时候还需要考虑设备处理性能的问题,尤其是实时视频通话场景。帧率高,代表着每秒钟处理的图像数量会很高,从而需要的设备性能就比较高。如果是含有多个图像处理过程,比如人脸识别、美颜等算法的时候,就更需要考虑帧率大小和设备性能的问题。同样,也要考虑带宽流量的问题。帧率越大,流量也会越多,对带宽的要求也会越高。
在h264/h265标准里边,是用分数来表示帧率,注意,帧率并不一定是正数,比如可以是29.8 fps,再比如如果每隔两秒播放一帧那么帧率就是0.5fps.

framerate = frame_num / frame_den
frame_num: 帧率分子
frame_den: 帧率分母
一般在应用中,frame_num设置为一秒所占时钟单位数量。比如,如果时钟精度是us, 那么frame_num可以设置为1000000;如果时钟精度是纳秒ns,则frame_num设置为1000000000.
frame_den可以理解为每一帧所占的时间单位数量。比如时钟单位为us, 30fps, 那么frame_den配置为33333.

码率

我们已经知道,视频的帧率越高,1 秒钟内的图像数据量就会越大。通常我们存储视频的时候需要对图像进行压缩之后再存储,否则视频会非常大。那么压缩之后的视频我们一般如何描述它的大小呢?一般对于一个视频文件,我们直接看视频的大小就可以了。
但是在实时通信或者直播的时候,视频是视频流的形式,我们怎么衡量呢?这就涉及到我接下来要介绍的概念——码率。码率是指视频在单位时间内的数据量的大小,一般是 1 秒钟内的数据量,其单位一般是 Kb/s 或者 Mb/s。通常,我们用压缩工具压缩同一个原始视频的时候,码率越高,图像的失真就会越小,视频画面就会越清晰。但同时,码率越高,存储时占用的内存空间就会越大,传输时使用的流量就会越多。
这里请你思考一个问题,同一个原始视频被压缩之后,真的是码率越高,清晰度就越高吗?其实准确来说的话,不是。因为视频的压缩是一个非常复杂的过程,之后我们会有好几节课来讲视频压缩的知识。事实上,视频压缩之后的清晰度还跟压缩时选用的压缩算法,以及压缩时使用的压缩速度有关。压缩算法越先进,压缩率就会越高,码率自然就会越小。压缩速度越慢,压缩的时候压缩算法就会越精细,最后压缩率也会有提高,相同的清晰度码率也会更小。所以,并不是码率越高,清晰度就会越高。

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

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

相关文章

【GameFramework框架内置模块】4、内置模块之调试器(Debugger)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录:…

开启数字内容创作的新时代

目录 技术解析 未来展望 技术解析 Sora是一款由OpenAI开发的先进AI视频模型,其技术架构基于深度学习和自然语言处理技术。该模型的核心算法原理包括使用深度神经网络进行视频内容的理解、生成和互动。 在技术架构方面,Sora采用了一种混合的神经网络结…

五种多目标优化算法(NSWOA、MOJS、MOAHA、MOPSO、NSGA2)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 1.1NSWOA 1.2MOJS 1.3MOAHA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数(zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3)&#xff0…

15:00面试,15:06就出来了,问的问题过于变态了。。。

我从一家小公司转投到另一家公司,期待着新的工作环境和机会。然而,新公司的加班文化让我有些始料未及。虽然薪资相对较高,但长时间的工作和缺乏休息使我身心俱疲。 就在我逐渐适应这种高强度的工作节奏时,公司突然宣布了一则令人…

EXCEL如何从另一个表查找匹配信息

目录 1.背景:我们有一个目标呈现表,想要从另一个表中查询得到信息,比如根据身份证id查询该id的名字、性别等个人基本信息,或者从另一个财务信息表查询该id的工资信息等; 2.基础方法:利用VLOOKUP函数根据单…

NGINX服务器配置实现加密的WebSocket连接WSS协议

一、背景 最近在做小程序开发,需要在nginx中配置websocket加密模式,即wss。初次配置wss时,踩了两个小时的坑,本文将踩坑过程分享给大家,有需要用到的伙伴可以直接copy即可实现,节省宝贵时间。 二、WebSo…

VS2022调试技巧(一)

什么是bug? 在1945年,美国科学家Grace Hopper在进行计算机编程时,发现一只小虫子钻进了一个真空管,导致计算机无法正常工作。她取出虫子后,计算机恢复了正常,由此,她首次将“Bug”这个词用来描…

用html编写的小广告板

用html编写的小广告板 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…

刘知远LLM——Transformer与预训练模型

文章目录 注意力机制原理介绍注意力机制的各种变式注意力机制的特点 Transformer结构概述Transformer整体结构 输入层byte pair encodingpositional encoding Transformer BlockEncoder BlockMulti-Head Attention Decoder Block其他tricks总结 预训练语言模型语言建模概述预训…

二叉搜索树题目:二叉搜索树中的众数

文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 解法三思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉搜索树中的众数 出处&#xff1a;501. 二叉搜索树中的众数 难度 3 级 …

峰值检测电路

常用的峰值检测电路&#xff0c;如下图所示。 该电路有两种工作状态&#xff1a; 1、充电状态&#xff1a;D2导通&#xff0c;D1截止。 当U1的端比-端大时&#xff0c;V1VIN&#xff0c;VCV1-VD2&#xff0c;VOUTVC。这时&#xff0c;给电容C1充电。由于D1截止没有环路&#…

Shell脚本介绍及脚本功能

文章目录 一、什么是shell二、hello word2.1 echo2.2第一个脚本 三、Bash的基本功能3.1别名3.2常用快捷键3.3输入输出3.4 输出重定向3.5 多命令执行3.6 管道符3.7 通配符和特殊符号 一、什么是shell Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。S…

背包问题(介绍+例题+代码+注解)

目录 介绍&#xff1a; 一、01背包 题目描述 输入描述: 输出描述: 代码&#xff1a; 二、完全背包 题目描述 输入描述: 输出描述: 代码&#xff1a; 三、多重背包 题目描述 输入描述: 输出描述: 代码&#xff1a; 四、背包问题 题目描述 输入描述: 输出描…

Mybatis2

Mybatis2 本章目标&#xff1a; myBatis类型别名处理 myBatis参数处理 myBatis结果集类型 myBatis结果集列名和属性名称对应方式处理 附录 本章内容 一、类型别名&#xff08;typeAliases&#xff09;处理 类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置…

使用EFCore连接SQLite

简介 在使用EFCore连接SQLite之前我们先来了解一下SQLite SQLite是一个轻量级、自包含、无服务器、零配置的事务性SQL数据库引擎&#xff0c;它支持SQL92标准的大多数查询语言并兼容ACID事务。具体如下&#xff1a; 轻量级&#xff1a;SQLite非常轻巧&#xff0c;它的库体积…

[算法沉淀记录] 排序算法 —— 堆排序

排序算法 —— 堆排序 算法基础介绍 堆排序&#xff08;Heap Sort&#xff09;是一种基于比较的排序算法&#xff0c;它利用堆这种数据结构来实现排序。堆是一种特殊的完全二叉树&#xff0c;其中每个节点的值都必须大于或等于&#xff08;最大堆&#xff09;或小于或等于&am…

Huggingface学习笔记

课程地址&#xff1a;【HuggingFace简明教程,BERT中文模型实战示例.NLP预训练模型,Transformers类库,datasets类库快速入门.】 什么是huggingface&#xff1f; huggingface是一个开源社区&#xff0c;提供了先进的NLP模型、数据集以及工具。 主要模型&#xff1a; 安装环境&…

Rust升级慢,使用国内镜像进行加速

背景 rustup 是 Rust 官方的跨平台 Rust 安装工具&#xff0c;国内用户使用rustup update的时候&#xff0c;网速非常慢&#xff0c;可以使用国内的阿里云镜像源来进行加速 0x01 配置方法 1. Linux与Mac OS用户配置环境变量 修改~/.bash_profile文件添加如下内容&#xff1…

Docker基础篇(六) dockerfile体系结构语法

FROM&#xff1a;基础镜像&#xff0c;当前新镜像是基于哪个镜像的 MAINTAINER &#xff1a;镜像维护者的姓名和邮箱地址 RUN&#xff1a;容器构建时需要运行的命令 EXPOSE &#xff1a;当前容器对外暴露出的端口号 WORKDIR&#xff1a;指定在创建容器后&#xff0c;终端默认登…

lv21 QT入门与基础控件 1

1 QT简介 QT是挪威Trolltech开发的多平台C图形用户界面应用程序框架 典型应用 2 工程搭建 2.1 新建ui工程 不要写中文路径 2.1 不勾选UI&#xff08;主讲&#xff09; 3 QT信号与槽机制 语法&#xff1a;Connect&#xff08;A, SIGNLA(aaa()), B, SLOT(bbb())&#xff09;…