目录
- 前言
- 1 环境准备
- 2 H.264编码原理和基本概念
- 2.1 图像冗余信息
- 2.2 h.264编码相关的一些概念
- 2.3 h264视频流总体分析
- 2.4 H264的NAL单元详解2
- 2.4.1 相关概念
- 2.5 NALU详解
- 2.6 sps和pps详解
- 2.7 H264的profile和level
- 2.8 序列sequence
前言
本篇文章用于记录实验过程
1 环境准备
资料:
链接:https://pan.baidu.com/s/18J8JjYrWGIQMgYxwacIYjg?pwd=wgg9
提取码:wgg9
--来自百度网盘超级会员V4的分享
下载的sample_rtsp.rar加压到mpp目录下,并改名
unrar x sample_rtsp.rar
mv sample_bak/ sample_rtsp
ls
cd sample_rtsp/venc
make clean
make -j6
ls
cp sample_venc /mnt/hisilion_nfs/ -rf
在开发板中运行程序。
打开VLC播放器,使用网络串流连接开发板,URL改成你的开发板IP地址
2 H.264编码原理和基本概念
2.1 图像冗余信息
(1)空间冗余:一张图片中,颜色完全相同的一大片区域,可以用一个点表示颜色,另外需要记录着个区域的范围,这样可以节省很多内存空间。
(2)时间冗余:一个视频中,有些时间段,一直是一幅图片保持不变,这种情况可以只保留一张图片。
2.2 h.264编码相关的一些概念
(1)宏块 MB macroblock:多个像素点组成的一个区域,这些像素点的颜色应保持相似或相同,压缩算法以宏块为单位进行压缩。
(2)片 slice:一个帧可以由一个片或者多个片构成,片内包含一个或多个宏块。
(3)帧 frame:一帧就是一幅图片。
(4)I帧、B帧、P帧:
I帧(这一帧和前后帧不相关,例如:不需要考虑时间冗余,起始帧就是I帧,只能去除空间冗余)。
B帧(参考前一帧也参考后一帧,B帧很少见到)。
P帧(只参考前一帧,进行空间冗余和时间冗余的计算)。
(5)帧率 fps:每秒钟,显示多少张图片。
(6)像素->宏块->片->帧->序列->码流
2.3 h264视频流总体分析
(1)h264标准有多个版本,可能会有差异,具体差异不详
(2)网上看的资料有时讲法会有冲突,或者无法验证的差异
(3)以海思平台为主、为准、为案例,不能保证其他平台也完全一样
(4)海思平台编码出来的H.264码流都是一个序列包含:1sps+1pps+1sei+1I帧+若干p帧
2.4 H264的NAL单元详解2
NAL全称Network Abstract Layer, 即网络抽象层。
在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。因此我们平时的每帧数据就是一个NAL单元(SPS、PPS、SEI除外)。在实际的H264数据帧中,往往帧前面带有00 00 00 01 或 00 00 01分隔符,一般来说编码器编出的首帧数据为PPS与SPS,有的标准中也包含SEI,接着为I帧……
NAL单元 = I帧 + P帧
2.4.1 相关概念
(1)序列 sequence
一个序列包含:1sps+1pps+1sei+1I帧+若干p帧
使用百度网盘内附带的软件打开 ar0130.h264 这个文件
如上图所示,图中只展示了有效数据,没有展示分隔符,序列号3 是I帧,4是P帧。0 1 2 在后面会进行详细介绍。
(2)分隔符
使用winhex打开 ar0130.h264 这个文件,这个文件在本文开头的百度网盘内
上面的00 00 00 01就是一个分隔符,这是h.264编码协议规定的,如果有效数据中包含了连续的三个00,则在第二个和第三个之间添加03,即00 00 03 00 01。
分隔符后面的第一个字节决定了这段内容属于什么帧,详细内容:
https://blog.csdn.net/jefry_xdz/article/details/8461343
对引用的博客进行说明补充,上面图片中的(2)部分,表示数据传输时的优先级,数字越大优先级越高。
由图可知,P帧的优先级为3,首位为0,帧类型为P帧。如果出现网速慢,而且需要保持网络视频的实时性,通信协议会丢弃优先级较低的内容。
(3)sps (sequence paramater set)
sps和pps详解:
https://www.cnblogs.com/wainiwann/p/7477794.html
先介绍SPS。
上图,NAL_Size表示字节,图中的SPS占14个字节。
如上图所示,结合SPS占14个字节,67 42 … 80 81,这段内容就是SPS。
(4)pps
pps对应的内容68 CE 3C 80,共占4个字节。
(5)sei
sei对应的内容06 E5 01 34 80,共占5个字节。
(6)NALU
2.5 NALU详解
参考阅读:
https://blog.csdn.net/jefry_xdz/article/details/8461343
https://blog.csdn.net/special00/article/details/82533768
2.6 sps和pps详解
https://www.cnblogs.com/wainiwann/p/7477794.html
2.7 H264的profile和level
https://blog.csdn.net/xiaojun111111/article/details/52090185
2.8 序列sequence
(1)一段h.264的码流其实就是多个sequence组成的
(2)每个sequence均有固定结构:1sps+1pps+1sei+1I帧+若干p帧
(3)sps和pps和sei描述该sequence的图像信息,这些信息有利于网络传输或解码
(4)I帧是关键,丢了I帧整个sequence就废了,因为P帧参考I帧,I帧是起始帧,每个sequence有且只有1个I帧
(5)p帧的个数等于fps-1
(6)I帧越大则P帧可以越小,反之I帧越小则P帧会越大
(7)I帧的大小取决于图像本身内容,和压缩算法的空间压缩部分
(8)P帧的大小取决于图像变化的剧烈程度
(9)CBR(固定码率)和VBR(可变码率)下P帧的大小策略会不同,CBR时P帧大小基本恒定,VBR时变化会比较剧烈。码率就是P帧的大小,P帧大小固定时,如果当前帧相比于前一帧的变化不大,清晰度保持不变,如果变化大,而且变化的字节数超过了固定的码率,清晰度会下降;可变码率的清晰度一直不变,但当图像变化大时,字节数会增加,导致网络传输的字节数变大,如果网速慢,视频会出现卡顿的情况。
(10)如果当前帧和前一帧相比,变化非常小,则P帧所占的字节数就很小。
本文许多结论是基于我们的海思HI3518E平台得到的,对于其他平台并不一定适用!