音视频封装格式解析(1)——H264格式简析,I/P/B帧是什么?H264压缩原理

文章目录

  • 1. H264编码参数
  • 2. H264编码原理
    • 2.1 压缩原理
    • 2.2 编码结构解析
  • 3. NALU结构
  • 4. H264 annexb模式
  • 5. 补充说明
    • 5.1 I帧
    • 5.2 P帧
    • 5.3 B帧

1. H264编码参数

视频质量和⽹络带宽占⽤是相⽭盾的。通常情况下,视频流占⽤的带宽越⾼则视频质量也越⾼,需要的⽹络带宽也越⼤。
评判⼀种视频编解码技术的优劣,是⽐较在相同的带宽条件下,哪个视频质量更好;在相同的视频质量条件下,哪个占⽤的⽹络带宽更少(⽂件体积⼩)。然⽽在我们⾁眼分辨的范围内,当码率⾼到⼀定
程度时,就没有什么差别了。所以码率设置有它的最优值
1)pc视频推荐码率

2)手机端视频推荐码率

2. H264编码原理

假设传入帧率25,19201080,的RGB24图像,需要的带宽是:
1920
1080325 /1024 /1024 = 148.315MB/s = 1186.523Mbps,非常大,所以需要视频压缩和编码技术。
视频由单张图片帧组成,每张图片帧之间的像素块存在相似性,因此可以进行图像压缩。

2.1 压缩原理

H264,采用帧内和帧间压缩(I、P、B帧策略),并采用16*16的分块大小,对视频图像进行压缩编码。
I帧:帧内编码帧,I帧通常是每个GOP的第一个帧,是一个完整图像经过空间压缩后的产物。
P帧:前向预测编码帧,参考前一个(I帧或P帧)的时间冗余信息,以此压缩传输数据量。
B帧:双向预测帧,参考前一个I或P帧及后一个P帧之间的时间冗余信息,以此压缩传输数据量。
压缩率:B>P>I

2.2 编码结构解析

H264为方便网络传输,提供了视频编码和分片策略。
因此H264将其组织成为序列(GOP)、图⽚(pictrue)、⽚(Slice)、宏块(Macroblock)、⼦块(subblock)五个层次。
GOP (图像组)主要⽤作形容⼀个IDR帧 到下⼀个IDR帧之间的间隔了多少个帧。
Reference(参考周期)指两个P帧之间的距离。

IDR:即时编码刷新帧,一个序列的第一个图像叫做IDR图像,IDR都是I帧图像。
核心作用解码重同步,当解码器解码到IDR图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新寻找参数集,开始一个新的序列
IDR之后的图像永远不会使用IDR之前的图像数据进行解码,但I帧可以。

总结:码率不变的前提下,GOP值越⼤,P、B帧的数量会越多,平均每个I、P、B帧所占⽤的字节数就越多,也就更容易获取较好的图像质量;Reference越⼤,B帧的数量越多,同理也更容易获得较好的图像质量
但并不是GOP值越高,图像质量一定越高,但遇到场景切换时,H264编码器自动强制插入一个IDR帧,此时实际的GOP值减小了。并且,P、B帧是由I帧预测过来的,图像中的错误会传播,知道下一个IDR帧才会恢复,所以不宜设置的过大。
同时,由于P、B帧较为复杂,过多的P、B帧会影响编码效率。

(⼀个序列就是⼀段内容差别不是很⼤的图像编码后⽣成的⼀串数据流。当运动变化⽐较少的时候,⼀个序列可以很⻓,因为运动变化的少就代表图像画⾯的内容变动很⼩,所以就可以编⼀个I帧,然后⼀直P帧、B帧了。当运动变化多时,可能⼀个序列就⽐较短了,⽐如就包含⼀个I帧和3、4个P帧。)

3. NALU结构


H264原始码流,由一个接一个的NALU(网络抽象单元)组成。
NALU结构分为两层,包含视频编码层(VCL)和NAL(⽹络提取层)。
视频编码层(VCL即 Video Coding Layer):包括核心压缩引擎和块、宏块于片的语法级别定义,尽可能独立于网络进行高效编码。
网络提取层(NAL即NetWork Abstraction Layer):将VCL产生的比特字符串适配到多元的网络、环境中,覆盖了所有片级以上的语法级别。
RBSP:Raw Byte Sequence Payload。原始字节序列负荷。

