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

h264格式分析

h264格式分析

    • 一.简介
    • 二.h264编码原理
      • 1.帧间压缩
      • 2.帧内压缩
    • 三.编码结构
      • 1.IDR帧
      • 2.解码顺序
    • 四.NALU
      • 1.nalu头信息
      • 2.annexb模式

一.简介

  • h264是一种视频编码标准,又叫Advanced Video Codec,即AVC

二.h264编码原理

1.帧间压缩

通过I、B、P帧实现帧间压缩

  • I帧(帧内编码帧),通常是每个 GOP(MPEG 所使⽤的⼀种视频压缩技术)的第⼀个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是⼀个图像经过压缩后的产物,⾃身可以通过视频解压算法解压成⼀张单独的完整的图⽚
  • P帧(前向预测编码帧),通过充分将低于图像序列中前⾯已编码帧的时间冗余信息来压缩传输数据量的编码图像。需要参考其前⾯的⼀个I frame 或者P frame来⽣成⼀张完整的图⽚
  • B帧(双向预测帧),既考虑与源图像序列前⾯已编码帧,也顾及源图像序列后⾯已编码帧之间的时间冗余信息来压缩传输数据量的编码图像

2.帧内压缩

视频是由单张图片帧组成,而图片帧之间的像素块存在相似性质,所以可以进行相似比较和压缩编码

三.编码结构

h264编码的层级结构从大到小为:序列(gop)、图⽚(pictrue)、⽚(slice)、宏块(macroblock)、⼦块(subblock)

  • GOP(图像组)主要⽤作形容⼀个IDR帧到下⼀个IDR帧之间的间隔了多少个帧
  • picture(图片)等同于帧,H264将视频分为连续的帧进⾏传输,在连续的帧之间使⽤I帧、P帧和B帧
  • 单张图片继续分为片、宏块、子块

1.IDR帧

  • ⼀个序列的第⼀个图像叫做 IDR 图像(⽴即刷新图像),IDR图像都是I帧图像,但I帧不一定是IDR帧
  • I帧不⽤参考任何帧,但是之后的P帧和B帧是有可能参考这个I帧之前的帧,IDR帧不允许这样
  • 核⼼作⽤:为了解码的重同步,当解码器解码到 IDR 图像时,⽴即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始⼀个新的序列。这样,如果前⼀个序列出现重⼤错误,在这⾥可以获得重新同步的机会

2.解码顺序

帧的解码顺序和帧在原始视频中的顺序并不相同

  • 解码顺序:DR1 P4 B2 B3 P7 B5 B6 I10 B8 B9
  • 原始视频:DR1 B2 B3 P4 B5 B6 P7 B8 B9 I10

四.NALU

  • h264原始码流(裸流)是由⼀个接⼀个的NALU组成,一个帧可能有多个NALU表示
  • ⼀个原始的H.264 NALU单元通常由 StartCode + NALU Header + NALU Payload 三部分组成,其中 Start Code ⽤于标示这是⼀个NALU 单元的开始,必须是0x00000001或0x000001
  • 3字节的0x000001只有⼀种场合下使⽤,就是⼀个完整的帧被编为多个slice(⽚)的时候,包含这些slice的NALU使⽤3字节起始码,其余场合都是4字节0x00000001

1.nalu头信息

nalu header {F 1bitR 2bitT 5bit
}
  • F为禁⽌位,forbidden_zero_bit:H.264规范中规定了这⼀位必须为0
  • R为重要性指示位,nal_ref_idc:取00~11,取值越⼤,表示当前NAL越重要,需要优先受到保护。如果当前NAL是属于参考帧的⽚,或是序列参数集,或是图像参数集这些重要的单位时,必需⼤于0
  • T为负荷数据类型,nal_unit_type:1~12由h264使⽤,24~31由h264以外的应⽤使⽤
    • 5表示IDR的slice
    • 6表示SEI(辅助增强信息)
    • 7表示sps(序列参数集)
    • 8表示pps(图像参数集)

2.annexb模式

H264有两种封装格式,很多解码器只⽀持annexb这种模式,因此需要将mp4做转换,在ffmpeg中⽤h264_mp4toannexb_filter可以做转换

  • annexb模式,传统模式,有startcode,SPS和PPS是在ES中
  • mp4模式,⼀般mp4和mkv都是mp4模式,没有startcode,SPS和PPS以及其它信息,被封装在container中,每⼀个帧前⾯4个字节是这个frame的⻓度
http://www.lryc.cn/news/36097.html

相关文章:

  • 【数据分析师求职面试指南】实战技能部分
  • 树与二叉树(二叉树的表示,性质,遍历,还原)
  • mysql 源码学习理解记录--lock_rec_move
  • markdown(.md)常用语法
  • 千言数据集赛题介绍
  • 信息技术最全总结(备考教资)
  • opencv识别车道线(霍夫线变换)
  • MySQL的同步数据Replication功能
  • 2023年全国最新高校辅导员精选真题及答案17
  • 中文代码92
  • Python SEO采集海量文本标题,用倒排索引找出“类似的标题“代码实现
  • 模型杂谈:快速上手元宇宙大厂 Meta “开源泄露”的大模型(LLaMA)
  • RedisCluster集群模式下master宕机主从切换期间Lettuce连接Redis无法使用报错Redis command timed out的问题
  • Xuetr杀毒工具使用实验(28)
  • fastapi(https)+openssl+测试(双向校验)
  • TiDB Server
  • S3C2440移植Linux4.19.275内核以及过程中遇到的问题
  • 解忧杂货铺(二):UML时序图
  • 微信小程序的代码由哪些结构组成?
  • Cloud Kernel SIG月度动态:发布 ANCK 新版本及 Plugsched v1.2.0
  • Jedis 使用详解(官方原版)
  • 关于Pytorch中的张量学习
  • 基于Transformer的目标检测算法学习记录
  • 嵌入式学习笔记——使用寄存器编程实现按键输入功能
  • 打卡小达人之路:Spring Boot与Redis GEO实现商户附近查询
  • Apache HTTP Server <2.4.56 mod_proxy_uwsgi 模块存在请求走私漏洞(CVE-2023-27522)
  • JUC并发编程设计模式
  • HTTPS加密解析
  • Python每日一练(20230309)
  • 哈希表题目:数组的度