音视频专题-基础

本文深入介绍了视频编码中的H264标准,强调了其在压缩和传输视频数据中的重要性。H264通过去除时间与空间冗余实现高效编码,利用宏块进行帧间预测,降低数据量。文章还提到了YUV色彩空间在视频编码中的应用,以减少数据传输需求。此外,讨论了NALU和RBSP等在网络传输中的作用,以及SPS和PPS在解码过程中的功能。最后,对比了RGB和YUV,说明YUV在存储和传输效率上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 基础扫盲:

什么是H264?

定义对摄像头采集的每一帧视频需要进行编码,由与视频中存在空间和时间的冗余, 需要用算法来去除这些冗余。H264是专门去除这些冗余的算法,我们把这种算法称为H264编码。

H264是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称。

应用: 像大多数看到的视频,如rmvb   avi   mp4   flv   大都是由h264进行编码

当然也会有不同的 如 mpeg4   vp9   这样比较冷门的编码。

无论h264  mpeg4  vp9 都是基于宏块的方式进行编码,原理是一样的,只不过实现的算法

不一致罢了。

两大电信联盟    ---国际电信联盟(ITU-T),国际标准化组织(ISO)

 其他关于编码的发展历史这里就过多叙述了。

为什么需要对视频进行编码

从上图可以看到视频帧是连续且有关联的,如果每一帧都原封不动的保持,数据量是非常庞大,早起的电影院中,一个胶卷30kg,可见保存视频数据非常难。除了存储困难,这么大的数据量如果走网络传输,也会非常的慢。

编码  =  压缩

3 视频中哪些地方可以进行压缩

 帧分组

对于视频数据主要有两类数据冗余,一类是时间上的数据冗余,另一类是空间上的数据冗余。其中时间上的数据冗余是最大的。下面我们就先来说说视频数据时间上的冗余问题。

为什么说时间上的冗余是最大的呢?假设摄像头每秒抓取30帧,这30帧的数据大部分情况下都是相关联的。也有可能不止30帧的的数据,可能几十帧,上百帧的数据都是关联特别密切的。

对于这些关联特别密切的帧,其实我们只需要保存一帧的数据,其它帧都可以通过这一帧再按某种规则预测出来,所以说视频数据在时间上的冗余是最多的。

 

通过宏块扫描与宏块搜索可以发现这两个帧的关联度是非常高的。进而发现这一组帧的关联度都是非常高的。因此,上面这几帧就可以划分为一组。其算法是:在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内,我们认为这样的图可以分到一组。

在这样一组帧中,经过编码后,我们只保留第一帖的完整数据,其它帧都通过参考上一帧计算出来。我们称第一帧为IDR/I帧,其它帧我们称为P/B帧,这样编码后的数据帧组我们称为GOP。

音视频组成

视频编码原理

 DSP芯片主要做视频编解码器的工作

 H264编码规则

• 在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内    所以对于一段变化不大图像画面,我们可以先编码出一个完整的图像帧A,
•随后的B帧就不编码全部图像,只写入与A帧的差别,这样B帧的大小就只有完整帧的1/10或更小!    B帧之后的C帧如果变化不大,我们可以继续以参考B的方式编码C帧,这样循环下去。 
•  这段图像我们称为一个序列:序列就是有相同特点的一段数据    当某个图像与之前的图像变化很大,无法参考前面的帧来生成,那我们就结束上一个序列,开始下一段序列    也就是对这个图像生成一个完整帧A1,随后的图像就参考A1生成,只写入与A1的差别内容.

 H264数据流

                除了I/P/B帧外,还有图像序列GOP

                GOP图像序列 可以理解成一个场景,场景的物体都是相似的

                GOP:两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧。

        如图所示

 H264编码

 

H264编码传输

编码 的目的是为了方便传输 ( 传输指  文件传输,网络流传输 ) 我们并不能把一整帧 传输过去, 一帧的内容太大了
还需要细分才能更方便的传输。如果通过传递一完整帧传过去,对方等的花都谢了。所以我们需要更小的传输单元以保证  更好的压缩性,容错性和实时观看性

H264码流组成 

*组成H264码流的结构中 包含以下几部分 ,从大到小排序依次是** 

> **H264视频序列,图像,片组,片,NALU,宏块 ,像素。** 

NALU单元设计

NAL层:(Network Abstraction Layer,视频数据网络抽象层):  它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节,而H264的帧往往会大于1500字节,所以要进行拆包,将一个帧拆成多个包进行传输,所有的拆包或者组包都是通过NAL层去处理的。

•H.264 原始码流(又称为裸流),是有一个接一个的 NALU 组成的。

 NALU = NALU头 + RBSP  (切片),每个单元都按独立的NALU传送。

RBSP单元

每个单元都按独立的NAL单元传送。单元的信息头(一个字节)定义了RBSP单元的类型,NAL单元的其余部分为RBSP数据。

切片由来

把一张图片划分成若干个小的区域,这些小的区域称之为宏块

H264默认是使用 16X16 大小的区域作为一个宏块,也可以划分成 8X8 大小。

若干个连续性的宏块 组成了切片

音视频编码中的spspps的设计

SPS PPS ,包含了初始化 H.264 解码器所需要的信息参数, 包括编码所用的 profile level ,图像的宽和高, deblock 滤波器等
SPS: 序列参数集
PPS :图像参数集
H264 码流中 , 都是以 "0x00  0x00 0x01" 或者 "0x00 0x00 0x00 0x01" 为开始码的 , 找到开始码之后 , 使用开始码之后的第一个字节的低 5 位判断是否为 7( sps ) 或者 8( pps ), data[4] & 0x1f == 7 || data[4] & 0x1f == 8. 然后对获取的 nal 去掉开始码之后进行 base64 编码 , 得到的信息就可以用于 sdp.sps pps 需要用逗号分隔开来

为什么采用YUV而不采用RGB 

Rgb 原理 : 定义 RGB 是从颜色发光的原理来设计定的,由红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和(两盏灯的亮度嘛!),越混合亮度越高,即加法混合。 RGB24 是指 R G B 三个分量各占 8
Yuv 原理 YUV 主要用于优化彩色视频信号的传输,与 RGB 视频信号传输相比,它最大的优点在于只需占用极少的频宽( RGB 要求三个独立的视频信号同时传输)其中 “ Y” 表示明亮度也就是灰阶值;而 “ U” 和 “ V” 表示的则是色度.

 NV21编码

1920*1080的一帧图片,经过yuv的方式排列

0      ~  1920*1080              全部是Y

后面是 u 和的交替变换

YUV I420编码

1920*1080的一帧图片,经过yuv的方式排列

 0      ~  1920*1080              全部是Y

1920*1080  ~  1920*1080+ 1920*1080/4全部是u

1920*1080+ 1920*1080/4 ~ 一帧末尾   全部是v

 结语:音视频后面的内容更精彩。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值