RK3568平台(camera篇) H264编码

一.编码基础概念

视频是由一帧帧图像组成,就如常见的gif图片,如果打开一张gif图片,可以发现里面是由很多张图片组成。一般视频为了不让观众感觉到卡顿,一秒钟至少需要16帧画面(一般是30帧),假如该视频是一个1280x720分辨率的视频,那么不经过编码一秒钟的大小:

结果:1280x720x60≈843.75M

所以不经过编码的视频根本没法保存,更不用说传输了。

视频编码其本质就是将数据压缩,主要是去除冗余信息(包括空间上的冗余信息和时间上的冗余信息),从而实现数据量的压缩。

空间冗余: 在同一图像(帧)内,相近像素之间的差别很小(甚至是相同的),所以就可以用一个特定大小的像素矩阵来表示相邻的像素。
时间冗余: 视频中连续的图像(帧)之间,其中发生变化的像素占整张图像像素的比例极其微小,所以就可以用其中一帧来表示相邻的帧来减少带宽消耗。
编码冗余: 不同像素出现的概率不同,所以就可以为出现概率高的像素分配尽量少的字节,对出现概率低的像素分配尽量多的字节。
视觉冗余:人眼对很多像素颜色不敏感,所以就可以丢弃这些冗余的信息而并不影响人眼观看的效果。
知识冗余:有许多图像的理解与某些基础知识有相当大的相关性。例如,人脸的图像有固定的结构,嘴的上方有鼻子,鼻子的上方有眼睛,鼻子位于正面图像的中线上等等。这类规律性的结构可由先验知识和背景知识得到,我们称此类冗余为知识冗余。根据已有知识,对某些图像中所包含的物体,可以构造其基本模型,并创建对应各种特征的图像库,进而图像的存储只需要保存一些特征参数,从而可以大大减少数据量。

二.H264帧类型

I 帧 :关键帧,采用帧内压缩技术。你可以理解为这一帧画面的完整保留,解码时只需要本帧数据就可以完成(因为包含完整画面)。
P 帧 :向前参考帧,在压缩时,只参考前面已经处理的帧。采用帧间压缩技术。P 帧表示的是这一帧跟之前的一个关键帧(或 P 帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P 帧没有完整画面数据,只有与前一帧的画面差别的数据)。
B 帧 :双向参考帧,在压缩时,它即参考前而的帧,又参考它后面的帧。采用帧间压缩技术。B 帧记录的是本帧与前后帧的差别,换言之,要解码 B 帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B 帧压缩率高,但是解码时 CPU 工作量会比较大。

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

GOP

三.H264码流结构 

在VCL进行数据传输或存储之前,这些编码的VCL数据,被映射或封装进NAL单元(NALU)。

H264码流是由一个个的NAL单元组成,其中SPS、PPS、IDR和SLICE是NAL单元某一类型的数据。

使用十六进制软件打开编码后的H264文件:

00 00 00 01 06:  SEI信息  

00 00 00 01 67:  0x67&0x1f = 0x07 :SPS

00 00 00 01 68:  0x68&0x1f = 0x08 :PPS

00 00 00 01 65:  0x65&0x1f = 0x05: IDR Slice

1)、SPS(序列参数集):SPS对如标识符、帧数以及参考帧数目、解码图像尺寸和帧场模式等解码参数进行标识记录。

2)、PPS(图像参数集):PPS对如熵编码类型、有效参考图像的数目和初始化等解码参数进行标志记录。

3)、SEI(补充增强信息):这部分参数可作为H264的比特流数据而被传输,每一个SEI信息被封装成一个NAL单元。SEI对于解码器来说可能是有用的,但是对于基本的解码过程来说,并不是必须的。

4) 一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。IDR 图像一定是 I 图像,但I图像不一定是 IDR 图像。一个序列中可以有很多的I图像,I 图像之后的图像可以引用 I 图像之间的图像做运动参考。


四.H264编码中遇到的问题

问题描述:编码出来的h264文件,使用vlc播放,随着播放时间增加,图像会越来越模糊。

-> 修改gop,gop应该和帧率一致。

问题描述:编码出来的h264文件过大。

-> 适当减小码率,一般为8*1024,如果h264文件还是过大,可以再减小码率。

问题描述:编码出来的h264文件不能解码。

- > h264 Profile编码和解码要对应起来。

  • profile_idc = 66 → baseline profile;
  • profile_idc = 77 → main profile;
  • profile_idc = 88 → extended profile;

五.H264编码profile & level控制

H.264有四种画质级别,分别是baseline, extended, main, high:

  1. Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;
  2. Extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;(用的少)
  3. Main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced), 也支持CAVLC 和CABAC 的支持;
  4. High profile:高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、 无损视频编码和更多的YUV 格式;


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嵌入式_笔记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值