H264编码原理(H264码流)

H264码流

H264码流分层

  • NAL层 Network Abstraction Layer,视频数据网络抽象层

    在H264的整个分层中,第一层称为NAL层,这一层的作用主要是方便我们在网络上传输视频流。因为在网络上传递数据时,经常有丢包、延迟、乱序等现象,
    而NAL层可以在接受段检测出这种不同的异常情况,然后进行处理,否则仅仅只是以byte数组进行传递时,一旦发生这种异常情况,我们是没有好的解决方法等。
    例如丢包了,监测到后就可以知道丢了哪个包,可以让对方重新传输一个。
    如果是乱序了,可以根据NAL层进行重新排序,NAL层虽然并没有直接序号,真正的序号是在RTP层,但是NAL层是知道包的起始和结束的,当知晓起始和结束后,配合RTP数据包的序号就可以知道这个数据在前面和后面。

  • VCL层 Video Coding Layer,视频数据编码层

    这其实就是之前说的那些帧内编码、帧间编码等等产生的所有数据。

VCL结构关系

在这里插入图片描述
在视频帧内,每一幅图都是由许多的slice(片)组成的图片,也可以说是一幅图片是可以分很多slice的,在官方文档上这么叙述的。
在很多情况下,可能一个slice就对应整个图像,除非强制分成很多个slice。
每一个slice都是由很多小块组成的,每个小块都是宏块。

码流的基本概念

  • SODB (String Of Data Bits) 二进制数据串

    原始数据比特流,长度不一定是8的倍数,故需要对齐,它是由VCL层产生的。

  • RBSP (Raw Byte Sequence Payload) 按字节存储的原始数据

    SODB + trailing bits
    算法是如果SODB最后一个字节不对齐,则补1和多个0
    例如后面缺三位,则补一个1和两个0

  • NALU NAL单元

NAL Header(1B)+ RBSP

NAL Unit

在这里插入图片描述

H264切片

在这里插入图片描述
在规范中一个图像是可以很多slice,但是实际上一般只有一个,偶尔有两个,不会有很多的slice。

Slice 与 MacroBlock

在这里插入图片描述
MB部分指的是宏块,

mb_type 宏块类型
mb_pred 宏块预测值
coded residual 残差值

再次回顾码流分层

在这里插入图片描述
只是在网上传输时不包括StartCode,只传输NAL单元即RTP格式。
所以当涉及到将码流保存进图片时,需要加一个StartCode,只有这样播放器才可以将它正常播放出来。
存储文件时使用annexb格式,即StartCode+NAL单元
只网络传输时使用RTP格式,即只传输NAL单元

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值