• 【音视频】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 01
    	67 二进制:0 11 00111
    	F: 0
    	R: 11
    	T: 00111 = 7  --->表示该NALU单元是序列参数集
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    annexb模式

    H264有两种封装结构

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

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

  • 相关阅读:
    CentOS7常用命令整理
    还在肉眼找bug??赶紧进来!!!程序员一定要学的调试技巧.
    Apollo自动驾驶系统概述(文末参与活动赠送百度周边)
    OCI 发布了容器运行时和镜像规范!
    J-Tech Talk | Python 装饰器指南
    通讯网关软件013——利用CommGate X2ORACLE实现Modbus RTU数据转储ORACLE
    Dubbo3 Triple 协议简介与选型思考
    【嵌入式开发学习】__单片机中容易造成内存泄露的几个痛点
    猿创征文 | 【MyBatisPlus】再见了MyBatis我更喜欢Plus
    2022年你应该知道的5个高级SQL概念
  • 原文地址:https://blog.csdn.net/qq_43537701/article/details/132912844