视频编码原理及(H.264 librtmp推流)图像编码中sps ,pps ,nalu ,frame ,silce ect

-- 深入了解 VP8- https://blog.csdn.net/leixiaohua1020/article/details/12760173

 一般处理视频的步骤都是:
编码:预测 -> 变换+量化处理 -> 熵编码 -> 环路过滤器
解码:熵编码 -> 预测 -> 反量化处理+变幻 -> 环路过滤器

 p帧:就是通过当前帧已有的部分预测其他区块的内容。可以是在当前帧进行,也可以通过运动补偿的方式在帧间进行。
 帧内预测:帧内预测是用来编码帧间不同,在空间域上进行的预测编码算法,可以除去相邻块之间的空间冗余度,取得更为有效的压缩。

 帧间预测:帧内预测主要用在去除空间冗余上而帧间预测则主要用在去除时间冗余上。运动估计就是在参考帧中寻找与当前编码宏块最匹配的宏块,而运动补偿就是计算二者的差值。帧间预测主要由两个部分组成:参考帧和运动矢量。vp8支持3中参考帧:p帧,g帧(golden fream)和alt ref帧。

--   视频压缩编码和音频压缩编码的基本原理- https://blog.csdn.net/leixiaohua1020/article/details/28114081
  1.视频编码基本原理
(1)视频信号的冗余信息
(2)压缩编码的方法:(a)变换编码(b)熵编码(c)运动估计和运动补偿(d)混合编码
  2.音频编码基本原理
(1)  音频信号的冗余信息:(a)频谱掩蔽效应(b)时域掩蔽效应
(2)  压缩编码方法

> H.264编码原理

深度解析H.264编码原理- https://blog.csdn.net/AndrExpert/article/details/71774230
  H.264编码原理:
  在H.264协议里定义了三种帧,完整编码的帧叫I帧(关键帧),参考之前的I帧生成的只包含差异部分编码的帧叫P帧,还有一种参考前后的帧编码的帧叫B帧。H.264编码采用的核心算法是帧内压缩和帧间压缩。其中,帧内压缩是生成I帧的算法,它的原理是当压缩一帧图像时,仅考虑本帧的数据而不用考虑相邻帧之间的冗余信息,由于帧内压缩是编码一个完整的图像,所以可以独立的解码显示;帧间压缩是生成P、B帧的算法,它的原理是通过对比相邻两帧之间的数据进行压缩,进一步提高压缩量,减少压缩比。通俗的来说,H.264编码的就是对于一段变化不大图像画面,我们可以先编码出一个完整的图像帧A,随后的B帧就不编码全部图像,只写入与A帧的差别,这样B帧的大小就只有完整帧的1/10或更小。
  H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。

 H.264编码框架分两层:
 VCL(Video Coding Layer):负责高效的视频内容表示;
 NAL(Network Abstraction Layer):负责以网络所要求的恰当的方式对数据进行打包和传送;

 IDR(I帧)、SPS、PPS、SES、P/B帧:(注:SPS、PPS、SEI不属于帧)
 a) IDR(Instantaneous Decoding Refresh):即时解码刷新。一个序列的第一个图像叫做IDR 图像(立即刷新图像),IDR 图像都是I 帧图像(关键帧)。H.264引入 IDR 图像是为了解码的重同步,当解码器解码到IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
 b) SPS(Sequence Parameter Sets):序列参数集,作用于一系列连续的编码图像。
 c) PPS(Picture Parameter Set):图像参数集,作用于编码视频序列中一个或多个独立的图像。
 d) SEI(Supplemental Enhancement Information):附加增强信息,包含了视频画面定时等信息,一般放在主编码图像数据之前,在某些应用中,它可以被省略掉。
 e) P帧:前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,它P帧是I帧后面相隔1~2帧的编码帧,其没有完整画面数据,只有与前一帧的、画面差别的数据。
 f) B帧:双向预测内插编码帧。B帧记录的是本帧与前后帧的差别,它是由前面的I或P帧和后面的P帧来进行预测的。

 H264数据的组织形式从大到小排序是:序列(sequence)、图像(frame/field-picture)、片组(slicegroup)、片(slice)、宏块(macroblock)、块(block)、子块(sub-block)、像素(pixel)。在H.264码流中图像是以序列为单位进行组织的,一个序列是由多帧图像被编码后的数据流,以I帧开始,到下一个I帧结束;一帧图像可以分成一个或多个片(slice),片由宏块组成,宏块是编码处理的基本单位,当片编码之后会被打包进一个NALU,也就是一帧图像对应于一个NALU。NALU是H.264编码数据存储或传输的基本单位,它除了容纳片还可以容纳其他数据,如SPS、PPS、SEI等。

SPS、PPS、I/P/B帧检测:
0x67& 0x1F = (0110 0111) & (0001 1111) =(0000 0111)=7(十进制)–> SPS
0x68& 0x1F = (0110 1000) & (0001 1111) =(0010 1000)=8(十进制)–> PPS
0x65& 0x1F = (0110 0101) & (0001 1111) =(0000 0101)=5(十进制)–> 关键帧(I帧)
0x41 & 0x1F = (01000001) & (0001 1111) =(0000 0001)=1(十进制) –> 非关键帧(I帧)

> I(关键帧)帧内预测,P(前向预测帧),B(双向预测帧)

视频压缩中,每帧代表一幅静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。
  I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面),如果直接发送,不等I帧,客户端得到的画面会残缺,但是延迟较低。如果等I帧,客户端缓冲时间较长,得到画面会完整,但是延迟至少是一个gop。
  P帧(前向预测帧)表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
  B帧是(双向预测帧)双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,但我这样说简单些,有兴趣可以看看我上面提供的资料),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累~。

  GOP就是两个I帧之间的间隔。

> 视频编码中各种参数~sps ,pps ,nalu ,frame ,silce; NAL_SPS PPS;NAL_SLICE NAL_SLICE_IDR

-- 使用librtmp进行H264与AAC直播- https://my.oschina.net/jerikc/blog/501948

我们发送 RTMP 数据时只需要知道四种帧类型,其它类型我都把它规类成非关键帧。分别是

NAL_SPS(7), sps 帧
NAL_PPS(8), pps 帧
NAL_SLICE_IDR(5), 关键帧

NAL_SLICE(1) 非关键帧

帧类型的方式判断为界面符后首字节的低四位。
第一帧的帧类型为: 0x67 & 0x1F = 7,这是一个 SPS 帧
第二帧的帧类型为: 0x68 & 0x1F = 8,这是一个 PPS 帧
第三帧的帧类型为: 0x06 & 0x1F = 6,这是一个 SEI 帧

-- 帧类型有:
NAL_SLICE = 1
NAL_SLICE_DPA = 2
NAL_SLICE_DPB = 3
NAL_SLICE_DPC = 4
NAL_SLICE_IDR = 5
NAL_SEI = 6
NAL_SPS = 7
NAL_PPS = 8
NAL_AUD = 9
NAL_FILLER = 12,
  NAL nal_unit_type中的1(非IDR图像的编码条带)、2(编码条带数据分割块A)、3(编码条带数据分割块B)、4(编码条带数据分割块C)、5(IDR图像的编码条带)、7序列参数集(SPS)、8图像参数集(PPS)、6增强信息(SEI);

  Slice种的三种编码模式:I_slice、P_slice、B_slice

-- I 帧和 IDR 帧的区别:
  对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容,与此相反,对于普通的I-帧来说,位于其之后的B-和P-帧可以引用位于普通I-帧之前的I-帧。从随机存取的视频流中,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有IDR帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。IDR 帧属于 I 帧。解码器收到 IDR frame  时,将所有的参考帧队列丢弃 (用 x264_reference_reset 函数实现——在 encoder.c 文件中) 。这点是所有 I 帧共有的特性,但是收到 IDR 帧时,解码器另外需要做的工作就是:把所有的 PPS 和 SPS 参数进行更新。由此可见,在编码器端,每发一个 IDR ,就相应地发一个  PPS&SPS_nal_unit.
I frame 是自己独立编码,不依赖于其他frame 数据。 
P frame 依赖 I frame 数据。 
B frame 依赖 I frame, P frame 或其他 B frame 数据。

-- 获取pps和sps
pps及sps
1.不能从packet获得,而是保存在AVCodecContext的extradata数据域中
2.一般情况下,extradata中包含一个sps、一个pps 的nalu, 从h264_mp4toannexb_bsf.c代码中容易看出extradata的数据格式
3.分析后的sps及pps依然储存在extradata域中,并添加了起始符。

  1、NAL、Slice与frame意思及相互关系  
NAL指网络提取层,里面放一些与网络相关的信息;
Slice是片的意思,264中把图像分成一帧(frame)或两场(field),而帧又可以分成一个或几个片(Slilce);片由宏块(MB)组成。宏块是编码处理的基本单元。
  2、NAL nal_unit_type 里的五种类型,代表接下来数据是表示啥信息的和具体如何分块。
I_slice、P_slice、B_slice 表示I类型的片、P类型的片,B类型的片.其中I_slice为帧内预测模式编码;P_slice为单向预测编码或帧内模式;B_slice 中为双向预测或帧内模式。
  3、还有frame的3种类型:I frame、P frame、 B frame之间有什么映射关系么?  
I frame、P frame、 B frame关系同 I_slice、P_slice、B_slice,slice和frame区别在问题1中。
  4、最后,NAL nal_unit_type中的6(SEI)、7(SPS)、8(PPS)属于什么帧呢?  

NAL nal_unit_type 为序列参数集(SPS)、图像参数集(PPS)、增强信息(SEI)不属于啥帧的概念。表示后面的数据信息为序列参数集(SPS)、图像参数集(PPS)、增强信息(SEI)。

> 视频编码,音频编码

视音频编解码技术零基础学习方法- https://blog.csdn.net/leixiaohua1020/article/details/18893769

  视频编码的主要作用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。如果视频不经过压缩编码的话,体积通常是非常大的,一部电影可能就要上百G的空间。视频编码是视音频技术中最重要的技术之一。视频码流的数据量占了视音频总数据量的绝大部分。高效率的视频编码在同等的码率下,可以获得更高的视频质量。
  音频编码的主要作用是将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。音频编码也是互联网视音频技术中一个重要的技术。但是一般情况下音频的数据量要远小于视频的数据量,因而即使使用稍微落后的音频编码标准,而导致音频数据量有所增加,也不会对视音频的总数据量产生太大的影响。高效率的音频编码在同等的码率下,可以获得更高的音质。

  音频编码效果:AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3

 


音视频编解码流程:

相关文章
相关标签/搜索
每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。
本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院