视频基础学习五——视频编码基础二(编码参数帧、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

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Python动态处理文件编码的完整指南

《Python动态处理文件编码的完整指南》在Python文件处理的高级应用中,我们经常会遇到需要动态处理文件编码的场景,本文将深入探讨Python中动态处理文件编码的技术,有需要的小伙伴可以了解下... 目录引言一、理解python的文件编码体系1.1 Python的IO层次结构1.2 编码问题的常见场景二

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

Java中字符编码问题的解决方法详解

《Java中字符编码问题的解决方法详解》在日常Java开发中,字符编码问题是一个非常常见却又特别容易踩坑的地方,这篇文章就带你一步一步看清楚字符编码的来龙去脉,并结合可运行的代码,看看如何在Java项... 目录前言背景:为什么会出现编码问题常见场景分析控制台输出乱码文件读写乱码数据库存取乱码解决方案统一使

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty