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

 视频编码格式:H264, VC-1, MPEG-2, MPEG4-ASP (Divx/Xvid), VP8, MJPEG 等。
 音频编码格式:AAC, AC3, DTS(-HD), TrueHD, MP3/MP2, Vorbis, LPCM 等。
 字幕编码格式:VOB, DVB Subs, PGS, SRT, SSA/ASS, Text

  视频编码器工作流程,视频编码过程。 mime:用来表示媒体文件的格式 mp3为audio/mpeg;aac为audio/mp4a-latm;mp4为video/mp4v-es;音频前缀为audio,视频前缀为video 我们可用此区别区分媒体文件内的音频轨道和
视频轨道。音视频编码时,音视频同步;音视频解码时,音视频同步。 

1.帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。
2.帧内预测主要用在去除空间冗余上而帧间预测则主要用在去除时间冗余上。
3.H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。

AVFrame: 存储非压缩的数据(视频对应RGB/YUV像素数据,音频对应PCM采样数据);
AVPacket:存储压缩数据(视频对应H.264等码流数据,音频对应AAC/MP3等码流数据).

视频 = 图片、图像(摄像头) + 声音(麦克风) ;

- aac audio_codec; h264,video_codec;25 framerate 25帧;

 - Camera-YUV帧序列-YUV帧预处理(镜像 缩放 旋转)-编码器-H264数据
从摄像头输出的YUV帧经过预处理之后,送入编码器,获得编码好的h264视频流。

直播功能过程- https://www.jianshu.com/p/ee8e5035021d

--   视频编码是本系列一个重要的部分,如果把整个流媒体比喻成一个物流系统,那么编解码就是其中配货和装货的过程,这个过程非常重要,它的速度和压缩比对物流系统的意义非常大,影响物流系统的整体速度和成本。同样,对流媒体传输来说,编码也非常重要,它的编码性能、编码速度和编码压缩比会直接影响整个流媒体传输的用户体验和传输成本。
   视频本质上讲是一系列图片连续快速的播放,最简单的压缩方式就是对每一帧图片进行压缩,例如比较古老的 MJPEG 编码就是这种编码方式,这种编码方式只有帧内编码,利用空间上的取样预测来编码。形象的比喻就是把每帧都作为一张图片,采用 JPEG 的编码格式对图片进行压缩,这种编码只考虑了一张图片内的冗余信息压缩。

-- 音视频的编码方式分为两种:
  硬编码:用设备GPU去实现编解码,这样可以减轻CPU的压力。
  软编码:让CPU来进行编解码,在c层代码来进行编解码,因为c/c++有很多好的编解码库。

-- Android 硬编码流控,码率控制模式有三种:
1.CQ  表示完全不控制码率,尽最大可能保证图像质量;
2.CBR 表示编码器会尽量把输出码率控制为设定值,即我们前面提到的“不为所动”;
3.VBR 表示编码器会根据图像内容的复杂度(实际上是帧间变化量的大小)来动态调整输出码率,图像复杂则码率高,图像简单则码率低;

  码流(Data Rate):是指视频文件在单位时间内使用的数据流量,也叫码率,是他是视频编码中画面质量控制中最重要的部分。同样分辨率下,视频文件的码流越大,压缩比就越小
,画面质量就越高。
  CBR(Constant Bit Rate)常数比特率,是以恒定比特率方式进行编码,有Motion发生时,由于码率恒定,只能通过增大QP来减少码字大小,图像质量变差,当场景静止时,图像质量
又变好,因此图像质量不稳定。这种算法优先考虑码率(带宽)。
  VBR(Variable Bit Rate)动态比特率,其码率可以随着图像的复杂程度的不同而变化,因此其编码效率比较高,Motion发生时,马赛克很少。码率控制算法根据图像内容确定使用
的比特率,图像内容比较简单则分配较少的码率(似乎码字更合适),图像内容复杂则分配较多的码字,这样既保证了质量,又兼顾带宽限制。这种算法优先考虑图像质量。
  CVBR(Constrained VariableBit Rate),这样翻译成中文就比较难听了,它是VBR的一种改进方法。但是Constrained又体现在什么地方呢?这种算法对应的Maximum bitRate恒定或
