之前视频基础,有讲到视频的原始数据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. swift5.x基础知识入门

    swift5.x基础知识入门 源码在我的主页下,欢迎下载,我非常喜欢swift和oc的语法,两者相似,我坚信天下没有学不会的技术. 基本介绍 ///这里只介绍一些初学swift的基本概念,需要提前了解 ...

  2. 学习笔记:Java 并发编程①_基础知识入门

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 视频下载: ...

  3. GIS地图基础知识--入门教程

    wenzhanhttp://www.gisbbs.net/viewthread.php?tid=106&extra=page%3D1 GIS地图基础知识--入门教程 GIS 地 图 知 识 1 ...

  4. C语言基础知识入门和C语言入门基础知识大全

    一.C语言基础知识入门 C语言一出现,就以其丰富的功能.强大的表达能力.灵活性.方便性和广泛的应用,在世界范围内迅速普及和普及.C语言不仅高效而且可移植.它可以用来开发应用软件.驱动程序.操作系统等. ...

  5. JavaScript 基础知识 - 入门篇(二)

    11. 函数 11.1 函数的基础知识 为什么会有函数? 在写代码的时候,有一些常用的代码需要书写很多次,如果直接复制粘贴的话,会造成大量的代码冗余: 函数可以封装一段重复的javascript代码, ...

  6. R语言基础知识入门学习(一)

    目录 系列文章目录 一.软件下载 二.基本知识 1. 对象 2. 向量 3. 向量化 4. 因子 总结 系列文章目录 R语言基础知识入门学习(一) 一.软件下载 我们可以通过这个网址对R语言软件进行下 ...

  7. 网络安全基础知识入门!网络安全学习教程

    当我们学习网络安全的时候,需要对它的基础知识做一个简单的了解,这样对以后的学习和工作都会有很大的帮助.本篇文章为大家总结了网络安全基础知识入门的内容,快跟着小编来学习吧. 计算机网络 计算机网络是利用 ...

  8. 计算机网络建设中涉及到哪些硬件,网络基础知识入门

    网络基础知识入门 导语:随着计算机的广泛应用和网络的流行,我们应该要知道一些网络基础知识,下面是小编收集整理的网络基础入门知识,欢迎参考! 计算机网络是什么 这是首先必须解决的一个问题,绝对是核心概念 ...

  9. Python基础知识入门(二)

    Python基础知识入门(一) Python基础知识入门(三) Python基础知识入门(四) Python基础知识入门(五) 一.数字类型 Python 数字数据类型用于存储数值.数据类型是不允许改 ...

最新文章

  1. 万字长文从 0 详解 Istio
  2. CRM系统助力企业找到最大盈利客户
  3. Windows Server 2012 R2配置ISCSI磁盘共享盘(4)
  4. 【正一专栏】巴萨和曼城都那么强了还在买人续约
  5. memcached mysql 性能测试_memcached +mysql+php 测试例子
  6. SQL用户存在则更新不存在则插入
  7. javascript学习系列(15):数组中的lastIndexOf方法
  8. php email,两种PHP邮件发送的方式
  9. 4025-数组的正负排序(C++,双指针法,附思路)
  10. Fedora 11 Beta 跳票了
  11. 魔兽单机服务器修改升级属性,魔兽世界单机版怎么调整人物级别(用户使用)?20分...
  12. GIMP 2.10.24 图片切片
  13. Pycharm 教育版下载/安装 无需注册破解
  14. Kali linux破解Wi-Fi
  15. 限时秒杀┃“探月计划”来袭,美国米德天文望远镜助孩子观月赏月
  16. 在Win32下搭建opengl绘制环境
  17. dubbo-monitor装配、 监控中心 配置过程
  18. 实现单向选择题和多项选择题的选中状态-不使用radio和CheckBox
  19. 整理并记录几种运算放大器
  20. VirtualLab Fusion:基于微软专利的蝴蝶型出瞳扩展光导

热门文章

  1. minicom快捷教程
  2. ubuntu中如何添加源及搜狗拼音的安装
  3. 计算机连接游戏手柄,win7系统怎么连接游戏手柄?wi7校准和设置游戏手柄的教程...
  4. C语言十六进制转换成十进制(代码),可将数组内的十六进制数转换后并存入数组
  5. C++ 使用_beginthreadex创建线程、线程句柄(等待线程关闭)、线程id的作用(发送线程消息)
  6. php深浅拷贝,js实现深浅拷贝方法
  7. 如何设置一个清爽的仿真窗口(仿真工具使用技巧)【Modesim/Questasim】
  8. 修改(My)Eclipse默认的Servlet和jsp代码模板
  9. Facebook AI推出“杂食者”:一个模型解决图像、视频和3D数据三大分类任务,性能还不输独立模型
  10. Hive分区表的使用