SPS:序列参数集,SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。
PPS: 图像参数集,对应的是一个序列中某一副或者某几副图像的参数
I帧、P帧、B帧
发I帧之前,至少要发一次SPS和PPS

在VCL进行数据传输或存储之前,编码的VCL数据被映射或封装进NAL单元。
一个NALU单元=startCode(3、4个字节) + 头部信息(1个字节) + 原始字节序列负荷RBSP

H.264标准指出,当数据流是储存在介质上时,在每个NALU 前添加起始码:0x000001 或 0x00000001,⽤来指示⼀个NALU 的起始和终⽌位置
在这样的机制下,在码流中检测起始码,作为⼀个NALU得起始标识,当检测到下⼀个起始 码时,当前NALU结束。
3字节的0x000001只有⼀种场合下使⽤,就是⼀个完整的帧被编为多个slice(⽚)的时 候,包含这些slice的NALU 使⽤3字节起始码。其余场合都是4字节0x00000001的。


0x68 & 0x1f = 0x07 :sps
0x68 & 0x1f = 0x08 :pps
0x68 & 0x1f = 0x05 :I帧


4. H264 annexb模式

ES–Elementary Streams (原始流) 是直接从编码器出来的数据流
container 容器
H264有两种封装

⼀种是annexb模式,传统模式,有startcode,SPS和PPS是在ES中。
⼀种是mp4模式,⼀般mp4 mkv flv都是mp4模式,没有startcode,SPS和PPS以及其它信息 被封装在container中,每⼀个frame前⾯4个字节是这个frame的⻓度。
很多解码器只⽀持annexb这种模式,因此需要将mp4做转换:在ffmpeg中⽤ h264_mp4toannexb_filter可以做转换。

    // 转成annexb模式// 1 获取相应的比特流过滤器//FLV/MP4/MKV等结构中,h264需要h264_mp4toannexb处理。添加SPS/PPS等信息。const AVBitStreamFilter *bsfilter = av_bsf_get_by_name("h264_mp4toannexb");AVBSFContext *bsf_ctx = NULL;// 2 初始化过滤器上下文av_bsf_alloc(bsfilter, &bsf_ctx); //AVBSFContext;// 3 添加解码器属性avcodec_parameters_copy(bsf_ctx->par_in, ifmt_ctx->streams[idx]->codecpar);av_bsf_init(bsf_ctx);av_bsf_send_packet  av_bsf_receive_packet

5. 补充说明

I P B三种帧的说明

5.1 I帧

I帧:帧内编码帧 ,I帧表示关键帧,你可以理解为这⼀帧画⾯的完整保留;解码时只需要本帧数
据就可以完成(因为包含完整画⾯)
I帧特点:

  1. 它是⼀个全帧压缩编码帧。它将全帧图像信息进⾏JPEG压缩编码及传输;
  2. 解码时仅⽤I帧的数据就可重构完整图像;
  3. I帧描述了图像背景和运动主体的详情;
  4. I帧不需要参考其他画⾯⽽⽣成;
  5. I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
  6. I帧是帧组GOP的基础帧(如果为IDR则为第⼀帧),在⼀组中只有⼀个IDR帧,⼀个或多个I
    帧(包括IDR帧);
  7. I帧不需要考虑运动⽮量;
  8. I帧所占数据的信息量⽐较⼤。

5.2 P帧

P帧:前向预测编码帧。P帧表示的是这⼀帧跟之前的⼀个关键帧(或P帧)的差别,解码时需
要⽤之前缓存的画⾯叠加上本帧定义的差别,⽣成最终画⾯。(也就是差别帧,P帧没有完整
画⾯数据,只有与前⼀帧的画⾯差别的数据)

P帧的预测与重构:P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动⽮量,取预测
差值和运动⽮量⼀起传送。在接收端根据运动⽮量从I帧中找出P帧“某点”的预测值并与差值
相加以得到P帧“某点”样值,从⽽可得到完整的P帧。