者Average BitRate恒定。这种方法的兼顾了以上两种方法的优点:在图像内容静止时,节省带宽,有Motion发生时,利用前期节省的带宽来尽可能的提高图像质量,达到同时兼顾带宽
和图像质量的目的。这种方法通常会让用户输入最大码率和最小码率,静止时,码率稳定在最小码率,运动时,码率大于最小码率,但是又不超过最大码率。
  ABR (Average Bit Rate)平均比特率, 在一定的时间范围内达到设定的码率,但是局部码率峰值可以超过设定的码率,平均码率恒定。

-- 常见的视频编码器: 
1)H.264/AVC;2)HEVC/H.265; 3)VP8 ;4)VP9 ;5)FFmpeg ;
注:音频编码器有Mp3, AAC等。

-- 音视频编码的核心思想就是去除冗余信息: 
1)空间冗余:图像相邻像素之间有较强的相关性; 
2)时间冗余:视频序列的相邻图像之间内容相似 ;
3)编码冗余:不同像素值出现的概率不同 ;
4)视觉冗余:人的视觉系统对某些细节不敏感 ;
5)知识冗余:规律性的结构可由先验知识和背景知识得到;

  音频编码效果:AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3;
> 编码类型:
 1.内部VOP(I-VOP),只用到当前帧的信息编码;强制I帧的情况
 2.单向预测VOP(P-VOP),利用它前面的I或者P-VOP利用运动补偿技术来编码;
 3.双向预测VOP(B-VOP),利用前面和后面的I或者P-VOP利用运动补偿技术来编码。
 4.全景VOP(S-VOP)用来编码sprite对象

> 编码流程的关键步骤有变换、量化、预测、滤波、熵编码、码率控制
  H.264是在MPEG-4技术的基础之上建立起来的,其编解码流程主要包括5个部分:帧间和帧内预测(Estimation)、变换(Transform)和反变换、量化(Quantization)和反量化、环路滤波(LoopFilter)、熵编码(EntropyCoding)。

> 视频编码:帧编码和场编码
1.帧: 帧即视频序列中的其中一张图像. 
2.场:一帧图像可分为两个场,顶场和底场. 如果一帧图像含有1280行像素,则有:
  0, 2, 4, 6, 8, ….., 1278组成一个场,被称为顶场. 
  1, 3, 5, 7, 9, ….., 1279组成一个场,被称为底场.
在实际编码的过程中,编码的单元可能为帧,也可能为场.
-- 逐行扫描和隔行扫描:
  1.逐行扫描:针对一帧顺序扫描每一行像素. 
  2.隔行扫描:针对一帧先扫描顶场,再扫描底场,如此可能造成图像的闪烁,但是对于需要在信道传输的图像而言,每一次传输的数据量相比逐行减半(多见于mpeg-2的ts视频文件).

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

 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)压缩编码方法

> DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法,DEFLATE压缩与解压的源代码可以在自由、通用的压缩库zlib上找到,zlib官网:http://www.zlib.net/
  deflate、gzip和bzip2更关注压缩率,压缩和解压缩时间会更长;lzo,lz4以及snappy这3中压缩算法,均已压缩速度为优先,压缩率会稍逊一筹;lzo,lz4以及snappy在cpu高峰更低一点。因为在容忍的压缩率之内,我们更加关注压缩和解压缩时间,以及cpu使用,所有最终使用了snappy,不难发现snappy在压缩和解压缩时间以及cpu高峰都是最低的,并且在压力率上也没有太多的劣势。
 JDK GZIP —这是一个压缩比高的慢速算法,压缩后的数据适合长期使用。JDK中的java.util.zip.GZIPInputStream / GZIPOutputStream便是这个算法的实现。
 JDK deflate —这是JDK中的又一个算法(zip文件用的就是这一算法)。它与gzip的不同之处在于,你可以指定算法的压缩级别,这样你可以在压缩时间和输出文件大小上进行平衡。可选的级别有0(不压缩),以及1(快速压缩)到9(慢速压缩)。它的实现是java.util.zip.DeflaterOutputStream / InflaterInputStream。
 LZ4压缩算法的Java实现—这是本文介绍的算法中压缩速度最快的一个,与最快速的deflate相比,它的压缩的结果要略微差一点。
 Snappy—这是Google开发的一个非常流行的压缩算法,它旨在提供速度与压缩比都相对较优的压缩算法。
 H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。

> 视频压缩算法,编码与压缩算法
 I帧法是帧内压缩法,也称为“关键帧”压缩法;B帧是双向时间预測算法;P帧法是前向预測算法;
