环境相关:将rtsp源码放在mpp下 (能找到lib 和include)
cd/sample_rtsp make cd/venc可以看到sample_venc(在makefile中修改sensor)
执行sample_venc 可以在vlc中打开网络串流就可以看到播放 和原来sample中写到文件编码出
三路h264码流区别就是通过网络传输和不用写进文件里。写进文件其实只是个裸流,需要专业播放器播放
------------------------------------------------------------
H264编码原理和基本概念
1.图像编码:图像存在冗余信息 {
时间(一帧和一帧之间底色相同的部分),空间冗余(像素点一样的)
}
2.视频编码的关键点在于:压缩比,算法复杂度 ,还原度
H264俩部分VCL视频编码的部分(视频如何压缩) NAL关心的是视频压缩后如何进行网络传输
编码概念 :
像素是最小单位
1。macroblock宏块 (32*32这个单元可能就是一个宏块 )区域相似性视频压缩的基本单元不是以像素为单位
2。片slice 视频编码里比MB大一个层级的单位
3。 帧 frame 一副图片 比slice打一个层级 有可能一帧只有1片可能多个片
像素-》 宏 -》片 -》 帧组成序列 再组成码流
4 。I帧 非参考帧 (参考帧:有时间冗余的优化,和前后帧有关系)
I 帧和自有关 可以理解为起始帧 帧内空间压缩 压缩比率不大
第二帧就可以进行时间压缩
B帧 p帧都是参考帧 P帧只参考前面的帧 B帧是前后都参考
--------------------------------------------
H.264的单元详解
1VCL负责原视频处理 :编码算法和特定硬件平台实现,输出的是纯视频流信息,没有冗余头信息
纯视频流没办法传输 因为不知道视频多大 什么格式压缩的,NAL加一些信息头 压缩算法 大小 如何进行网络传输
2NAL负责VCL的输出纯视频流如何被表达和封包利于网络传输 nal出来就h264的文件
2.1SODB string of data bits 纯视频流
2.2RBSP SODB + rbsp trailing bits = RBSP
原始数据加rbsp的头尾信息
RBSP + BAL header (1 byte)=NALU
2.3NALU 码流信息就是一个个的NAUL 解码就是分析一个个NAUL 再分析RBSP 再还原播放
7视频传输和解码关心的是NAL,编码相关的关心的是VCL
---------------------------------------
specialVH264.exe 雷神写的 IDRSLISE i帧可以看出比较大 sps pps sei一般不认为是帧(用来表示头信息)
estools可以看到图像内容
wintex看二进制文件
------
海思平台编码出来的H.264码流都是一个序列:sps(序列参数集)+pps(图像参数集)+sei(补充增强信息单元)+1I帧 +若干P (fps -1的p帧)
NAL:
(1)序列 sequence分段(假设1秒钟分一段,很长时间都是p不可以因为p参考前面的如果坏了一个误差会越来越大)
(2)分隔符 wintex打开h264可以看到00 00 00 01带领一串数据 表示新片的开始
h264 帧内数据假设恰巧是00 00 00 01 规定有效数据不能出现三个00 会在俩个00 后面加一个03 (原来数据00 00 00 他会00 00 03 00)
分隔符不算有效数据
(假设sps 的数据是14 14个字节后会出现00 00 00 01 然后到 pps4字节后 00 00 00 01再到spi 再到i帧)
判断I .P帧
通过 00 00 00 01后第一个字节判断https://blog.csdn.net/jefry_xdz/article/details/8461343
判断是否为I帧的算法为: 0000 0101(NALU类型 & 0001 1111) = 5 即 NALU类型 & 31 = 5
NALU就是墙后面的第一个字节
(1)第1位禁止位,值为1表示语法出错
(2)第2~3位为参考级别
参考级别的话就是比如rtsp要保证实时性 ,所以丢帧内一些片的话,就要看nal_reference_idc的值
越大越重要 只能丢不重要的
(3)4-8位可以看出nal类型 如果是5 就是I帧 1就是p帧 因为hi3518E没看到b帧
I和IDR帧都是使用帧内预测的。它们都是同一个东西, 在编码和解码中为了方便,要把首个I帧和其他I帧区别开,所以 首个I帧叫IDR ,以方便控制编码和解码流程。 IDR帧的作用是立刻刷新, 使错误不致传播。从IDR帧开始, 重新算一个新的序列开始编码。 而I帧不具有随机访问的能力,这个功能是由IDR承担。 IDR帧会导致DPB ( DecodedPictureBuffer 参考帧列表 ——这是关键所在)清空,而I不会。 IDR帧一定是I图像,但I帧不一定是IDR图像。 一个序列中可以有很多的I帧图像,I帧图像之后的图像可以引用I帧图像之间的图像做运动参考。 对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容
----------------------------------
sps 类型 7 序列的信息 sps丢了解码可能失败
作为解码器实例的初始化信息使用
保存了一组序列的全局参数
sps里面有profile信息和level信息
profile是对视频压缩特性的描述 压缩算法 level是视频本身特性描述 分辨率
proflie主要定义编码工具集合(不同profile有不同的编码工具) level对码流参数取值范围做限定
profile{base /main /extendprofile}
NALU的下一个码流对应的profile
NALU的下俩个对应的就是level
pps每一帧的编码数据依赖参数保存在sps中图像参数集
总结 I帧大小取决于图像本省内容 P帧取决于图像变化的剧烈程度
CBR和VBR下p帧大小会不同 CBR固定码率P帧大小基本恒定 VBR变化可能会很剧烈
H264码流(HI3518e)都是由序列组成由一个sps 一个pps 一个 sei 一个i帧 和fps-1的p帧组成 每帧对应一个片
sps和pps和sei描述的是序列的图像
vbr的话对网络带宽有要求 可变码流 这样在网络带宽够的情况会清晰 网络带宽不够大的话 会不清晰
cbr的话恒定码率 这样图像变换剧烈 图像会不清晰 但是对网络要求不大