草庐IT

H264基础知识入门

音视频开发老马 2023-06-20 原文

之前视频基础,有讲到视频的原始数据YUV,相比RBG,数据确实减少了,但还是一个非常大数据量,会占用很大空间以及在给网络传输带来很大压力。所以必须要对视频进行压缩,减少占用空间。这里主要分享H264编码技术,压缩和编码是一回事。

 

H264压缩比是百分之一 ,能将100M的YUV数据压缩到接近1M数据大小。

什么是GOP?

一组强相关的图像帧。

将一个视频拉长,帧比较多的时候,对帧进行分组,分组的要求是每一组帧的相关性较强。举例 把做相同动作的帧放在一组。(这一组图像只是发生了细微的差别,变化较单调)。

I帧P帧B帧

  • I帧(intraframe frame),关键帧。

采用帧内压缩技术。I帧是所有数据帧最关键的帧,如果缺少了I帧,后面的数据帧将无法使用。IDR帧属于I帧。举例我将GOP中第一帧就可以称作I帧。在编码时,I帧是不需要参考前后帧数据,是独立编码。GOP至少有一个I帧

  • P帧(forward Predicted frame),向前参考帧。

压缩时,只参考前面已经处理的帧,采用帧间压缩技术。它占I帧的一半大小。

  • B帧(Bidirectionally predicted frame),双向参考帧。

压缩时,既参考前面已经处理的帧,也参考后面的帧,帧间压缩技术。它占I帧1/4大小。压缩率变高

既然B帧占用空间小?是不是B帧越多越好?

虽然B帧的压缩率是最高,但是他同时带来一个问题, 他占用的CPU以及耗时非常多,既然耗时,在实时直播视频情况就会导致一个延迟的情况。如果只是想减少空间大小,B帧将是一个很好的选择。根据情况,来选择对应的策略。所以一般在直播中是没有B帧,只有I帧和P帧。

** 编码后数据,根据I帧P帧B帧的特性,在解码的过程是按I帧、P帧和B帧进行解码,文件播放还是按I帧、B帧和P帧顺序播放。**

IDR帧和I帧的关系。

IDR(Instantannous Decoder Refresh) 解码器立即刷新

作用:在解码的过程,一旦有一帧数据出现错误,将是无法恢复的过程,后面数据帧不能使用。当有了IDR帧,解码器收到IDR帧时,就会将缓冲区的数据清空,找到第一个IDR帧,重新解码。I和IDR帧都使用帧内预测,在编码解码中为了方便,首个I帧要和其他I帧区别开,把第一个I帧叫IDR,这样方便控制编码和解码流程。IDR帧必须是一个I帧,但是I帧不一定是IDR帧,这个帧出现的时候,是告诉解码器,可以清除掉所有的参考帧,这是一个全新的序列,新的GOP已经开始。I帧有被跨帧参考的可能,IDR不会。

每个GOP中的第一帧就是IDR帧。

IDR帧是一种特殊的I帧。

帧与分组的关系:

SPS与PPS参数

成对出现的一组参数数据,在IDR帧之前

SPS(Sequence Parmeter Set)

序列参数集,作用于一串连续的视频图像。如seq_prameter_set_id、帧数及POC(picture order count)的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等。GOP的参数设置。

PPS

图像参数集,作用于视频序列中的图像。如pic_parameter_set_id、熵编码模式选择标识、片组数目、初始量化和去方块滤波系数调整标识

