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

相关文章

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

python操作redis基础

《python操作redis基础》Redis(RemoteDictionaryServer)是一个开源的、基于内存的键值对(Key-Value)存储系统,它通常用作数据库、缓存和消息代理,这篇文章... 目录1. Redis 简介2. 前提条件3. 安装 python Redis 客户端库4. 连接到 Re

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

一文详解PostgreSQL复制参数

《一文详解PostgreSQL复制参数》PostgreSQL作为一款功能强大的开源关系型数据库,其复制功能对于构建高可用性系统至关重要,本文给大家详细介绍了PostgreSQL的复制参数,需要的朋友可... 目录一、复制参数基础概念二、核心复制参数深度解析1. max_wal_seChina编程nders:WAL

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4