视频压缩的基本原理,一些常见压缩算法的概念- https://blog.csdn.net/iloveyin/article/details/24367863
 Web端直播产品主要的运营方式有歌唱,会议、讲课,靠送花、广告等赢利。
 从技术上讲,从模拟技术到数字技术,由CMOS到CCD成像。因为视频在未经压缩前会占用大量的数据空间。从设备到存储都异常昂贵,只有某个电影厂、电视台才能配置。一部动画片,从画一幅画,到连续的24帧/秒(24/fps- frames per second)成为一个动态画面。
 iPhone 7视频拍摄支持4k/30fps、1080p/60fps、720p/30fps的标准视频和1080p/120fps、720p/240fps的慢动作视频。

视频压缩算法的相关知识- https://www.cnblogs.com/mfrbuaa/p/3914600.html
  -- MPEG-1 视频压缩编码后包括三种元素:I帧(I-frames)、P帧(P-frames)和B帧(B-frames)。在MPEG编码的过程中,部分视频帧序列压缩成为I帧;部分压缩成P帧;还有部分压缩成B帧。I帧法是帧内压缩法,也称为“关键帧”压缩法。I帧法是基于离散余弦变换DCT( Discrete Cosine Transform )的压缩技术,这样的算法与JPEG压缩算法相似。採用I帧压缩可达到1/6的压缩比而无明显的压缩痕迹。
  在保证图像质量的前提下实现高压缩的压缩算法,仅靠帧内压缩是不能实现的,MPEG採用了帧间和帧内相结合的压缩算法。 P帧法是一种前向预測算法,它考虑相邻帧之间的同样信息或数据,也即考虑运动的特性进行帧间压缩。P帧法是依据本帧与相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据。
  -- MPEG -2图像压缩的原理是利用了图像中的两种特性:空间相关性和时间相关性。一帧图像内的不论什么一个场景都是由若干像素点构成的,因此一个像素通常与它周围的某些像素在亮度和色度上存在一定的关系,这样的关系叫作空间相关性;一个节目中的一个情节经常由若干帧连续图像组成的图像序列构成,一个图像序列中前后帧图像间也存在一定的关系,这样的关系叫作时间相关性。这两种相关性使得图像中存在大量的冗余信息。假设我们能将这些冗余信息去除,仅仅保留少量非相关信息进行传输,就能够大大节省传输频带。而接收机利用这些非相关信息,依照一定的解码算法,能够在保证一定的图像质量的前提下恢复原始图像。一个好的压缩编码方案就是能够最大限度地去除图像中的冗余信息。
  MPEG-2的编码图像被分为三类,分别称为I帧,P帧和B帧。
  -- H.264的算法在概念上能够分为两层:视频编码层(VCL:Video Coding Layer)负责高效的视频内容表示,网络提取层(NAL:Network Abstraction Layer)负责以网络所要求的恰当的方式对数据进行打包和传送。 H.264支持1/4或1/8像素精度的运动矢量。在1/4像素精度时可使用6抽头滤波器来降低高频噪声,对于1/8像素精度的运动矢量,可使用更为复杂的8抽头的滤波器。在进行运动预计时,编码器还可选择“增强”内插滤波器来提高预測的效果。H.264中熵编码有两种方法,一种是对全部的待编码的符号採用统一的VLC(UVLC :Universal VLC),还有一种是採用内容自适应的二进制算术编码。H.264 草案中包括了用于差错消除的工具,便于压缩视频在误码、丢包多发环境中传输,如移动信道或IP信道中传输的健壮性。

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

> H.264编码原理
Lossless video compression: decode an H.264-encoded video file and reversibly re-encode it as as a smaller file.- https://github.com/dropbox/avrecode
H.264再学习 -- 目前主流的几种数字视频压缩编解码标准- https://blog.csdn.net/qq_29350001/article/details/78225725?locationNum=3&fps=1
-- 深度解析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编码框架分两层:
 1.VCL(Video Coding Layer):负责高效的视频内容表示;
 2.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帧)

