ios音视频--H264结构与码流

H264结构

我们通过H264压缩技术得到了一帧帧的H264视频帧, 每一个视频帧实际上是一个结构化的东西, 我们看下面这个图:

H264结构图

这张图的最上面是一串压缩后的视频帧序列, 我们取其中的一帧, 我们可以看到, 每一帧(或者说图像)都是由多个片组成, 每一个片都是由一个个宏块组成, 每一个宏块又可以分成多个子块, 这就是一个H264帧的结构.

H264编码分层

H264在编码的时候分成了两层: NAL层和VCL层

NAL层

NAL层(Network Abstraction Layer, 视频数据网络抽象层). 它的作用是拆包和组包, 我们编码的H264最终要在网络上进行传输, 以太网的传输单元是每个包不能超过1500个字节, 而H264的帧往往大于1500字节, 所以我们需要对它进行拆包, 讲一个帧拆成多个包进行传输. 所有的拆包和组包都是通过NAL层去处理的.

VCL层

VCL层 (Video Coding Layer, 视频数据编码层). 它的作用就是对视频原始数据进行压缩.

码流的基本概念

SODB (String of Data Bits, 原始数据比特流), 因为它是流, 所以它的长度不一定是8的整数倍. 它是由VCL层产生的, 因为它不是8的整数倍所以处理起来比较麻烦

RBSP (Raw Byte Sequence Payload, SODB + trailing bits) 算法是在SODB最后一位补1, 不按字节对齐补0, 如果补齐0, 不知道在哪里结束, 所以补1, 如果不够8位则按位补0.

EBSP (Encapsulate Byte Sequence Payload) 就是生成压缩流之后, 我们还要在每个帧之前加一个起始位, 起始位一般是十六进制的0001. 但是在整个编码后的数据里, 可能会出来连续的2个0x00. 那这样就与起始位产生了冲突, 这应该怎么处理呢? H264规范里说明了处理2个连续的0x00, 就额外增加一个0x03, 这样就能预防压缩后的数据与起始位产生冲突.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表...
    yeying12321阅读 9,047评论 0 6
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 10,869评论 0 9
  • 作者:July、wuliming、pkuoliver 说明:本文分为三部分内容,第一部分为一道百度面试题Top K...
    cyj_ya阅读 4,264评论 0 0
  • HASH 现在在处理App的用户敏感信息方面,大部分都是采用HASH加密的方式来进行处理。 关于哈希算法 详细看这...
    Phant阅读 13,954评论 0 0
  • 迈腾今天晚上着车了,在打车时,油管和气管搞混了,迟疑了半天,还是那么装上了,打不着,发现不对,倒过来,着车了,但是...
    京心达查晓旭阅读 1,333评论 0 0

友情链接更多精彩内容