VCL和NAL
1.VCL只关心编码部分,重点在于编码 算法 以及特定硬件平台的实现,VCL输出的是编码后的纯视频流信息,没有任何冗余头信息。
NAL关心是是VCL的输出纯视频流如何被表达和封包以利于网络传输。
封包目的别人知道怎么传输和解码
(1)SODB:string of Data Bits(2)RBSP:Raw Byte Sequence Payload(3)NALU:Network Abstraction Layer Units
关系:
(4)SODB + RBSP trailing bits = RBSP 最原始的数据是SODB叠加一部分(RBSP头尾信息)(5)NAL header(1 byte) + RBSP = NALU 再加上一个字节的NAL header
NALU是H264文件的基本组成单元,码流信息里面就是有一个个NALU。
如何解码先看NAL header得到信息去分析 RBSP,RBSP去掉RBSP trailing bits得到SODB。
SODB是海思自动生成,VLC播放器可以识别原始码流FFmpeg也可以解码出来。
红色可以看出是I帧,蓝色是P帧。雷神信息更完善, WinHex 打开二进制文件。
h264视频流总体分析
(1)h264标准有多个版本,可能会有差异,具体差异不详
(2)网上看的资料有时讲法会有冲突,或者无法验证的差异
(3)以海思平台为主、为准、为案例,不能保证其他平台也完全一样
(4)海思平台编码出来的H.264码流都是一个序列包含:1sps+1pps+1sei+1I帧+若干p帧(有些海思平台没有B帧)如下图:

这里面的SPS PPS I帧 p帧是一个个的单元。
2.NAL单元
视频长码流持续不可能不分段,借助序列 每个序列有个I帧,一个I帧加上29个p帧就是30帧就是我们的帧率。
相关概念
(1)序列 sequence(2)分隔符 (3个00 和一个01就是H264的分隔符,序列中的每一个都要分隔)有效数据不能超过3个00 如果超过00 00 00第二个00后面加上03
(3)sps NALsize14个字节对上上图的到81(4)pps 4个字节(5)sei 5个字节(6)NALU单元
RTSP保持实时性,只能丢掉pSLICE。所以引入重要性参考级别,数字越大表示越重要这一帧。如下图参考级别为3。
67为SPS后面字节就用SPS解析,整个NALU解析把整个一段序列解析下来解码播放