-- 码流 / 码率 / 比特率 / 帧速率 / 分辨率 / 高清的区别- https://blog.csdn.net/xiangjai/article/details/44238005
H.264规定了三种档次,每个档次支持一组特定的编码功能,并支持一类特定的应用。
 1)基本档次:利用I片和P片支持帧内和帧间编码,支持利用基于上下文的自适应的变长编码进行的熵编码(CAVLC)。主要用于可视电话、会议电视、无线通信等实时视频通信;
 2)主要档次:支持隔行视频,采用B片的帧间编码和采用加权预测的帧内编码;支持利用基于上下文的自适应的算术编码(CABAC)。主要用于数字广播电视与数字视频存储;
 3)扩展档次:支持码流之间有效的切换(SP和SI片)、改进误码性能(数据分割),但不支持隔行视频和CABAC。主要用于网络的视频流,如视频点播。

-- H.264/AVC标准中两种熵编码方法,CABAC叫自适应二进制算数编码CAVLC叫前后自适应可变长度编码
 1.CABAC:是一种无损编码方式,画质好,X264就会舍弃一些较小的DCT系数,码率降低,可以将码率再降低10-15%(特别是在高码率情况下),会降低编码和解码的速速。
 2.CAVLC将占用更少的CPU资源,但会影响压缩性能。
   帧:当采样视频信号时,如果是通过逐行扫描,那么得到的信号就是一帧图像,通常帧频为25帧每秒(PAL制)、30帧每秒(NTSC制);
   场:当采样视频信号时,如果是通过隔行扫描(奇、偶数行),那么一帧图像就被分成了两场,通常场频为50Hz(PAL制)、60Hz(NTSC制);
 帧频、场频的由来:最早由于抗干扰和滤波技术的限制,电视图像的场频通常与电网频率(交流电)相一致,于是根据各地交流电频率不同就有了欧洲和中国等PAL制的50Hz和北美等NTSC制的60Hz,但是现在并没有这样的限制了,帧频可以和场频一样,或者场频可以更高。
 帧编码、场编码方式:逐行视频帧内邻近行空间相关性较强,因此当活动量非常小或者静止的图像比较适宜采用帧编码方式;而场内相邻行之间的时间相关性较强,对运动量较大的运动图像则适宜采用场编码方式。

> I(关键帧)帧内预测,P(前向预测帧),B(双向预测帧),GOP
  视频压缩中,每帧代表一幅静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中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 数据时只需要知道四种帧类型,其它类型我都把它规类成非关键帧。分别是
1.NAL_SPS(7), sps 帧
2.NAL_PPS(8), pps 帧
3.NAL_SLICE_IDR(5), 关键帧
4.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)。

--  I frame :帧内编码帧 又称intra  picture,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。
 P frame: 前向预测编码帧 又称predictive-frame,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;
 B frame: 双向预测内插编码帧 又称bi-directional interpolatedprediction frame,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧;
 PTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来;
 DTS:Decode Time Stamp。DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码。DTS主要用于视频的解码,在解码阶段使用.PTS主要用于视频的同步和输出.在display的时候使用.在没有B frame的情况下.DTS和PTS的输出顺序是一样的.
  在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。因此我们平时的每帧数据就是一个NAL单元(SPS与PPS除外)。

-- IPB帧的不同:
 I frame : 自身可以通过视频解压算法解压成一张单独的完整的图片。
 P frame :需要参考其前面的一个I frame 或者Bframe来生成一张完整的图片。
 B frame : 则要参考其前一个I或者P帧及其后面的一个P帧来生成一张完整的图片。
两个I frame之间形成一个GOP,在x264中同时可以通过参数来设定bf的大小,即:I 和p或者两个P之间B的数量。

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

> 视频编码算法
监控系统视频编码算法(REARCH PLAN)- https://blog.csdn.net/xjyzg2970/article/details/79689623
H.264视频编码算法的认识与理解- http://www.elecfans.com/dianzichangshi/20171201590648.html
视频编解码算法面试总结- https://blog.csdn.net/bvngh3247/article/details/80239593

H.264视频编解码原理整理- https://blog.csdn.net/qq_26986211/article/details/52768555?locationNum=2&fps=1

-- H.264,同时也是MPEG-4第十部分。H264标准各主要部分有Access Unit delimiter(访问单元分割符),SEI(附加增强信息),primary coded picture(基本图像编码),Redundant Coded Picture(冗余图像编码)。还有Instantaneous Decoding Refresh(IDR,即时解码刷新)、HypotheTIcal Reference Decoder(HRD,假想参考解码)、HypotheTIcal Stream Scheduler(HSS,假想码流调度器)。

