H264码流结构

H264 编码之后 输出的结果就是 H264码流,既可以保存为一个多媒体文件,也可以通过网络进行传输。

在这里插入图片描述

第一层:NAL 网络抽象层,用于在网络上传输视频流的协议层。属于最外层。
如果没有NAL层,我们在网络上传输二进制数据,不论是音频还是视频数据,如果出现乱序 重传 丢包,是没办法纠错的。NAL 层的主要作用就是用于纠错。请注意 他并不能阻止乱序 丢包 重传等问题,但是接收方可以根据NAL判断出 数据有没有乱序 丢包 重传等问题,并作出相应的反应。比如发生丢包,那接受当就可以会用NAL 分辨出丢了哪个包,并通知发送发重传该包。如果是乱序了,那接收放可以根据NAL层的序号,重新进行排列。

第二层:VLC层 视频数据编码层(帧内编码 帧间编码 …),属于内层。

在这里插入图片描述

上面是编码后的一帧一帧的视频帧,而每一个视频帧由众多 slice组成,但是实际上 一般都是 一张图片对应一个 slice,即一个视频帧对应一个slice,然后继续分成若干宏块。

结构
一个视频由很多帧组成,帧也可以叫做 压缩后的图像,每个帧由一个或多个 slice组成,每个silce由多个宏块组成。

在这里插入图片描述

SODB :二进制数据串,原始数据比特流,由VCL视频数据编码层产生的未做任何处理的二进制比特流,这个数据流都是按位 码在一起,之所以这样按位罗列数据,是为了更好的压缩 压缩的更紧密,并不是按字节,如果是按照字节,那么有可能有浪费,比如第一个字节只用了三位,第二个字节只用了5位等等,浪费空间。所以原始数据比特流 是按位罗列,就导致了 数据串的长度 不一定是8的整数倍,即不一定是按字节对齐的。

RBSP :按字节存储的原始数据
为了方便处理数据,将原始数据比特流 按照字节存储

NALU :网络抽象层协议头 + 按字节存储的原始数据

在这里插入图片描述
上面是 NAL 网络协议层,下面是VCL视频数据编码层(Slice Data 就是由宏块组成)

在这里插入图片描述
在这里插入图片描述

Slice Data(一般都是一帧图像数据)
	MB: 宏块
		mb_type  宏块类型
		mb_pred 宏块预测值(对于帧内 有9种预测模式 对数据进行预测)
		codel residual  残差值

在这里插入图片描述

一般H264码流 分为两种格式:

Annexb格式 : 在文件中保存的,特种是 每一个NAL单元前面都有一个 StartCode(起始码))

RTP格式 : 在网上传输,不包含 StartCode(起始码),直接传输 NAL 单元。如果想把RTP格式保存成文件,需要有一个 StartCode(起始码),有了 StartCode(起始码)之后 ,播放器才可以正常的播放。如果没有 StartCode(起始码),那么播放器将不知道 每一个NAL单元之间的分隔符是什么,没办法解码。所以是文件的话 要加 StartCode(起始码),如果是为了网络传输,就用RTP格式 不加 StartCode(起始码)

每一个 NAL单元 = NAL头(一个字节) + 数据
数据 = 视频帧数据头 + 视频帧数据 Slice Data (当一个slice 代表一个视频帧的时候)
视频帧数据 Slice Data = 宏块 + 宏块 + 宏块
宏块 = mb_type 宏块类型 + mb_pred 宏块预测值 + codel residual 残差值

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux老A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值