H.264初识

        H.264作为视频深度压缩的一个标准,也称之为高级视频编码(Advanced Video Coding,简称 AVC),已经广泛应用了很多年,已经是一个通用标准。本文主要描述H.264的格式,不深入分析编解码原理,更偏向应用。对一些基础概念会做简单介绍,不做深入讲述。

1、分辨率

        分辨率是用来衡量图像的大小,通常用像素表示,有宽高两维数据,例如1920x1080,表示宽度为1920像素,高度为1080像素。

2、码率

        码率,用来衡量经过H.264(或者其他压缩算法)压缩之后的码流大小,单位bps,表示一秒有多少bit。码流越低,表示压缩率越高,图像损失越多,质量就越差。码率也不是越大越好或者越小越好,取决于应用场景,一般图像视频经过压缩后的应用主要两种,一种是存储,一种是传输。所以需要根据应用场景对压缩质量的要求,以及场景中网络传输带宽和存储容量的要求取一个适中的码率。

        所有压缩算法都有一个目标,最小的码率+最小的图像损失。(当然也需要考虑算法的复杂度和延迟,这些对软硬件资源都有要求)

3、图像表示方式

        计算机的内存保存一张图像,是以什么格式?压缩算法通过对这样一段内存数据(图像)经过压缩后,变成另一个更小的内存格式(也就是h264)。现在先来看看在压缩之前的内存长什么样。

        一张1920x1080的图像,表示有1920*1080个像素,每个像素都可能不同颜色。

3.1、RGB

        对应应为Red、Green、Blue,也就是红绿蓝三色(也称之为3通道),任何颜色都可以用红绿蓝叠加。所以该格式,每一种颜色划分256等级(也就是8bit),那么一个像素就是由三个8bit数字表示,也就是我们常说的RGB888,那么一个像素就有3x8bit,可以表示16777216种颜色。同理,有些对要求不高的就会RGB565、RGB332等。另外有一种RGBA8888,多了一个通道A,也是8bit,表示透明度。

3.1、YUV

        YUV 图像是一种将图像亮度(Y)和颜色(U、V)分离的数字图像格式。

  • Y(亮度):表示图像的亮度信息,通常是灰度值,影响图像的明暗程度。
  • U(蓝色差分量):表示蓝色与亮度的差异,反映蓝色的强度。
  • V(红色差分量):表示红色与亮度的差异,反映红色的强度。

常见的YUV格式有:

  • YUV420:每4个Y分量共享1个U和1个V分量,常用于视频压缩(如MPEG和H.264)。
  • YUV422:每2个Y分量共享1个U和1个V分量,适合需要更高质量的视频。
  • YUV444:每个Y分量都有对应的U和V分量,提供最高的色彩保真度,但文件大小也最大。

为什么要有420、422,其实和RGB565类似,为了减小数据量,和图像处理对系统资源的消耗,虽然带来图像失真,但是在有限资源下,能满足一些对图像清晰度要求低的厂家。

3.2、小结

        视频处理领域,大部分遇到也就上述两类了,其他RAW先不介绍了,一般用于传感器的数字图像。

        从上述来看,不管哪种格式,内存中存储的图像数据,是没有类似一些协议有数据头、结束符等格式,就是一块无差别的数据内存。如果一堆图片数据存储在一个文件中,需要根据图像格式、分辨率大小来计算一张图片的内存量X,从而一次取X数据量就是一张数据。也有一些软件用来显示图像,可以用来分析图像是否正确。YUVviewer:GitHub - IENT/YUView: The Free and Open Source Cross Platform YUV Viewer with an advanced analytics toolset

4、H264介绍

        一般讲到H264是指压缩算法,也用来描述压缩后的H264数据,数据用于传输或者存储,H264有严格的格式。

4.1、格式

        先来说明格式,这个大家再读取h264文件或者接收网络报文时候,可以根据该格式来获取一个完整的帧数据(一个图像压缩后的数据称之为一帧)。

        一个H264视频除了一帧帧的数据,还有其他用来表示这个视频的一些参数数据(SPS、PPS)。整体一个H264是由多个NAL组成。一个NAL组成:START CODE、NALU HEADER、RBSP:

  • START CODE :00 00 00 01 代表一个NALU的开始
  • NALU HEADER:紧跟在start code后面的一个字节 ,其各个bit的含义如下

以下举一个例子:

这段NAL开头数据00 00 00 01 67,其中0x67 0110 0111,从左往右开始数,表示一个SPS的NAL,大家可以自己按上述表格来对应算一下。当然关于NAL解析已经有很多流媒体开源代码了,像ffpmpeg、zlmediakit,大家可以自己搜一下,不需要自己重复造轮子。

4.2、SPS、PPS

        SPS和PPS的NAL一般位于码流开始位置,用于决定接下来的码流的参数,告诉使用者如何设定渲染、解码等参数。通过SPS、PPS可以解析出码流的分辨率、压缩等级等。SPS、PPS的格式比较复杂,不展开讨论。

4.3、GOP、IDR、I、P、B

        GOP表示一组参考帧,由于H264属于帧间压缩算法,也就是每一帧压缩通过前后参考来减少冗余数据,提高压缩率。而GOP表示一组前后有关联的视频帧,一般GOP取30,而第一帧一般是I帧或者IDR帧,IDR帧表示理解刷新,前后都不参考,根据自己IDR帧的数据就可以解码出完整图像,是为了避免出现丢包导致解码参考出现失真,并不断传播影响到后续所有数据。IDR一定是I帧,但I帧不一定是IDR帧。他们的共同点是他们都不需要参考别人即可解码,而差别是I帧之后的B帧数据有可能去参考I帧之前的P帧,但IDR之后的帧不会跨越IDR之前的数据做参考。

  解码器遇到IDR帧,就会清除前面的参考帧数据。

        P帧即表示需要参考前面的帧才能解码。B帧表示需要参考前面、后面的数据来解码。所以带B帧的一般质量下码流更低,但因为要参考后面的P帧,所以还需要等待,延迟较大,对延迟不敏感的场景更合适。

        更深入的格式,如Slice、宏块,就不展开了,大部分场景用不上。大致分层结构如下图,有兴趣可以结合压缩算法原理更深入研究。

参考

H264数据格式解析_h264编码数据-CSDN博客

文中图片来自网络,如有侵权,联系删除!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zcqiang_zh

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

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

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

打赏作者

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

抵扣说明:

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

余额充值