视频播放器原理
视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。他们的过程如图所示。
解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。
解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。
视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
流媒体协议
流媒体协议是服务器与客户端之间通信遵循的规定。当前网络上主要的流媒体协议如表所示。
封装格式(容器)
封装格式的主要作用是把视频码流和音频码流按照一定的格式存储在一个文件中。现如今流行的封装格式如下表所示:
由表可见,除了AVI之外,其他封装格式都支持流媒体,即可以“边下边播”。有些格式更“万能”一些,支持的视音频编码标准多一些,比如MKV。而有些格式则支持的相对比较少,比如说RMVB。
编解码
编解码器(codec)指的是一个能够对一个信号或者一个数据流进行变换的设备或者程序。这里指的变换既包括将 信号或者数据流进行编码(通常是为了传输、存储或者加密)或者提取得到一个编码流的操作,也包括为了观察或者处理从这个编码流中恢复适合观察或操作的形式的操作。编解码器经常用在视频会议和流媒体等应用中。
转码
指将一段多媒体包括音频、视频或者其他的内容从一种编码格式转换成为另外一种编码格式。
帧(Frame)
是影像中常用的最小单位,相当于电影中胶片的每一格镜头,一帧就是一副静止的画面,连续的帧就形成了视频。
帧率(Frame rate)
是称为帧的位图图像连续出现在显示器上的频率(速率)。该术语同样适用于胶片和摄像机,计算机图形和动作捕捉系统。帧速率也可以称为帧频率,并以赫兹(Hz)表示。每秒的帧数(fps)或者说帧率表示图形处理器处理场时每秒钟能够更新的次数。高的帧率可以得到更流畅、更逼真的动画。一般来说30fps就是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps一般就不容易察觉到有明显的流畅度提升了。如果帧率超过屏幕刷新率只会浪费图形处理的能力,因为监视器不能以这么快的速度更新,这样超过刷新率的帧率就浪费掉了。
分辨率
又称解析度、解像度,可以从显示分辨率与图像分辨率两个方向来分类。显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少。由于屏幕上的点、线和面都是由像素组成的,显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也越多,所以分辨率是个非常重要的性能指标之一。
比特率(码率)
比特率指每秒传送的比特数,单位为 bps(Bit Per Second),比特率越高,传送数据速度越快。声音中的比特率是指将模拟声音信号转换成数字声音信号后,单位时间内的二进制数据量,是间接衡量音频质量的一个指标。多媒体行业在指音频或者视频在单位时间内的数据传输率时通常使用码流或码率,单位是 kbps(千位每秒)。视频中的码率的概念与声音中的相同,都是指由模拟信号转换为数字信号后,单位时间内的二进制数据量。比如 1.44Mbps,就是 1 秒内到达的数据量为 1.44Mb。(注意,是 bit,不是 byte)。
音频中比特率的计算公式如下: 比特率 = 采样率 * 采样精度 * 声道数目
视频中比特率的计算公式如下: 比特率 = 帧率 * 每帧数据大小
采样率
采样率(也称为采样速度或者采样频率)定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样频率的倒数叫作采样周期或采样时间,它是采样之间的时间间隔。注意不要将采样率与比特率(bit rate,亦称“位速率”)相混淆。
采样定理表明采样频率必须大于被采样信号带宽的两倍,另外一种等同的说法是奈奎斯特频率必须大于被采样信号的带宽。如果信号的带宽是 100Hz,那么为了避免混叠现象采样频率必须大于200Hz。换句话说就是采样频率必须至少是信号中最大频率分量频率的两倍,否则就不能从信号采样中恢复原始信号。
对于语音采样:
8,000 Hz - 电话所用采样率, 对于人的说话已经足够
11,025 Hz
22,050 Hz - 无线电广播所用采样率
32,000 Hz - miniDV 数码视频 camcorder、DAT (LP mode)所用采样率
44,100 Hz - 音频 CD, 也常用于 MPEG-1 音频(VCD, SVCD, MP3)所用采样率
47,250 Hz - Nippon Columbia (Denon)开发的世界上第一个商用 PCM 录音机所用采样率
48,000 Hz - miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率
50,000 Hz - 二十世纪七十年代后期出现的 3M 和 Soundstream 开发的第一款商用数字录音机所用采样率
50,400 Hz - 三菱 X-80 数字录音机所用所用采样率
96,000 或者 192,000 Hz - DVD-Audio、一些 LPCM DVD 音轨、Blu-ray Disc(蓝光盘)音轨、和 HD-DVD (高清晰度 DVD)音轨所用所用采样率
2.8224 MHz - SACD、 索尼 和 飞利浦 联合开发的称为 Direct Stream Digital 的 1 位 sigma-delta modulation 过程所用采样率。
总之当前声卡常用的采样频率一般为44.1KHz(每秒采集声音样本44.1千次)11KHz、22KHz、和48KHz。采样频率越高,获得的声音文件质量越好,占用存储空间也就越大。
在模拟视频中,采样率定义为帧频和场频,而不是概念上的像素时钟。图像采样频率是传感器积分周期的循环速度。由于积分周期远远小于重复所需时间,采样频率可能与采样时间的倒数不同。
50 Hz - PAL 视频
60 / 1.001 Hz - NTSC 视频
当模拟视频转换为数字视频的时候,出现另外一种不同的采样过程,这次是使用像素频率。一些常见的像素采样率有:
13.5 MHz - CCIR 601、D1 video
采样位数
即采样值或取样值。它是用来衡量声音波动变化的一个参数。在计算机中采样位数一般分为8bit和16bit,但有一点请大家注意,8位不是说把纵坐标分成8份,而是分成2的8次方即256份;同理16位是把纵坐标分成2的16次方65536份。
声道数
CHANNEL_IN_MONO(单声道) and CHANNEL_IN_STEREO(立体声). 其中CHANNEL_IN_MONO是可以保证在所有设备能够使用的。
有损压缩和无损压缩
在视频压缩中有损(Lossy )和无损(Lossless)的概念与静态图像中基本类似。无损压缩也即压缩前和解压缩后的数据完全一致。多数的无损压缩都采用RLE行程编码算法。有损 压缩意味着解压缩后的数据与压缩前的数据不一致。在压缩的过程中要丢失一些人眼和人耳所不敏感的图像或音频信息,而且丢失的信息不可恢复。几乎所有高压缩的算法都采用有损压缩,这样才能达到低数据率的目标。丢失的数据率与压缩比有关,压缩比越小,丢失的数据越多,解压缩后的效果一般越差。此外,某些有损压 缩算法采用多次重复压缩的方式,这样还会引起额外的数据丢失。
无损格式,例如WAV,PCM,TTA,FLAC,AU,APE,TAK,WavPack(WV)
有损格式,例如MP3,Windows Media Audio(WMA),Ogg Vorbis(OGG),AAC
帧内压缩和帧间压缩
帧内(Intraframe)压缩也称为空间压缩 (Spatial compression)。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩时各个帧之间没有相互关系,所以压缩后的视频数据仍可以以帧为单位进行编辑。帧内压缩一般达不到很高的压缩。
采用帧间(Interframe)压缩是基于许多视频或 动画的连续前后两帧具有很大的相关性,或者说前后两帧信息变化很小的特点。也即连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。帧间压缩也称为时间压缩(Temporalcompression),它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的。帧差值(Frame differencing)算法是一种典型的时间压缩法,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。
对称编码和不对称编码
对称性(symmetric)是压缩编码的一个关键特 征。对称意味着压缩和解压缩占用相同的计算处理能力和时间,对称算法适合于实时压缩和传送视频,如视频会议应用就以采用对称的压缩编码算法为好。而在电子出版和其它多媒体应用中,一般是把视频预先压缩处理好,尔后再播放,因此可以采用不对称(asymmetric)编码。不对称或非对称意味着压缩时需要花费大量的处理能力和时间,而解压缩时则能较好地实时回放,也即以不同的速度进行压缩和解压缩。一般地说,压缩一段视频的时间比回放(解压缩)该视频的时间 要多得多。例如,压缩一段三分钟的视频片断可能需要10多分钟的时间,而该片断实时回放时间只有三分钟。
音频编码
声音数字化三要素
音频编码标准
PCM音频编码
常见音视频编码格式
视频编码
视音频编解码技术
视频编码的主要作用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。如果视频不经过压缩编码的话,体积通常是非常大的,一部电影可能就要上百G的空间。视频编码是视音频技术中最重要的技术之一。视频码流的数据量占了视音频总数据量的绝大部分。高效率的视频编码在同等的码率下,可以获得更高的视频质量。
色彩空间
色彩空间与像素格式
颜色是不同波长的光对人眼刺激产生的色彩感觉。色彩空间(Color Space)是颜色的数学表示,根据不同的表示方法分为不同的色彩模型。最常用的色彩模型有三类:RGB(用于计算机图形学), YUV(用于视频系统), CMYK(用于彩色印刷)。
描述光的常用物理量有四个:光通量、光强、照度、亮度。
彩色三要素
光的颜色取决于客观和主观两方面的因素。客观因素是光的功率波谱分布,它影响光源的颜色。主观因素是人眼视频特性,它影响人眼对色彩的感觉。彩色三要素指亮度(Lightness)、色调(Hue)和饱和度(Saturation),任一色彩都可以用这三个基本参量来表示:亮度表示颜色明暗的程度,是光作用于人眼时引起的明亮程度的感觉。色调是指颜色的类别,例如红色、蓝色、绿色指的就是色调。饱和度指颜色的深浅程度,也称彩度。例如深绿、浅绿指的就是绿色这个色调的饱和度,饱和度越高,颜色越深。
RGB色彩空间
人眼看到的物体颜色,是光源照射到物体,物体吸收(还有透射)部分颜色的光,然后从物体表面反射的光线进入人眼后人眼得到的色彩感觉。人眼看到物体为黑色,是因为物体将光线完全吸收,没有光从物体表面反射出来(例如白天我们看一件黑衣服);或者没有任何光线照射到物体(例如黑底我们看一张白纸)。人眼看到物体为白色,是因为在白光源照射下,物体不吸收光线而将光线全部反射(例如白天我们看一张白纸)。颜色与光源和物体的吸色特性密切相关,基于此,引出混色方法中的加色法和减色法。
加色法利用光源发射特性,将各分色的光谱成分相加得到混合颜色。RGB色彩空间采用加色法。当无任何光线照射时,R、G、B三种颜色分量都为0时,物体呈现黑色;当R、G、B三种颜色分量达到最大时,物体不吸收光线只反射的情况下,物体呈现白色。我们称黑色为最暗,白色为最亮,要达到最亮状态,需要三色分量最大程度混合,因此称为加色。
加色法用于自发光物体。RGB颜色空间主要应用于计算机显示器、电视机、舞台灯光等,都具有发光特性。彩色像素在显示器屏幕上不会重叠,但足够的距离时,光线从像素扩散到视网膜上会重叠,人眼会感觉到重叠后的颜色效果。
减色法是利用颜料吸色特性,每加一种颜色的颜料,会吸收掉对应的补色成分。CMYK色彩空间采用减色法。例如,我们在白纸(白光照射、不吸收、全反射)上涂颜料,黄色颜料能吸收蓝色(黄色的补色),因此在白光照射下显示黄色,当黄(Y)、青(C)、品红(M)三色混在一起且颜色分量都为最大时,它们的补色成分被吸收掉,变成了黑色;当三色分量为0即什么也不涂时,白纸显现白色。要达到最大亮度,需要三色分量完全消失,因此称为减色。印刷时,无法达到理想程度,C、M、Y最大程度混合后无法得到纯黑色,只能得到深灰色,因此在C、M、Y三色之外引入了K(黑色)。
减色法用于无法发光的物体。CMYK颜色空间主要应用于印刷、绘画、布料染色等。
RGB色彩空间中每个像素点包含了R、G、B三种分量。RGB存储模式也有packed和planar两类,这两种模式的区分在第3节中讲述。RGB色彩空间及存储模式比较简单,我们挑几个有代表性的存储模式来简述一下:
存储模式RGB565
使用16b(bit)表示一个像素,5b用于R,6b用于G,5b用于B。如下:
[ R G B ] [ R G B ] [ R G B ] [ R G B ]
[ R G B ] [ R G B ] [ R G B ] [ R G B ]
以上只是示意图,实际R、G、B顺序可能与图中不同。
存储模式RGB888 使用24位来表示一个像素,每个分量都用8位表示。其示意图跟RGB565示意图类似。
存储模式ARGB8888 使用32位来表示一个像素,R、G、B都用8位表示,另外A(Alpha)表示透明度,也用8位表示。
[ A R G B ] [ A R G B ] [ A R G B ] [ A R G B ]
[ A R G B ] [ A R G B ] [ A R G B ] [ A R G B ]
以上只是示意图,实际A、R、G、B顺序可能与图中不同。
YUV色彩空间
YUV颜色空间是PAL、NTSC、SCEAM三大视频标准使用的颜色空间,主要应用于视频系统。YUV色彩空间中,Y表示亮度信息,U和V表示色度(色调和饱和度)信息。使用YUV色彩空间,后期出现的彩色电视系统和早期的黑白电视系统兼容,黑白电视机可以只处理彩色电信信号中的Y分量,而彩色电视机接收黑白电视信号并显示也没有任何问题。YUV颜色空间和RGB颜色空间可以根据公式相互转换。
经常提到的还有YPbPr和YCbCr。YPbPr指模拟分量信号(或接口),P(Parallel)表示并行,b下标表示蓝,r下标表示红。YCbCr指的是数字分量信号(或接口),C(Chroma)表示色度。YCbCr还可指色彩空间,YCbCr色彩空间是YUV色彩空间的缩放和偏移版本。
YUV, YCbCr, YPbPr所指涉的范围,常有混淆或重叠的情况。从历史的演变来说,其中YUV和Y'UV通常用来编码电视的模拟信号,而YCbCr则是用来描述数字的视频信号,适合影片与图片压缩以及传输,例如MPEG、JPEG。但在现今,YUV通常已经在计算机系统上广泛使用。[9]
YUV存储格式分成三大类:packed:将Y、U、V分量交织存放在一起,和RGB的存放方式类似。内存中排列形式类似:YVYUYVYUYVYUYVYU...。在具体的存储模式命名中,packed格式不带后缀P。planar:将Y、U、V的三个分量分别存放在不同的矩阵(平面)中。内存中排列形式类似:YYYYYY...,UUUUUU...,VVVVVV...。在具体的存储模式命名中,planar格式带后缀P。semi-planar:将Y、U、V三个分量放在两个矩阵(平面)中。Y占用一个平面,UV共用一个平面。内存中排列形式类似:YYYYYY...,UVUVUV...。在具体的存储模式命名中,semi-planar格式带后缀SP。
YUV图像存储模式与采样方式密切相关。主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0。这些采样方式,不压缩Y分量,对UV分量的压缩程度不同,这是由人眼的特性决定的,人眼对亮度Y更敏感,对色度UV没有那么敏感,压缩UV分量可以降低数据量,但并不会人眼主观感觉造成太大影响。
采样方式YUV4:4:4
相邻的4个像素里有4个Y、4个U、4个V。每1个Y使用1组UV分量。如下(每个[]为一个像素点):
[ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ]
[ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ]
[ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ]
[ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ]
在这种采样方式下,一个像素点包含的完整的信息。
采样方式YUV4:2:2
相邻的4个像素里有4个Y、2个U、2个V。每2个Y共用1组UV分量。平均算来,一个像素占用的数据宽度为16b,其中Y占8b,U占4b,V占4b。后面存储模式命名中的数字16指的就是16b。
[ Y U ] [ Y V ] [ Y U ] [ Y V ]
[ Y V ] [ Y U ] [ Y V ] [ Y U ]
[ Y U ] [ Y V ] [ Y U ] [ Y V ]
[ Y V ] [ Y U ] [ Y V ] [ Y U ]
在这种采样方式下,还原出一个像素点,需要相邻的两个像素点数据,如下:
[ Y U ] [ Y V ]
采样方式YUV4:2:0
相邻的4个像素里有4个Y、2个U、0个V,或4个Y、2个V,0个U。每4个Y共用1组UV分量。平均算来,一个像素占用的数据宽度为12b,其中Y占8b,U占2b,V占2b。后面存储模式命名中的数字12指的就是12b。
[ Y U ] [ Y ] [ Y U ] [ Y ]
[ Y V ] [ Y ] [ Y V ] [ Y ]
[ Y U ] [ Y ] [ Y U ] [ Y ]
[ Y V ] [ Y ] [ Y V ] [ Y ]
在这种采样方式下,还原出一个像素点,需要相邻的四个像素点数据,如下:
[ Y U ] [ Y ]
[ Y V ] [ Y ]
在同一采样模式下,根据分量元素排列顺序的不同,又分为不同的存储模式
压缩原理
视频压缩原理
熵与冗余
在所有的实际节目素材中,存在着两种类型的信号分量:即异常的、不可预见的信号分量和可以预见的信号分量。异常分量称为熵,它是信号中的真正信息。其余部分称为冗余,因为它不是必需的信息。冗余可以是空间性的,如在图像的大片区域中,邻近像素几乎具有相同的数值。冗余也可以是时间性的,例如连续图像之间的相似部分。在所有的压缩系统编码器中都是将熵与冗余相分离,只有熵被编码和传输,而在解码器中再从编码器的发送的信号中计算出冗余。
帧内编码
帧内编码是空间域编码,利用图像空间性冗余度进行图像压缩,处理的是一幅独立的图像,不会跨越多幅图像。空间域编码依赖于一幅图像中相邻像素间的相似性和图案区的主要空间域频率。JPEG标准用于静止图像(即图片),只使用了空间域压缩,只使用帧内编码。
帧间编码
帧间编码是时间域编码,是利用一组连续图像间的时间性冗余度进行图像压缩。如果某帧图像可被解码器使用,那么解码器只须利用两帧图像的差异即可得到下一帧图像。比如运动平缓的几帧图像的相似性大,差异性小,而运动剧烈的几幅图像则相似性小,差异性大。当得到一帧完整的图像信息后,可以利用与后一帧图像的差异值推算得到后一帧图像,这样就实现了数据量的压缩。时间域编码依赖于连续图像帧间的相似性,尽可能利用已接收处理的图像信息来“预测”生成当前图像。
MPEG标准用于运动图像(即视频),会使用空间域编码和时间域编码,因此是帧内编码和帧间编码结合使用。
运动矢量
一组连续图像记录了目标的运动。运动矢量用于衡量两帧图像间目标的运动程度,运动矢量由水平位移量和垂直位移量二者构成。
运动补偿
目标的运动降低了图像间的相似性,增加了差异数据量。而运动补偿则通过运行矢量来降低图像间的差异数据量。
下图为运动补偿的示意图。当某一目标运动时,其位置会变化但形状颜色等基本不变。编码器则可利用运动矢量减低图像差值,解码器根据图像差值中的运动适量移动目标到合适的位置即可。假设图中是理想情况,目标除移动位置外其他任何属性无任何变化,则两幅图像间的差值仅包含运动矢量这一数据量。显然运动补偿可以显著减少图像差值数据量。
双向预测
先看示意图:
连续的三幅图像中,目标块有垂直位置上的移动,背景块无位置移动。我们考虑如何取得当前帧图像(画面N):画面N中,目标向上移动后,露出背景块。画面N-1中,因为背景块被目标块遮挡住了,因此没有背景块相关信息。画面N+1中,完整包含背景块的数据,因此画面N可以从画面N-1中取得背景块。如何可以得到画面N呢?解码器可以先解码得到画面N-1和画面N+1,通过画面N-1中的目标块数据结合运动矢量即可得到画面N中的目标块数据,通过画面N+1中的背景块数据则可得到画面N中的背景块数据。三幅画面的解码顺序为:N-1, N+1, N。三幅画面的显示顺序为:N-1, N, N+1。画面N通过其前一幅画面N-1和后一幅画面N+1推算(预测,predicted)得到,因此这种方式称为双向预测(或前面预测、双向参考)。
I帧/IDR帧/P帧/B帧
I帧:I帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含一幅完整的图像信息,属于帧内编码图像,不含运动矢量,在解码时不需要参考其他帧图像。因此在I帧图像处可以切换频道,而不会导致图像丢失或无法解码。I帧图像用于阻止误差的累积和扩散。在闭合式GOP中,每个GOP的第一个帧一定是I帧,且当前GOP的数据不会参考前后GOP的数据。
IDR帧:在编码解码中为了方便,将GOP中首个I帧要和其他I帧区别开,把第一个I帧叫IDR,这样方便控制编码和解码流程,所以IDR帧一定是I帧,但I帧不一定是IDR帧;IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始算新的序列开始编码。I帧有被跨帧参考的可能,IDR不会。
I帧不用参考任何帧,但是之后的P帧和B帧是有可能参考这个I帧之前的帧的。IDR就不允许这样,例如:
IDR1 P4 B2 B3 P7 B5 B6 I10 B8 B9 P13 B11 B12 P16 B14 B15 这里的B8可以跨过I10去参考P7
IDR1 P4 B2 B3 P7 B5 B6 IDR8 P11 B9 B10 P14 B11 B12 这里的B9就只能参照IDR8和P11,不可以参考IDR8前面的帧
帧(Instantaneous Decoding Refresh picture, 即时解码刷新帧)是一种特殊的I帧。当解码器解码到IDR帧时,会将DPB(Decoded Picture Buffer,指前后向参考帧列表)清空,将已解码的数据全部输出或抛弃,然后开始一次全新的解码序列。IDR帧之后的图像不会参考IDR帧之前的图像。
P帧:P帧(Predictive-coded picture, 预测编码图像帧)是帧间编码帧,利用之前的I帧或P帧进行预测编码。
B帧:B帧(Bi-directionally predicted picture, 双向预测编码图像帧)是帧间编码帧,利用之前和(或)之后的I帧或P帧进行双向预测编码。B帧不可以作为参考帧。
GOP
GOP(Group Of Pictures, 图像组)是一组连续的图像,由一个I帧和多个B/P帧组成,是编解码器存取的基本单位。GOP结构常用的两个参数M和N,M指定GOP中首个P帧和I帧之间的距离,N指定一个GOP的大小。例如M=1,N=15,GOP结构为:IPBBPBBPBBPBBPBGOP有两种:闭合式GOP和开放式GOP:闭合式GOP:闭合式GOP只需要参考本GOP内的图像即可,不需参考前后GOP的数据。这种模式决定了,闭合式GOP的显示顺序总是以I帧开始以P帧结束 开放式GOP :开放式GOP中的B帧解码时可能要用到其前一个GOP或后一个GOP的某些帧。码流里面包含B帧的时候才会出现开放式GOP。开放式GOP和闭合式GOP中I帧、P帧、B帧的依赖关系如下图所示:
DTS和PTS
DTS(Decoding Time Stamp, 解码时间戳),表示packet的解码时间。PTS(Presentation Time Stamp, 显示时间戳),表示packet解码后数据的显示时间。音频中DTS和PTS是相同的。视频中由于B帧需要双向预测,B帧依赖于其前和其后的帧,因此含B帧的视频解码顺序与显示顺序不同,即DTS与PTS不同。当然,不含B帧的视频,其DTS和PTS是相同的。下图以一个开放式GOP示意图为例,说明视频流的解码顺序和显示顺序
采集顺序指图像传感器采集原始信号得到图像帧的顺序。编码顺序指编码器编码后图像帧的顺序。存储到磁盘的本地视频文件中图像帧的顺序与编码顺序相同。传输顺序指编码后的流在网络中传输过程中图像帧的顺序。解码顺序指解码器解码图像帧的顺序。显示顺序指图像帧在显示器上显示的顺序。采集顺序与显示顺序相同。编码顺序、传输顺序和解码顺序相同。图中“B[1]”帧依赖于“I[0]”帧和“P[3]”帧,因此“P[3]”帧必须比“B[1]”帧先解码。这就导致了解码顺序和显示顺序的不一致,后显示的帧需要先解码。
文章来源:
https://github.com/0voice/audio_video_streaming/blob/main/article/
作者:tiankong19999
《Android Camera开发入门》、《Camx初认识》已经上架,可以点击了解 -> 小驰成长圈 |期待见证彼此的成长
觉得不错,点个赞呗