文末名片免费领取音视频开发学习资料,内容包括(C/C++,Linux 服务器开发,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

H264的压缩技术

由一系列技术组成的压缩集。

有损压缩技术:

帧内压缩,解决的是空域数据冗余问题。例如:一个人物的背景图像是一样,那么可以使用非常小的数据量进行存储。

帧间压缩,解决的时域数据冗余问题。在时间上进行压缩,参考前面帧数据压缩。前面提到IBP帧就是。

无损压缩技术:

整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化。

CABAC压缩

宏块

宏块是视频压缩操作的基本单元,把几个像素划分成一个宏块,例如8x8,4x4,4x8,8x4等。

无论是帧内压缩还是帧间压缩,它们都以宏块为单位。

如果图像细节较多,宏块一般要划分更小一些。对于背景细节较少,宏块可以设置大些,这样编码处理会更快。

划分后进行编码,得到数据将会很小,只要得到特定的纹理数据就行了。

宏块划分越仔细,对图像的压缩控制更加有效。

帧内压缩的理论

人对亮度的敏感度超出色度,YUV很容易将亮度与色度分开。

相邻像素差别不大,所以可以进行宏块预测。

进行预测出来的图像,不是直接拿来用,出来图像会有一些模糊,加入帧内预测残差值,得到更加准确的图像。

 

帧内预测残差值

得到的图像数据 = Prediction Mode Info + Resident Picture ,与原始图像对比,还有出现一些色度上的偏差。因为是损压缩,在一定上会有一些误差出现,影响不大。

帧间压缩技术

P帧和B帧压缩。

帧间压缩一定是在同一个GOP进行图像压缩。

  • 参考帧,后面的帧参考前面的帧。记录运动矢量,运动估计(宏块匹配 + 运动矢量),运动补偿(解码 ,加入残差值)
  • 宏块查找 做运动估计,查找宏块,对比两者间的相似性,相似度越高,就认为是目标宏块,并记录对应的宏块的坐标(运动矢量)。
  • 宏块查找算法:三步搜索、二维对数搜索、四步搜索和钻石搜索。

宏块与宏块间,一样有差异,需要加入残差值。解码过程需要其运动矢量和残差值,才能得到与原始图像相近的图像。

问题查找:

视频花屏原因:

GOP分组中有帧丢失,会造成解码端的图像发生错误,这会出现马赛克。运动矢量和残差值都没有,更别说I帧,实际后面的所有数据都无法解码出来。

视频卡顿:

为了避免花屏问题的发生,当发现帧丢失时,就丢弃GOP内的所有帧,直到下一个IDR帧重新刷新图像。

I帧是按照帧周期来的,需要一个比较长的时间周期,如果在下一帧来之前不显示后来的图像,那么视频就静止不动了,这就是出现了所谓的卡顿现象。

经过有损压缩,还不够小,进一步压缩,在经过无损压缩—1、DCT变换:将分散的数据集中起来 2、CABAC压缩 H.264(VLC压缩 MPEG2)。

H264编码流程

编码:

帧内压缩 →帧内预测模式Choose →每个宏块预测模式计算出来→得到推算数据IN 与当前帧对比得到残差值→然后就是无损编码 →经过转换变换→量化 CABAC →拆包→打成NAL头

帧间压缩→经过运动评估ME(对宏块匹配查找) →得到运动矢量 MC→推算出图像数据→得到图片再与当前帧对比得到残差值→经过转换变换→量化 CABAC →拆包→打成NAL头

H264码流

  • NAL层

Network Abstraction Layer ,视频数据网络抽象层,方便网络传输。出现丢包、乱序,NAL层可以起到纠错的功能。

  • VCL层
    Video Coding Layer 视频数据编码层。

VCL结构关系:

一般一个slice对应一个图像。

码流基本概念

  • SODB String Of Data Bits 二进制数据串

帧内编码 帧间编码 熵编码出来的数据 没做任何处理的二进制数据串

原始数据比特流,长度不一定是8的倍数,故需要补齐。它是由VCL层产生的。

  • RBSP Raw Byte Sequence Payload 按字节存储的数据

SODB+trailing bits 一般以8整数倍

算法是如果SODB最后一个字节不对齐,则补1和多个0。

  • NALU

NAL Header(1B)+RBSP

NAL Unit单元

slien数据结构

如果要保存文件,需要加入Startcode,不然播放器不知道每个NAL的分隔符是什么,无法进行解码播放。如果是网络传输,RTP格式不需要startcode

MB data:宏块类型、宏块的预测值和残差值。

 

有关H264基础知识入门的更多相关文章

  1. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  2. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  5. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  6. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  7. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  8. 【网络】-- 网络基础 - 2

    (本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展        是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。    如:有三个人,每个人做的不同的事物,但是是需要协作的完成。    而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据

  9. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  10. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

随机推荐