当前位置: 首页 > news >正文

H264视频压缩格式

H264简介

H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准里称为H.264,
在MPEG的标准里是MPEG-4的一个组成部分-MPEG-4 Part 10,又叫Advanced Video Codec,因此常常称为MPEG-4AVC或直接叫AVC。

压缩算法

帧内编码

解决空间冗余

帧内有空间冗余

一帧图像,每8*8/16*16个像素点划分为一个块;

存储左边上边的像素点+一个预测方向(比如上下左右,平均);

预测方向就是为了解码出其他的像素点,插值算法,类似渐变算法

帧间编码

解决时间冗余

帧间有时间冗余,连续图像必然有大量重复像素(连续画面)

引出I帧、P帧、B帧、GOP序列的概念

在这里插入图片描述

I帧
  • 帧内编码帧

  • 自身可以独立通过解压算法形成一张完整的图片

  • 每个GOP序列的第一个帧

  • 随机访问的参考点

  • 数据量最大

P帧
  • 前向预测编码帧

  • 将当前帧和前I帧、P帧比较,存储前帧没有的宏块,相似宏块记录索引

  • 和I帧相似率25%左右

B帧
  • 双向预测帧

  • 当前帧和I帧、前后P帧比较,存储不相似的宏块,相似宏块记录索引

  • 和I帧相似率75%左右

  • 数据量最少

这样通过双向索引机制,就可以大大提高压缩效率

GOP序列

GOP图像序列 可以理解成一个场景,场景的物体都是相似的
一般都是I帧到下一个I帧之间的所有帧序列

在这里插入图片描述

解码顺序

B帧解码需要等待后一个P帧出来,才能结合I帧+后一个P帧解码出一帧

  • 编码帧顺序:I B … B P B…B

  • 解码顺序:I P B B … B B

播放时会按照pts对帧排序

H264码流结构

H264原始码流是由一个接一个的NALU包组成

在这里插入图片描述
注意:

  • 传输码流之前要带上SPS、PPS,至少要发一次,然后发I帧,不然解码器解不出来

NALU结构

NALU由分割符(00 00 00 01)、头信息、编码数据构成

在这里插入图片描述注意

  • 对于FFmpeg解复用后,MP4文件读取出来的packet是不带startcode,但TS文件读取出来的packet带了startcode

  • 播放MP4文件,其中的H264码流的每个NALU里面必须带startcode才能播放

头信息说明

在这里插入图片描述
T为负荷数据类型,占5bit

nal_unit_type:这个NALU单元的类型,1~12由H.264使⽤,24~31由H.264以外的应⽤

一般只需要关注T的5678即可

在这里插入图片描述

举例:

0x00 00 00 01 67...说明:分隔符:0x00 00 00 0167 二进制:0 11 00111F: 0R: 11T: 00111 = 7  --->表示该NALU单元是序列参数集

annexb模式

H264有两种封装结构

  • 一种是annexb模式,传统模式,有startcode,SPS和PPS是在ES中,就是每个NALU=分割符+头信息+data
  • 一种是mp4模式,一般mp4 mkv都是mp4模式,没有startcode,SPS和PPS以及其它信息被封装在container中,每一个frame前面是这个frame的长度

很多解码器只支持annexb模式,所以如果要解析码流,需要将MP4模式做转换,就是加上分割符和sps+pps

http://www.lryc.cn/news/168661.html

相关文章:

  • 动态的中秋爱心演示送女友用python生成爱心软件文末附c++语言写法
  • macOS - 使用VLC
  • java微服务项目整合skywalking链路追踪框架
  • pandas 笔记: interpolate
  • 应用程序接口(API)安全的入门指南
  • JavaWeb概念视频笔记
  • 网络请求【小程序】
  • python 调用adb shell
  • vue3 使用 vite 构建的项目打包后无法访问
  • C语言指针详解(4)———找工作必看指针笔试题汇总
  • 03MyBatis-Plus中的常用注解
  • Android 修复在 Settings 首页,按键盘方向键逐个单选
  • SpringMvc第六战-【SpringMvcJSON返回异常处理机制】
  • idea-Tabnine
  • 联通面试题
  • [计组03]进程详解2
  • 使用redis+lua通过原子减解决超卖问题【示例】
  • WebFlux异常处理:onErrorReturn和onErrorResume
  • 《动手学深度学习 Pytorch版》 4.5 权重衰减
  • 数据脱敏的风险量化评估介绍
  • SpringCloudGateway网关实战(三)
  • 08在MyBatis-Plus中配置多数据源
  • Centos8安装docker并配置Kali Linux图形化界面
  • 游戏开发初等数学基础
  • svg图片代码data:image/svg+xml转png图片方法
  • 解决问题:Replace `‘vue‘;⏎` with `“vue“;`
  • ThinkPHP 5.0通过composer升级到5.1,超级简单
  • 计算机竞赛 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉
  • 一文了解大模型工作原理——以ChatGPT为例
  • CPP-Templates-2nd--第十九章 萃取的实现 19.7---