H264基础知识入门

news2024/11/16 11:26:26

之前视频基础,有讲到视频的原始数据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:宏块类型、宏块的预测值和残差值。

 

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

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

相关文章

数字IC设计之——低功耗设计

目录 概述 背景 为什么需要低功耗设计 CMOS IC功耗分析 基本概念 功耗的分类 功耗相关构成 不同层次低功耗设计方法 芯片中的功耗分布以及对应的低功耗方案 低功耗方案 系统算法级的低功耗技术 编码阶段的低功耗技术 门控时钟 Clock Gating 物理实施的低功耗技术 操作数分离&am…

【第六部分 | JavaScript高级】1:面向对象

目录 【第一章】面向对象 | Class创建、构造函数、方法 | Class继承 | 三个注意点 | 静态成员 | 原型对象 __ _proto___ | 类的本质 【第一章】面向对象 | Class创建、构造函数、方法 创建类 class name {// class body }var xx new name() 构造函数 class Person {co…

【Godot】数据响应的方式执行功能

Godot Engine 版本:4.0 beta 6 下载地址:Index of /godotengine/4.0/beta6/ (downloads.tuxfamily.org) 在这个教程中,学会理解以数据为主的进行处理执行逻辑的代码编写方式,虽然看似简单,但是确是方便又好用。 以及下…

Git使用教程

Git项目的三个工作区域的概念: 1、Git仓库Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。 2、工作目录工作目录是对项目的某个版本独立提取出来的内容…

Ansible之 AWX 创建管理项目的一些笔记

写在前面 分享一些 AWX 创建管理项目的笔记博文内容涉及: 容器化 AWX 手工创建项目Demo通过 SCM 创建项目 Demo项目角色,更新策略介绍,SCM 凭据的创建 食用方式: 需要了解 Ansible理解不足小伙伴帮忙指正 傍晚时分,你坐…

ssm项目改造spring boot项目

快速创建 Spring Boot 项目 添加依赖 如果是普通 Maven 项目&#xff0c;需要手动添加。 <!-- 打包方式 jar 包 --> <packaging>jar</packaging><!-- 指定父工程 --> <parent><groupId>org.springframework.boot</groupId><ar…

操作系统学习笔记(Ⅰ):概述

目录 1 操作系统概念 1.1 定义 1.2 功能 1.系统资源的管理者 2.用户和计算机硬件间接口 3.最接近硬件的层次 2 操作系统的特征 2.1 并发 2.2 共享 2.3 虚拟 2.4 异步 3 发展和分类 3.1 手工操作阶段 3.2 批处理阶段 1.单道批处理阶段 2.多道批处理系统 3.3 分…

启明欣欣STM32开发板闪烁LED实验

最近在咸鱼上买了一块启明欣欣的STM32板子&#xff0c;准备在上面测试open62541和CANopen&#xff0c;到货后如下图&#xff0c; 找商家要了资料&#xff0c;然后运行一个LED灯的实验来简单测试下板子&#xff0c;本文记录一下这个过程。 一 准备 安装Keil 5.35&#xff0c;安…

【selection】 学习光标API并实现编辑区插入表情图片的功能

目录场景介绍selection介绍selection APIrange 介绍range API实现编辑区插入表情图片参考资料场景介绍 在写web版聊天器时&#xff0c;遇到一个需求&#xff1a; 聊天时用户可以在编辑区加入表情图片&#xff0c;并且表情图片要插入在光标位置。// *web版聊天器地址&#xff…

useMemo 使用误区

文章の目录问题背景useMemo 使用前后组件性能对比结论问题背景 在某一个h5项目中&#xff0c;使用了 useMemo 对项目中的组件进行优化&#xff0c;减少组件不必要的re-render, 优化后的结果&#xff1a; 在组件的props和状态未改变时&#xff0c;组件不再进行 re-render 表面上…

生意不好如何逆风翻盘 | 多门店经营必读技巧(1):导购管理 连锁店管理的技巧 连锁店生意经 如何做导购管理

很多连锁店老板反馈&#xff0c;为了优化门店的销售业绩&#xff0c;什么方法都试过了&#xff0c;改店铺陈列、搞优惠活动、做会员管理.......为什么分店的业绩还是看不到明显的提升&#xff1f; 方法试过了&#xff0c;结果没变化&#xff0c;那只能是执行这块出了问题&#…

量子计算(八):观测量和计算基下的测量

文章目录 观测量和计算基下的测量 一、观测量 二、计算基下的测量 三、投影测量 观测量和计算基下的测量 一、观测量 量子比特&#xff08;qubit&#xff09;不同于经典的比特&#xff08;bit&#xff09;&#xff0c;一个量子比特|>可以同时处于|0>和|1>两个状态…

Linux从入门到精通(八)——Linux磁盘管理

文章篇幅较长&#xff0c;建议先收藏&#xff0c;防止迷路 文章跳转Linux从入门到精通&#xff08;八&#xff09;——Linux磁盘管理goLinux从入门到精通&#xff08;九&#xff09;——Linux编程goLinux从入门到精通&#xff08;十&#xff09;——进程管理goLinux从入门到精…

C++ 结合mysql写一个服务端

1 libhv和mysql libhv是一个跨平台的C网络库。 mysql是一个关系型数据库。 2 下载MySQL&#xff0c; 最好不要下载高版本的&#xff0c;容易出错&#xff01;&#xff01;&#xff01; 下载地址MySQL 下载好后目录是这样的&#xff1a; 然后在环境变量里配置&#xff1a;…

Hive 3.1.3

1.下载安装包 Index of /hive/hive-3.1.3https://dlcdn.apache.org/hive/hive-3.1.3/ 2.安装&修改配置文件 2.1 安装MySQL a. 搜索centos7默认的mariadb & 卸载 [root@node1 ~]# rpm -qa | grep mariadb mariadb-libs-5.5.44-2.el7.centos.x86_64 卸载 [r…

【计算机组成原理Note】5.4.2 控制器-微程序

5.4.2 控制器-微程序 硬布线工作原理&#xff1a;微操作控制信号由组合逻辑电路根据当前的指令码、状态和时序&#xff0c;即时产生微程序工作原理&#xff1a;事先把微操作控制信号存储在一个专门的存储器(控制存储器)中&#xff0c;将每一条机器指令编写成一个微程序&#xf…

差钱吗?周杰伦线上演唱会没关打赏惹争议,看看同时直播的腾格尔

随着世界杯的到来&#xff0c;全球都进入了世界杯时间&#xff0c;音乐领域的明星们&#xff0c;都以各种形式欢迎世界杯的到来。在世界杯开幕的前一晚上&#xff0c;著名音乐人周杰伦&#xff0c;在某手平台开启了线上演唱会&#xff0c;吸引了众多人前来围观。 据不完全统计&…

【正点原子FPGA连载】 第七章 Verilog HDL语法 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第七章 Verilog …

【计组】入门篇 --《深入浅出计算机组成原理》

课程链接&#xff1a;深入浅出计算机组成原理_组成原理_计算机基础-极客时间 目录 一、为什么需要学习计算机组成原理 二、冯诺依曼体系结构&#xff1a;计算机组成的金字塔 1、计算机的基本硬件组成 2、冯诺依曼体系结构 三、通过CPU主频谈性能 1、什么是性能 2、计算…

【微信早安定时推送消息】微信公众号定时推送早安消息 带天气、纪念日、生日、定时推送等(完整代码)

我挥舞着键盘和本子&#xff0c;发誓要把世界写个明明白白。 简介 利用所学知识给他/她一个惊喜&#xff0c;是作为计算机专业的你最大的乐趣。 无计算机基础&#xff0c;5分钟即设置好 &#xff08;定时推送 及 最新版 将在下期带来&#xff09; 获取完整代码&#xff0c;关注…