P帧特点:

  1. P帧是I帧后⾯相隔1~2帧的编码帧;
  2. P帧采⽤运动补偿的⽅法传送它与前⾯的I或P帧的差值及运动⽮量(预测误差);
  3. 解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;
  4. P帧属于前向预测的帧间编码。它只参考前⾯最靠近它的I帧或P帧;
  5. P帧可以是其后⾯P帧的参考帧,也可以是其前后的B帧的参考帧;
  6. 由于P帧是参考帧,它可能造成解码错误的扩散;
  7. 由于是差值传送,P帧的压缩⽐较⾼。

5.3 B帧

B帧:双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别,换⾔之,要解码B帧,不仅要取得之前的缓存画⾯,还要解码之后的画⾯,通过前后画⾯的与本帧数据的叠加取得最终的画⾯。B帧压缩率⾼,但是解码时CPU会⽐较累。

B帧的预测与重构
B帧以前⾯的I或P帧和后⾯的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动⽮量,并
取预测差值和运动⽮量传送。接收端根据运动⽮量在两个参考帧中“找出(算出)”预测值并与
差值求和,得到B帧“某点”样值,从⽽可得到完整的B帧。

B帧特点
1)B帧是由前⾯的I或P帧和后⾯的P帧来进⾏预测的;
2)B帧传送的是它与前⾯的I或P帧和后⾯的P帧之间的预测误差及运动⽮量;
3)B帧是双向预测编码帧;
4)B帧压缩⽐最⾼,因为它只反映两参考帧间运动主体的变化情况,预测⽐较准确;
5)B帧不是参考帧,不会造成解码错误的扩散。
注:I、B、P各帧是根据压缩算法的需要,是⼈为定义的,它们都是实实在在的物理帧。⼀般来
说,I帧的压缩率是7(跟JPG差不多),P帧是20,B帧可以达到50。可⻅使⽤B帧能节省⼤量
空间,节省出来的空间可以⽤来保存多⼀些I帧,这样在相同码率下,可以提供更好的画质。

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

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

相关文章

用友NC Cloud saveImageServlet/doPost接口存在任意文件上传漏洞

声明: 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 简介 用友NC Cloud 是基于云计算技术的企业管理软件。它提…

git push 错误: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413

问题 在git push时,发生了如下错误: git 提交代码报错 :error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 原因分析 一般两种: 本地git缓存设置太小。 这个的解决方法是:设置缓存大小 g…

lvm动态扩容

1、场景 因项目需要,前期磁盘评估不准确,系统在用了一段时间后发现磁盘空间不够用了,通过查看磁盘做的有lvm,因此联系了云平台的进行了扩容,扩容后如第二部分所看到的vdb是1000G,但是通过查看磁盘/home/da…

网络安全产品---数据库防火墙/审计

数据库防火墙 防火墙的类型繁多,即使下一代防火墙或者说AI防火墙集成功能再多,我觉得waf与数据库防火墙也有其无法被替代的理由,以此记录我对数据库防火墙的理解 what 数据库防火墙是基于数据库协议分析与访问行为控制的数据库安全防护产品…

IOS 32位调试环境搭建

一、背景 调试IOS程序经常使用gdb,目前gdb只支持32位程序调试,暂不支持IOS 64位程序调试。IOS 32位程序使用GDB调试之前,必须确保手机已越狱,否则无法安装和使用GDB调试软件。下面详细介绍GDB调试IOS 32位程序的环境搭建。 二、I…

MapReduce排序机制(Hadoop)

在MapReduce中,排序的目的是为了方便Reduce阶段的处理,通常是为了将相同键的键值对聚合在一起,以便进行聚合操作或其他处理。 1. Map阶段的局部排序(Local Sorting): 对于MapTask,它会将处理的…

python爬虫-----深入了解 requests 库下篇(第二十五天)

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

一文学会 ts 构建工具 —— tsup

文章目录 能打包什么?安装用法自定义配置文件条件配置在 package.json 中配置多入口打包生成类型声明文件sourcemap生成格式自定义输出文件代码分割产物目标环境支持 es5编译的环境变量对开发命令行工具友好监听模式 watch提供成功构建的钩子 onSuccess压缩产物 min…

RocketMQ学习笔记

