视频基础学习五——视频编码基础二(编码参数帧、GOP、码率等)

2024-04-12 02:04

本文主要是介绍视频基础学习五——视频编码基础二(编码参数帧、GOP、码率等),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录

视频基础学习一——色立体、三原色以及像素
视频基础学习二——图像深度与格式(RGB与YUV)
视频基础学习三——视频帧率、码率与分辨率
视频基础学习四——视频编码基础一(冗余信息)
视频基础学习五——视频编码基础二(编码参数帧、GOP、码率等)
视频基础学习六——视频编码基础三(h264框架配合图文+具体抓包分析 万字)

文章目录

  • 系列文章目录
  • 前言
  • 一、视频帧
    • 1.帧
      • 定义
      • 帧类型
        • 1)I帧
        • 2)P帧
        • 3)B帧
        • 三种帧解码依赖关系
    • 2.GOP
    • 3.IDR帧
  • 二、时间戳DTS和PTS
  • 三、码率控制
    • 1.CQP
    • 2.CRF
    • 3.CBR
    • 4.VBR
    • 5.ABR
  • 总结


前言

上一篇文章记录了视频为何需要编码以及编码的大致原理——去除视频中的冗余信息,这一篇文章是介绍视频编码的一些基础知识,是对视频编码进一步也是做视频流媒体工作中经常需要用到的技术。

值得注意的是:一些初学者会认为视频编码只是将视频进行压缩以减少视频的体积,但这只是其中一个目的,视频编码还有另外一个比较重要的目的是对于网络传输有良好的亲和性

|版本声明:山河君,未经博主允许,禁止转载


一、视频帧

1.帧

在上一篇文章中,我们说了对于减少视频冗余信息里用到的一种很重要的方式——帧间预测帧内预测,前者利于时域上相邻图片的相关性大大减少了时间冗余,后者通过一张图片不同块的相似性减少空间冗余(详细请看视频基础学习四——视频编码基础一(冗余信息))。这里已经提到了帧与相邻帧的概念。

h264中就对应的采用了帧间压缩帧内压缩技术,来提高了压缩速率。

定义

一副图片经过编码后的数据叫做一帧,而一帧是由一个片(slice)或者多个片组成,一个片是由一个或多个宏块组成,而每一个宏块的大小是16x16的数据,一个宏块又可以分为1616,168,816,88,84,48,4*4,等大小不等的子块,具体关系如同下图
在这里插入图片描述
在h264中,编码最小单元就是宏块

至于为什么划分这么精细,请参照上一篇博客视频基础学习四——视频编码基础一(冗余信息),这里就不过多解释了。

帧类型

1)I帧

也称作关键帧,解码时只需要该帧就可以解压缩为一张完整的图片,特点:

  • 它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;
  • 解码时仅用I帧的数据就可重构完整图像;
  • I帧描述了图像背景和运动主体的详情;
  • I帧不需要参考其他画面而生成;
  • I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
  • I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
  • I帧不需要考虑运动矢量;
  • I帧所占数据的信息量比较大。

I帧简单点理解是通过了帧内压缩技术进行压缩,并为帧间压缩提供基础。所以它只解决了视频中的空间冗余信息,编码冗余信息、视觉冗余信息和知识冗余信息,并没有解决时间上的冗余

特点中提到的GOP的概念下面会进行介绍

2)P帧

也称为前向预测编码帧,利用之前的 I 帧或 P 帧,采用运动预测的方式进行帧间预测编码,特点:

  • P 帧是 I 帧后面相隔 1-2 帧的编码帧;
  • P 帧采用运动补偿的方法传送它与前面的 I 或 P 帧的差值及运动矢量(预测误差);
  • P 帧属于前向预测的帧间编码,它只参考前面最靠近它的 I 帧或 P 帧;
  • P 帧可以是其后面 P 帧的参考帧,也可以是其前后的 B 帧的参考帧;
  • 由于 P 帧是参考帧,它可能造成解码错误的扩散;
  • 由于是差值传送,P 帧的压缩比较高。

P帧在I帧的基础上,利用帧间预测,通过运动估计和补偿,解决了视频在时间上的冗余

3)B帧

也称为双向预测编码图像帧,它的压缩比例是最高的,它既需要之前的图像帧(I 帧或 P 帧),也需要后来的图像帧(P 帧)才能进行解码,特点:

  • B 帧是由前面的 I 或 P 帧和后面的 P 帧来进行预测的;
  • B 帧传送的是它与前面的 I 或 P 帧和后面的 P 帧之间的预测误差及运动矢量;
  • B 帧是双向预测编码帧;
  • B 帧压缩比最高,因为它只反映两参考帧间运动主体的变化情况,预测比较准确;
  • B 帧不是参考帧,不会造成解码错误的扩散。