-- H.264视频编码优势:
 1.低码率(Low Bit Rate):和MPEG2和MPEG4 ASP等压缩技术相比,在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPEG4的1/3。
 2.高质量的图像:H.264能提供连续、流畅的高质量图像(DVD质量)。
 3.容错能力强:H.264提供了解决在不稳定网络环境下容易发生的丢包等错误的必要工具。
 4.网络适应性强:H.264提供了网络抽象层(Network AbstracTIon Layer),使得H.264的文件能容易地在不同网络上传输(例如互联网,CDMA,GPRS,WCDMA,CDMA2000等)。

  H.263采用了32级的均匀量化,即宏块数据采取一个量化步长;MPEG-4除了支持H.263的均匀量化外,还增加了量化表的处理方式;H.264采用了52级的均匀量化方式。反量化处理后,进行反变换IDCT,对H.263/MPEG-1/2/4采取了8&TImes;8块的浮点式IDCT,H.264采取了4×4的整数ICT。运动补偿是解码器中的重点,占用了约60%以上的计算负荷,这是因为码流统计中帧间编码为主要的编码类型,而与之对应的处理就是插值运动补偿,根据从码流中解析的运动向量信息,定位参考帧的确切位置,然后计算1/2、1/4像素精度的插值,最后把结果补偿(加)到重建帧中。解码器中的最后处理是可选的去除块效应(MPEG-4)、环路滤波(H.264)、图像扩展等。

 一帧图像送入到编码器,先经过帧内或帧间预测之后,得到预测值,预测值与输入数据相减,得到残差,然后进行DCT变化和量化,得到残差系数,然后送入熵编码模块输出码流,同时,残差系数经反量化反变换之后,得到重构图像的残差值,然后和帧内或者帧间的预测值相加,从而得到了重构图像,重构图像再经环内滤波之后,进入参考帧队列,作为下一帧的参考图像,从而一帧帧向后编码。

-- 根据视频数据压缩的原理可知,视频数据中存在大量的冗余,主要为以下几种:
 1.空间冗余:在一帧图像中,如果图像比较规则,那么这帧图像就内部的图像信息就存在信息的相关性,表现为数据的冗余。
 2.时间冗余:在电视,动画图像中,在相邻帧之间往往包含了相同的背景,只不过运动物体的位置有点变换,因此对于序列图像中的相邻两帧仅记录他们之间的差异,去掉其中重复的,称为时间冗余的那部分信息。
 3.结构冗余:有些图像从大体上看存在着非常强的纹理结构,我们称之为他在结构上存在冗余。
 4.统计冗余:在视频数据中不同数值出现概率各不相同,而在数值上的表现统计不平均的冗余。如果使根据这种统计信息,使用相对较少的数据表示全部的视频信息,就是达到压缩的目的。
 5.知识冗余:有许多图像的理解与某些基础知识有相当大的相关性,例如:人脸的图像有固定的结构。比如说嘴的上方有鼻子,鼻子的上方有眼睛,鼻子位于脸的中线上等,这类规律性的结构可由先验知识和背景知识得到,称之为知识冗余。
 6.视觉冗余:由于人眼对图像中的高频细节信息,色度信息比较不敏感而产生的信息冗余。利用人眼这种特性,对高频和色度信息适当丢弃,而尽可能保留低频亮度信息,可以进一步地压缩数据。
 7.信息熵冗余:也称编码冗余,如果图像中平均每个像素使用的比特数大于该图像的信息熵,则图像中存在冗余,这种冗余称为信息熵冗余。

  预测编码主要减少数据在时域和空域上的相关性,去除空域冗余(空域冗余反映了一帧图像内相邻像素之间的相关性,可采用帧内预测编码)和时域冗余(时域冗余反映了图像帧与帧之间的相关性,可采用帧间预测编码)。

对于帧间编码来说,它允许变换块的大小根据运动补偿块的大小进行自适应的调整;
对于帧内编码来说,它允许变换块的大小根据帧内预测残差的特性进行自适应的调整。

-- 编码的工作机制
  MPEG-4/H.264等编解码算法的工作机制基本都是混合编码,主要处理模块包括:预测、变换、量化和熵编码等。工作原理大同小异,图像帧的编码模式主要有帧内和帧间两种方式。帧内包括预测、变换、量化和熵编码等,帧间编码包括运动估计、运动补偿、变换、量化和熵编码等。帧内的预测和帧间的运动估计统称预测编码。

https://i-blog.csdnimg.cn/blog_migrate/ebb0e3118ce07ed0fd74e871142cf038.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值