kafka适合于日志收集的场景(不需要太多topic;topic下面的partition多了会造成写文件的速度变慢,因为要造很多索引) RocketMQ更适合于电商场景(适用于topic特别多的情况) 快速安装RocketMQ RocketMQ的官网…

C++进阶:搜索树

目录 1. 二叉搜索树1.1 二叉搜索树的结构1.2 二叉搜索树的接口及其优点与不足1.3 二叉搜索树自实现1.3.1 二叉树结点结构1.3.2 查找1.3.3 插入1.3.4 删除1.3.5 中序遍历 2. 二叉树进阶相关练习2.1 根据二叉树创建字符串2.2 二叉树的层序遍历I2.3 二叉树层序遍历II2.4 二叉树最近…

一、MinIO基本知识

MinIO基本知识 一、简介1.许可 二、部署1.Docker部署1.1 部署容器 1.2 MinIO页面访问1.3 创建Bucket![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6c8aa92975f146b691f1f36ce1033e7c.png) 三、Python-API1.安装包2.Bucket、Object概念3.Bucket-API4.MinIOClient-…

【算法刷题day29】Leetcode:491. 非递减子序列、46. 全排列、47. 全排列 II

文章目录 Leetcode 491. 非递减子序列解题思路代码总结 Leetcode 46. 全排列解题思路代码总结 Leetcode 47. 全排列 II解题思路代码总结 草稿图网站 java的Deque Leetcode 491. 非递减子序列 题目:491. 非递减子序列 解析:代码随想录解析 解题思路 大题…

C++修炼之路之多态--多态的条件与例外,重载+重写+重定义

目录 前言 一:构成多态的条件及一些特殊情况(前提是构成父子类) 1.多态是在不同的继承关系的类对象,去调用同一函数,产生了不同的结果 2.两个条件 3.三同的两个例外 1.协变---返回值类型可以不同,但必…

c++ qt6.5 打包sqlite组件无法使用,尽然 也需要dll支持!这和开发php 有什么区别!

运行 程序会默认使用当前所在文件夹中的 dll 文件,若文件不存在,会使用系统环境变量路径中的文件;又或者是需要在程序源代码中明确指定使用的 dll 的路径。由于我安装 Qt 时将相关 dll 文件路径都添加到了系统环境变量中,所以即使…

【R语言】混合图:小提琴图+箱线图

{ggstatsplot} 是 {ggplot2} 包的扩展,用于创建图形,其中包含信息丰富的绘图本身中包含的统计测试的详细信息。在典型的探索性数据分析工作流程中,数据可视化和统计建模是两个不同的阶段:可视化通知建模,而建模又可以建…

Vue 3 Hooks:优雅管理组件状态的完整指南

一、介绍 Hooks是Vue 3中的特性,允许在函数组件中使用状态和其他React的逻辑。本教程将演示如何使用TypeScript和Hooks管理Vue 3组件的状态和生命周期。 二、创建Hooks 首先,创建一个hooks.ts文件,包含自定义hooks。 import { ref, onMou…

MapReduce工作流程(Hadoop3.x)

MapReduce 是一种用于并行处理大规模数据集的——编程模型和处理框架。它通常用于分布式计算环境中,如Apache Hadoop。 工作流程 1. 切分阶段(Splitting): 数据集被分成多个数据块,每个数据块的大小通常在64MB到12…

Spring+Thymeleaf自定义Formatter

Thymeleaf 关于自定义转换的文档 Configuring a Conversion Service 中,是通过WebMvcConfigurerAdapter 来配置的,但是目前最新版的Spring Boot(V3.2.5),已经没有这个类了,得用 WebMvcConfigurationSupport 配置,比如实…

kaggle 泰坦尼克使用xgboost 得分0.73684

流程 导入所要使用的包引入kaggle的数据集csv文件查看数据集有无空值填充这些空值提取特征分离训练集和测试集调用模型 导入需要的包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarni…

zabbix自定义监控、自动发现和注册以及代理设置

前言 监控项的定制和新设备的注册往往需要大量手动操作,这会导致维护成本的增加和监控效率的降低。本文将介绍如何利用 Zabbix 的自定义功能,实现监控项的动态发布和新设备的自动注册以及代理设置、从而简化运维工作并实现更高效的监控管理。 Zabbix 监…