三种帧解码依赖关系

三种解码依赖关系如下图
在这里插入图片描述

2.GOP

GOP(Group Of Pictures):是图像组的概念。在h264中,使用的是封闭GOP,即在一个GOP中所有的帧解码不应该GOP外其他帧。所以在一个GOP组中,第一帧一定是I帧。

如同下图,两个
在这里插入图片描述

3.IDR帧

IDR 帧全称叫做 Instantaneous Decoder Refresh,是 I 帧的一种。IDR 帧的作用是立刻刷新,重新算一个新的序列开始编码,使错误不致传播。I 帧有被跨帧参考的可能,但 IDR 帧不会,如同下图
在这里插入图片描述

二、时间戳DTS和PTS

  • DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
  • PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。

如果视频中没有B帧,那么DTS和PTS是一致的

那么为何加入了B帧后,DTS和PTS就不一致了呢?上面也说过B帧是双向预测的,B帧的解码需要前后两帧进行解码,如果一个视频中帧的显示顺序为:I B1 B2 P,那么它的解码顺序应该是:I P B1 B2,如同下图
在这里插入图片描述

三、码率控制

码率控制严格上来说不属于编码标准,但是在编码器设置中是非常重要的,一般来说在选择码率的时候,需要考虑到以下几点:

  • 视觉质量
  • 瞬时输出码率
  • 输出视频文件大小
  • 编码速度

在h264中常见码率有CQP、CRF、ABR、CBR、VBR五种设置。

1.CQP

CQP(Constant Quantization Parameter):恒定QP

恒定了编码参数。一般不会用于流媒体传输,因为这个选择是完全忽略码率,其中QP的范围是0~51,QP值越大表示越大的量化步长,编码视频的质量越低。QP为0表示进行无损编码。多会用于录制场景,一般选择18左右就可以做到高质量的画质,但是往往文件会很大。

2.CRF

CRF(Constant Rate Factor):恒定质量因子

以视觉质量为目标,和CQP很相似,但是文件会更小,因为它会减少一些人眼不敏感的场景例如高速运动或者细节丰富画面的编码,以达到节省码率的设置。

和QP的范围一样RF的范围也是[0,51]。其中0为无损模式,23为缺省,51质量最差。和QP一样的趋势。RF值加6,输出码率大概减少一半;减6,输出码率翻倍。

3.CBR

CBR(Constant Bitrate):固定码率

一定时间内保持比特率恒定,但是质量不稳定,不能充分利用带宽,这种码率设置不能充分考虑视频内容的复杂性,所以一般在传输中会尽量保持带宽设置较大,如果设置不合理,一些运动场景会很糊。但是好处是可以方便控制视频体积大小,在流式播放中,在更小的时间窗口保持码率的波动更小。

4.VBR

VBR(Variable Bitrate):可变码率

系统将自动为内容的简单部分分配较少的比特,从而留出足量的比特用于生成高质量的复杂部分。在文件大小相同情况下,VBR编码后要比CBR的质量更好。缺点是码率不固定,且编码速度也有很大波动。多用于延时不敏感的点播,或者存储下载系统中使用。

5.ABR

ABR(Average Bitrate):平均目标码率

简单场景分配较低bit,复杂场景分配足够bit,使得有限的bit数能够在不同场景下合理分配,这类似VBR。同时一定时间内,平均码率又接近设置的目标码率,这样可以控制输出文件的大小,这又类似CBR。可以认为是CBR和VBR的折中方案。这也是最常用的方案。


总结

其实这边文章介绍了视频编码中经常会遇到的一些特性,属于对于编码器基础的一些知识,下面一章会对于当前经常使用的编码器h264做详细的介绍。

如果对您有所帮助,请帮忙点个赞吧!

这篇关于视频基础学习五——视频编码基础二(编码参数帧、GOP、码率等)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Python如何使用seleniumwire接管Chrome查看控制台中参数

《Python如何使用seleniumwire接管Chrome查看控制台中参数》文章介绍了如何使用Python的seleniumwire库来接管Chrome浏览器,并通过控制台查看接口参数,本文给大家... 1、cmd打开控制台,启动谷歌并制定端口号,找不到文件的加环境变量chrome.exe --rem

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea