音视频学习

多媒体属性简介

1、音频

1.1 音频基础知识

1.1.1 声学的物理特征

声音信号通常是一种连续的波形来表示。波形的最大位移称为振幅A,反应音量。波形中两个连续波峰(或波谷)之间的距离称为周期T。周期的倒数即为频率f,以赫兹(Hz)为单位。频率反应了声音的音调。

声音可按频率分为三类:

  • 次声波:频率低于20Hz。
  • 音频;频率在20-20kHz。
  • 超声:频率高于20kHz。

1.1.2 音频属性

音频(Audio)指频率在20Hz-20kHz范围内的可听声音,是多媒体信息中的一种媒体类型 - 可听类媒体。

目前多媒体计算机中的音频主要由波形音频、CD音频和MIDE音乐3种形式。重点应该是波形音频。

1、波形音频

波形音频是由外部声音源通过数字化过程采集到多媒体计算机的所有声音形式。语音是波形声音中人说话的声音,具有内在的语言学、语音学的内涵。多媒体计算机可以利用特殊的方法分析、研究、抽取语音的相关特征,实现对不同语音的分辨、识别以及通过文字合成语音波形等。

2、CD音频

CD音频(CD-Audio)是存储在音乐CD光盘中的数字音频,可以通过CD-ROM驱动器读取并采集到多媒体计算机系统中,并以波形音频的相应形式存储和处理。

3、MIDI

MIDI音频(musical instrument digital interface),它将音乐符号化并保存在MIDI文件中,通过因为合成器产生相应的声音波形来还原播放。

音频是时间的函数,具有很强的前后相关性,所以实时性是音频处理的基本要求。

1.1.3 音频的数字化

计算机处理音频信号前,必须将模拟的声音信号数字化,产生数字音频。具体过程包括采样、量化与编码。图示基本如下;

[站外图片上传中...(image-5f9f10-1598062459460)]

1、采样与采样频率

采样就是每间隔一段时间读取一次声音信号幅度,使声音信号在时间上被离散化。

采样频率就是将模拟声音波形数字化时,每秒钟抽取声波幅度样本的次数,其计算单位是kHz(千赫兹)。一般来说,采样频率越高,声音失真越小,用于存储的数字音频的数据量也越大。

乃奎斯特(Nyquist)采样理论:采样频率不应低于声音信号最高频率的两倍。这样就能把以数字表达的声音还原成原来的声音。例如:电话话音的信号频率约为 3.4 kHz,采样频率一般选用 8 kHz。

音频抽样率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz。

2、量化与量化位数

量化就是把采样得到的信号幅度转化为数字值,是声音信号在幅度上被离散化。量化位数(位深)是每个采样点能够表示的数据范围,常用的有8位、12位和16位。图示一个:

[图片上传失败...(image-c9ebfd-1598062459460)]

3、声道

反映音频数字化质量的另一个因素是声道个数。记录音频时,如果每次生成一个声波的数据,称为单声道;每次记录两个声波数据,称为双声道(立体声);每次生成二个以上的声波数据,称为多声道(环绕立体声)。

4、音频采样的数据量

数字音频的采样数据量主要取决两方面的因素:

  • 音质因素:采样频率、量化位数和声道数三个参数决定。
  • 时间:采样时间长短。

单位时间的数据量可用下面的公式表示:

v=f*b*s/8

v:单位时间的数据量(KB/s)。
f:采样频率(kHz)。
b:量化位数(bit)。
s:声道数。

auf=audio/L16;rate=16000

40ms的单声道、16Khz、量化位数为16的数据:(16*16*1)/8 * 40 =1280B

1.1.4 音频的编码

音频数据压缩编码的方法有多种,可分为无损压缩和有损压缩两大类。无损压缩主要包含各种熵编码;有损压缩则分为波形编码、参数编码、感知编码和混合编码。

  • 波形编码:模拟音频数字化(抽样和量化)的过程中,根据人耳的听觉特性进行编码,并使编码后的音频信号与原始信号的波形尽可能匹配,实现数据压缩。

    • PCM (Pulse Code Modulation)、脉冲编码调制。
    • DPCM (Differential Pulse Code Modulation)。
    • APCM (Adaptive Pulse Code Modulation)。
    • ADPCM (Adaptive Differential Pulse Code Modulation)。
  • 参数编码:把音频信号表示成模型的输出,利用特征的方法抽取必要的模型参数和激励信号的信息,且对这些信息编码,最后在输出端合成原始信号。

这里可以看这篇文章了解下:音频处理的狗屋,可能需要翻个墙。

音频开发基础知识简介

1.2 常见音频格式

1.3 音频后处理概念

  • NS(Noise Suppression):噪音抑制。

  • NLP(Nonlinear Procession):去除残留的回音和背景噪声。

  • NC(Noise Controller):噪音控制。

  • CC(Clarity Controller):清晰度控制。

  • VAD(Voice Activity Detection):静音检测,将检测被编码的音频数据是语音还是静音或背景噪音。这个特性在用变比特率(VBR)进行编码是总是开启的,所以选项设置只对非变比特率(VBR)起作用。

  • DRC(Dynamic Range Controller)

  • AGC(Automatic Gain Controller):自动增益控制。

  • VBR(Variable Bit-Rate):变比特率,变比牲率(VBR)允许编解码器动态调整比特率以适应的音频解码的“难度”,拿Speex来说,像元音和瞬间高音则需较高比特率(Bit-rate)来达到最佳效果,而摩擦音则用较少的比特(bits)即可完成编码。

  • CBR(Constant Bit-Rate):平均比特率(ABR)通过动态调整变比特率(VBR)的质量来获得一个特定目标的比特率,解决了VBR中存在的问题之一。

  • CNG(Comfort Noise Generator):舒适噪音生成。在非变比特率的情况下,检测非语音周期并对用足够的比特数重新生成的背景噪声进行编码。这个叫“舒适噪声生成(CNG)。

  • postprocess:后处理。

    • punctuation process:标点处理。
    • smooth process:顺滑处理。
    • number process:数字处理。 对应模块:nlp.dll。
    • replace process:替换处理。
    • pargraph process:段落处理。
    • language type:处理语言,0 - 中文,1 - 粤语,2 - 英语,3 - 维语,4 - 藏语。
    • output type:0 - next-g听写引擎JSON格式, 1 - 常规(文本格式), 2 - next-g听写引擎JSON格式,带cm
    • useAttribute:根据词性优化标点。

音频后处理基本概念

语音处理检测技术中的热点--端点检测、降噪和压缩

2、视频

2.1 视频基础知识

2.1.1 视频简介

视频(Video)泛指将一系列静态影像以电信号的方式加以捕捉、纪录、处理、储存、传送与重现的各种技术。连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫做视频。视频与电影属于不同的技术,后者是利用照相术将动态的影像捕捉为一系列的静态照片。

人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”。

2.1.2 视频属性

1、帧率

帧率(Frame rate)是用于测量显示帧数的量度。所谓的测量单位为每秒显示帧数(Frames per Second,FPS)或“赫兹”(Hz)。

帧率表示图形处理器处理时每秒钟能够更新的次数。高的帧率可以得到更流畅、更逼真的动画。一般来说30fps就是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps一般就不容易察觉到有明显的流畅度提升了。如果帧率超过屏幕刷新率只会浪费图形处理的能力,因为监视器不能以这么快的速度更新,这样超过刷新率的帧率就浪费掉了。

我们可以根据帧率得出连续两帧的时间间隔。比如帧率为30FPS,那么相邻两帧的时间间隔为33ms。

屏幕刷新率是指电子束对屏幕上的图像重复扫描的次数。

刷新率越高,所显示的图象(画面)稳定性就越好。刷新率高低将直接决定其价格,但是由于刷新率与分辨率两者相互制约,因此只有在高分辨率下达到高刷新率这样的显示器才能称其为性能优秀。

2、分辨率

像素:每张图片都是由色点组成的,每个色点称为一个像素。

一张图片由30万个色点组成,这个图片的像素就是30W。我们常说相机是多少像素,这个像素就是说这款照相机的感光器件有多少个,有100W个感光器件的相机就是100W像素的相机。一台100W像素的相机拍摄的照片洗成5寸的照片会比洗成6寸清晰一点。

分辨率=画面水平方向的像素值 * 画面垂直方向的像素值。

分辨率可以分为两方面:屏幕分辨率和图像分辨率。

屏幕分辨率:屏幕分辨率是屏幕每行的像素点数每列的像素点数,每个屏幕有自己的分辨率。*

屏幕分辨率是1024×768,也就是说设备屏幕的水平方向上有1024个像素点,垂直方向上有768个像素点。像素的大小是没有固定长度的,不同设备上一个单位像素色块的大小是不一样的。例如,尺寸面积大小相同的两块屏幕,分辨率大小可以是不一样的,分辨率高的屏幕上面像素点(色块)就多,所以屏幕内可以展示的画面就更细致,单个色块面积更小。而分辨率低的屏幕上像素点(色块)更少,单个像素面积更大,可以显示的画面就没那么细致。

由于屏幕上的点、线和面都是由像素组成的,显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也越多,所以分辨率是个非常重要的性能指标之一。可以把整个图像想象成是一个大型的棋盘,而分辨率的表示方式就是所有经线和纬线交叉点的数目。显示分辨率一定的情况下,显示屏越小图像越清晰,反之,显示屏大小固定时,显示分辨率越高图像越清晰。

常见的分辨率有: 1080P(1920 x 1080) 、720P(1280 x 720) 、480P(640 x 480)、360P,外语字母P意为逐行扫描(progressive scanning)

图像分辨率:指每英寸图像内的像素点数。图像分辨率是有单位的,叫像素每英寸。

分辨率越高,像素的点密度越高,图像越逼真。一张图片分辨率是500x200,也就是说这张图片在屏幕上按1:1放大时,水平方向有500个像素点(色块),垂直方向有200个像素点(色块)。在同一台设备上,图片分辨率越高,这张图片1:1放大时,图片面积越大;图片分辨率越低,这张图片1:1缩放时,图片面积越小。但是,在屏幕上把图片超过100%放大时,为什么图片上像素色块也变的越大,其实是设备通过算法对图像进行了像素补足,我们把图片放的很大后看到的一块一块的方格子,虽然理解为一个图像像素,但是其实是已经补充了很多个屏幕像素;同理,把图片小于100%缩小时,也是通过算法将图片像素进行减少。

3、码率(比特率)

由于保存完整的一帧一帧图片的视频原文件太大,必须要通过某种视频压缩算法将视频中的图片压缩,以减小视频文件大小,那么压缩比越大,解压缩还原后用来播放的视频就会有越严重的失真,因为压缩的同时不可避免的丢失了视频中原来图像的数据信息。

码率又称比特率bps(bit per second),是指视频文件在单位时间内使用的数据流量,即用平均每秒多少bit来衡量一个视频大小。

4、计算视频码率

我们可以根据一个视频的长度和大小来推断该视频的码率是多少。

一段1080P的视频长度为100min,大小为1G,该视频码率?

100min = 100 * 60 = 6000s
1G = 1024M = 1024 * 1024KB = 1024 * 1024 * 1024KB = 1024 * 1024 * 1024 * 8 bit = 8589934592bit
比特率 = 8589934592/6000s = 1431655b/s = 1.4Mbit/s

2.1.3 音视频同步

音视频混合一起播放,就呈现了我们常常看到的广义的视频。在音频一起播放的时候,我们通常还要面临一个问题:怎么进行同步,以免出现画不同声的情况。

要实现因频频同步,通常要选择一个参考时钟,参考时钟的时间上是线性增长的。编码音视频流时依据参考时钟上的时间给每帧数据打上一个时间戳。在播放时,读物数据帧上的时间戳,同时参考当时参考时钟上的时间来安排播放。

这里说的时间戳即下文会提到的PTS,实践中,我们可以选择:同步视频到音频、同步音频到视频或同步音视频到外部时钟。

1、DTS/PTS

DTS(decoding time stamp):解码时间戳,是解码器进行解码时相对于SCR(系统参考时间)的时间戳,它主要标识读入内存bit流在什么时刻开始送入解码器中进行解码。

PTS(presentation time stamp):显示时间戳。PTS主要用于视频的tongue和输出,在display的时候使用。在没有B帧的情况下,DTS和PTS的输出顺序是一致的。

DTS 时间戳决定了解码器在SCR时间等于DTS时间时进行解码,PTS时间戳也是类似的。通常,DTS/PTS时间戳指示的是晚于音视频包中的SCR的一个时 间。例如,如果一个视频数据包的SCR是100ms(意味着此包是播放100ms以后从磁盘中读取的),那么DTS/PTS值就差不多是200 /280ms,表明当SCR到200ms时这个视频数据应该被解码并在80ms以后被显示出来(视频数据在一个buffer中一直保存到开始解码)
下 溢通常发生在设置的视频数据流相关mux率太高。如果mux率是1000000bits/sec(意味着解码器要以1000000bits/sec的速率 读取文件),可是视频速率是2000000bits/sec(意味着需要以2000000bits/sec的速率显示视频数据),从磁盘中读取视频数据时 速度不够快以至于1秒钟内不能够读取足够的视频数据这种情况下DTS/PTS时间戳就会指示视频在从硬盘中读出来之前进行解码或显示(DTS/PTS时间戳就要比包含它们的数据包中的SCR时间要早了)。

如今依靠解码器,着基本已经不是什么问题了(尽管MPEG文件因为应该没有下溢而并不完全符合MPEG标准)。一些解码器(很多著名的基于PC的播放器)尽可能快的读取文件以便显示视频,可以的话直接忽略SCR。
注意在你提供的列表中,平均的视频流速率为~3Mbps(3000000bits/sec)但是它的峰值达到了14Mbps(相当大,DVD限制在 9.8Mbps内)。这意味着mux率需要调整足够大以处理14Mbps的部分, bbMPEG计算出来的mux率有时候太低而导致下溢。
你计划让视频流速率这么高么?这已经超过了DVD的说明了,而且很可能在大多数独立播放其中都不能播放。如果你不是这么计划,我会从1增加mquant的值并且在视频设置中将最大码流设置为9Mbps以保持一个小一点的码流。

如果你确实想让视频

那么高,你需要增大mux率。从提供的列表可以得出bbMPEG使用14706800bits/sec或者1838350bytes /sec的mux率(总数据速率为:1838350bytes/sec(14706800bits/sec)行)。你在强制mux率字段设置的值应该是以 bytes/sec为单位并被50整除。所以我会从36767(1838350/50)开始,一直增加直到不会再出现下溢错误为止;

DTS主要用于视频的解码,PTS主要用于视频的同步和输出。在display的时候使用,在没有B frame情况下,DTS和PTS的输出顺序是一致的。

举个栗子:

下为GOP为15的例子,其解码的参数frame及解码的顺序都在上面:

[图片上传失败...(image-a70084-1598062459460)]

如上图,I frame的解码不依赖于其它任何的帧,而P帧的解码则依赖前面的I帧或P帧。B帧的解码则依赖于其前的最近的一个I帧或P帧即其后最近的P帧。

2.2 视频解码

2.2.1 解码概念

play process
  • 解协议:流媒体协议的数据,解析为标准的相应的封装格式数据。
  • 解封装:将输入的封装格式的数据,分离成音频流和视频流压缩编码数据。
  • 解码:将视频和音频压缩编码数据,解码称为非压缩的音频/视频原始数据。
  • 音视频同步:根据封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将音视频数据传送至系统的显卡和声卡播放出来。

2.2.1.1 软解码

软解码:使用CPU进行解码。时间直接,简单,参数调整方便,升级容器,但CPU负载重,性能相对较低,低码率情况下通常较硬编码好些。

2.2.1.2 硬解码

硬解码:使用显卡GPU,专用的DSP、FPGA、ASIC芯片等硬件进行解码。性能好。

典型应用来说明如何使用硬件解码接口,该应用场景是从网络处传来H264编码后的视频码流,最后显示在手机屏幕上。

场景:network -> compressed video samples -> phone

2.2.2 H.264编码原理

2.2.2.1 编码原理概念介绍

H.264简介

H.264/MPEG-4AVC(H.264)是1995年字MPEG-2视频压缩标准之后发布的最新、最优前途的视频压缩标准。它是ITU-T和ISO/IEC的联合开发组共同开发的最新国际视频编码标准。通过该标准,在同等图像质量的压缩效率比以前的标准提高了2倍以上。

国际上制定视频编解码技术的组织有两个,一个是国际电联(ITU-T),它制定的标准有H.261、H.263、H.263+等,另一个是国际标准化组织(ISO)。它制定的标准有MPEG-1、MPEG-2、MPEG-4等。而H.264则是由两个组织联合组建的联合视频组(JVT)共同制定的新数字视频编码标准,所以它既是ITU-T的H.264,又是ISO/IEC的MPEG-4高级视频编码(Advanced Video Coding,AVC)的第10 部分。因此,不论是MPEG-4 AVC、MPEG-4 Part 10,还是ISO/IEC 14496-10,都是指H.264。

1、H.264的高级技术背景

H.264标准的主要目标是在于现有的视频编解码标准相比,在相同的带宽下提供更加优秀的图像质量。

而H.264与以前的国际保准如H.263和MPEG-4相比,主要优势体现在下面几个部分:

  • 将每个视频分离成有像素组成的快,因此视频帧的编码处理过程可以到达块的级别。
  • 采用空间冗余方法,对视频帧的一些原始快进行空间预测、转换、优化和熵编码(可变长编码)。
  • 对连续帧不同块采用的临时存放的方法,这样,只需对连续帧中有改变的部分进行编码。该算法采用动态预测和运动补偿来完成。对于特定的块,在一个或多个已经进行了编码的帧进行搜索来决定块的运动向量,并由此在后面的编码和解码中预测主块。

2、H.264的特征和高优先级

H.264是国际标准化组织和国际电信联盟共同提出的及MPEG4新一代数字视频压缩格式,它既保留了以往压缩技术的有点和精华,又具有其他压缩技术无法比拟的许多优点。

  • 低码流(low bit rate):在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPWG的1/3。显然,H.264压缩技术的采用将大大节省用户的下载时间和数据流量收费。
  • 高质量图像:H.264能提供连续、流畅的高质量图像。
  • 容错能力强:H.264能提供解决在不稳定网络环境下容易发生丢包等错误的必要工具。
  • 网络适应性强:H.264提供了网络适应层(network adaptation layer),使得H.264的文件能容器地在不同的网络上传输。

3、H.264标准的关键技术

a、帧内预测编码

帧内编码用来缩减图像空间的冗余度。相邻的宏块通常含有相似的属性。在对一给定宏块编码时,可以根据周围的宏块预测,然后对预测值与实际值的差值进行编码。

帧内预测编码

b、帧间预测编码

帧间预测编码利用连续帧的时间冗余来进行运动估计和补偿。除了P帧,B帧外,还支持一种新的流间传送帧 - SP帧,码流包含SP帧后后,能在有类似内容但码率不同的码流见快速切换,同时支持随机接入和快速回放的模式。

c、整数变换

H.264使用以证书为基础的空间变换。

d、量化

H.264有32种不同的量化步长,且以12.5%的复合率递增,不是一个常数。

e、熵编码

两种不同的熵编码方法:通过可变长的编码和基于文本的自适应二进制算术编码。

2.2.2.2 通俗理解

H.264为新一代编码标准,以高压缩质量和支持多种网络的流媒体传输著称,其编码理论依据可以白话如下:参照一段时间内图像的统计结果,在相邻几幅图像画中,一般有差别的像素只有10%以内的点,量度差值不超过2%,而色度差值只有1%内。所以对一段变化不大图像画面,我们可以先编码一个完整的图像帧A,随后的B帧就不编码全部图像,只写入A帧的差别,这样B帧的大小就只有完整帧的1/10甚至更小。B帧之后C帧如果变化不大,我们可以继续参考B的方式编码C帧,这样循环下去。这段图像我们称之为一个序列(序列就是有相同特点的一段数据),当某个图像与之前的图像差别很大时,无法参考之前的帧来生成,那我们结束上一个序列,开始下一个序列。

H.264中定义三种帧,完整编码的帧叫I帧,参考之前生成的I帧只包含差异部分叫做P帧,还有一种参考前后编码的帧叫做B帧。

1、对序列的说明

在H.264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流,以I帧开始到下一个I帧结束。

一个序列的第一个图像叫做IDR图像(立即刷新图像),IDR都是I帧图像。H.264引入IDR图像为了解码的重同步,当解码器解码到IDR图像时,立即将参考帧队列清空,将已编码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,当前一个序列出现重大错误时,这里可以获得重新同步的机会。IDR图像永远不会使用IDR之前的图像的数据来解码。

一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个I帧,然后一直P帧、B帧了。当运动变化多时,可能一个序列就比较短了,比如就包含一个I帧和3、4个P帧。

2、对三种帧的介绍

a、I帧

为了更好的理解I帧,这里罗列两种解释:

  • 帧内编码帧,I帧表示关键帧,你可以理解为这一阵画面的完整保留,解码时只需要本帧数据就可以完成。
  • 帧内编码帧,intra frame,I帧通常是每个GOP(MPEG所使用的一种视频压缩技术)的第一个帧,经过适度的进行压缩,作为随机访问的参考点,可以当成图像。I帧可以看成是一个图像经过压缩后的产物。

I帧的特点:

  • 它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输。
  • 解码时仅用I帧的数据就可以重构完整图像。
  • I帧描述了图像背景和运动主体的详情。
  • I帧不需要参考其它画面而生成。
  • I帧是B帧和P帧的参考帧(其质量直接影响通序列其它帧的质量)。
  • I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧。
  • I帧不需要考虑运动矢量。
  • I帧所占据的信息量比较大。

b、P帧

为了更好的了解P帧,这里同样罗列两种解释:

  • 前项预测编码帧。P着呢表示的这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。
  • 前项预测编码帧,predictive frame,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧。

P帧的预测和重构:P帧是以I帧为参考帧,在I帧中找出P帧某点的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据根据运动矢量从I帧中找出P帧的某点的预测值并与差值相加得到P帧某点样值,从而得到完整的P帧。

  • P帧是I帧后相隔1-2帧的编码帧。
  • P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量。
  • 解码时必须将I帧中的预测值与预测误差求和才能完整重构P帧图像。
  • P帧属于前项预测的帧间编码,它只参考前面最靠近的I帧或P帧。
  • P帧可以是其后面的P帧的参考帧,也可以是其前后的B帧的参考帧。
  • 由于P帧是参考帧,它可能造成编解码错误的扩散。
  • 由于是差值传输,P帧的压缩比比较高。

c、B帧

为了更好的了解B帧,这里同样罗列两种解释:

  • 双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别。换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码后面的画面,通过前后画面与本帧数据的叠加取得最终画面。B帧的压缩率比较高,但是解码会比较累。
  • 双向预测内插编码帧,bi-directional interpolated prediction frame,既考虑与源图像序列前面的已编码帧,也估计源图像序列后面的已编码帧之间的时间冗余信息来压缩传输数据量的源码图像。

B帧的特点:

  • B帧是由前面的I或P帧和后面的P帧来进行预测的。
  • B帧传送的是与它前面的I帧或P帧和后面P帧之间的预测误差及运动矢量。
  • B帧是双向预测帧。
  • B帧压缩比最高,因为它只反映参考帧间运动主体的变化情况,预测比较准确。
  • B帧不是参考帧,不会造成解码错误的扩散。

I、B、P各帧是根据压缩算法的需要,是人为定义的,他们都是实实在在的物理帧。一般来说,I帧的压缩率是7,P帧是20,B帧可以达到50。

3、对压缩算法的说明

H.264的压缩算法:

  • 分组:把几帧图像分为一组(GOP,也是一个序列),为防止运动变化,帧数不宜过多。
  • 定义帧:将每组内的各帧图像定义为三种类型,I、P、B帧。
  • 预测帧:以I帧与基础帧,I帧预测P帧,再有I帧和P帧预测B帧。
  • 数据传输:最后将I帧数据和预测的差值信息进行存储和传送。

帧内压缩及空间压缩,当压缩一帧图像是,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,与静态压缩类似。

帧间压缩是相邻几帧的数据有很大的相关性,即连续的视频其相邻帧之间有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以提高压缩量。
帧间压缩也称为时间压缩,它通过比较本帧与相邻帧之间的差异, 仅记录本帧与其它相邻帧的差值。

有损(Lossy )压缩和无损(Lossy less)压缩。无损压缩也即压缩前和解压缩后的数据完全一致。多数的无损压缩都采用RLE行程编码算法。有损压缩意味着解压缩后的数据与压缩前的数据不一致。在压缩的过程中要丢失一些人眼和人耳所不敏感的图像或音频信息,而且丢失的信息不可恢复。几乎所有高压缩的算法都采用有损压缩,这样才能达到低数据率的目标。

2.2.3 H.264码流结构

存疑部分

H.264编码器输出的bit流中,每个bit都属于某个句法元素。句法元素被组织成有层次的结构,分别面熟各个层次的信息。

H.263中,句法元素被组织成序列、图像、片、宏块、子宏块五个层次。这样的结构中,每一层头部和它的数据部分形成管理和被管理的强依赖关系,头部的句法元素是该层数据的核心,而一旦头部丢失,数据部分的信息几乎不可能再被正确的解码出来,尤其在序列层和图像层。

[图片上传失败...(image-bb418c-1598062459460)]

[图片上传失败...(image-e96aa6-1598062459460)]


刷新图像概念:实际生活中,一张图片就是一张图像,而在H.264中图像是个集合的概念。

帧、顶场、底场都可以成为图像。一帧就是一幅完整的图像。当采集视频信号时,如果采用逐行扫描,则每次扫描到的信号就是一幅图像,也就是一。当采集视频信号时,如果采用隔行扫描,则扫描下来的一帧图像就被分为了两个部分,这每部分就称为。根据次序分为顶场和底场。帧和场的概念又带来了不同的编码方式:帧编码、场编码。逐行扫描适合运动图像,故对运动图像采用帧编码更好;隔行扫描适合非运动图像,故对非运动图像采用场编码更好。

H.264原始码流

  • 结构:由一个接一个的NALU组成的,而它的功能分为两层,VCL(视频编码层)和NAL(网络提取层)。

    • VCL:包括核心压缩引擎和块,宏块和片的语法级别定义,设计目标是尽可能地独立于网络进行高效的编码。
    • NAL:负责将VCL产生的比特字符串适配到各个的网络和多元环境中,覆盖了所有片级以上的语法级别。
H.264码流
  • 组成:NALU(nal unit) = NALU头 + RBSP

NALU头部类型

enum nal_unit_type_e
{
NAL_UNKNOWN = 0, // 未使用
NAL_SLICE = 1, // 不分区、非 IDR 图像的片(片的头信息和数据)
NAL_SLICE_DPA = 2, // 片分区 A
NAL_SLICE_DPB = 3, // 片分区 B
NAL_SLICE_DPC = 4, // 片分区 C
NAL_SLICE_IDR = 5, / ref_idc != 0 / // IDR 图像中的片
NAL_SEI = 6, / ref_idc == 0 / // 补充增强信息单元
-
参数集是 H.264 标准的一个新概念,是一种通过改进视频码流结构增强错误恢复能力的方法。
NAL_SPS = 7, // 序列参数集 (包括一个图像序列的所有信息,即两个 IDR 图像间的所有图像信息,如图像尺寸、视频格式等)
NAL_PPS = 8, // 图像参数集 (包括一个图像的所有分片的所有相关信息, 包括图像类型、序列号等,解码时某些序列号的丢失可用来检验信息包的丢失与否)
-
NAL_AUD = 9, // 分界符
NAL_FILLER = 12, // 填充(哑元数据,用于填充字节)
/ ref_idc == 0 for 6,9, 10 (表明下一图像为 IDR 图像),11(表明该流中已没有图像),12 /
};
ps: 以上括号()中的为类型描述

在VCL数据传输或存储之前,这些编码的VCL数据,先被映射或封装进NAL单元(简称NALU nal unit)。每个NALU包括一个原始字节序列负荷(RBSP,raw nyte sequence payload),一组对应于视频编码的NALU信息。

RBSP的基本结构是在原始编码数据后面添加了结尾比特。一个bit 1 若干个比特0,以便对齐字节。

一个原始的H.264 NALU单元常由StartCode、NALU Header、NALU Payload三部分组成。

NALU组成
  • StartCode表示一个NALU单元的开始,必须是“00 00 00 01”或“00 00 01”。
    • 每个NALU之间通过startcode(起始码)进行分隔,起始码分成两种:0x000001(3Byte)或者0x00000001(4Byte)。如果NALU对应的Slice为一帧的开始就用0x00000001,否则就用0x000001。
  • NALU Header Type
NALU Header Type

RBSP:NAL包将其负载数据存储在RBSP中,RBSP是系列SODB(string of data bits)。

RBSP
  • 一帧图片和NALU的关联

NALU是H.264在网络上传输的结构,一帧图片经过H.264编码之后,就被编码为一个或多个片(slice),而装着这些片的载体,就是NALU了。

片(slice)与帧(frame)是不同的概念,帧(frame)是用作描述一张图片的,一帧(frame)对应一张图片,而片是H.264提出的新概念,是通过编码图片后切分通过高效的方式整合出来的概念,一张图片至少有一个片或多个片。片都是由NALU装载并进行网络传输,但NALU并不一定是切片,它可能还包含其它用作描述视频的信息。

片的数据结构

上图可以看出,每个分片包含片头和数据两部分数据。

  • 切片,片的作用主要是用作宏块(macroblock)的再提。片之所以被创造出来,主要目的就是限制误码的扩散和传输。

    • 分片头中包含分片类型、分片中的宏块类型,分片帧的数量、分片属于哪个图像及对应帧的设置和参数等信息。
    • 分频数据中则是宏块,就是存储像素数据的地方。
  • 宏块(macroblock)

    • 宏块是视频信息的主要承载着,它包含每个像素的亮度和色度信息。视频编码的主要工作就是提高高校的方式从码流中获取宏块的像素阵列。
    • 宏块的组成:一个宏块由16x6 亮度像素和附加的8x8CB和一个8x8Cr彩色像素块组成,每个图像中,若干宏块被排列成片的形式。
宏块结构图
  • 切片与宏块的关系
    • I片:只包 I宏块,I 宏块利用从当前片中已解码的像素作为参考进行帧内预测(不能取其它片中的已解码像素作为参考进行帧内预测)。
    • P片:可包 P和I宏块,P 宏块利用前面已编码图象作为参考图象进行帧内预测,一个帧内编码的宏块可进一步作宏块的分割:即 16×16、16×8、8×16 或 8×8 亮度像素块(以及附带的彩色像素);如果选了 8×8 的子宏块,则可再分成各种子宏块的分割,其尺寸为 8×8、8×4、4×8 或 4×4 亮度像素块(以及附带的彩色像素)。
    • B片:可包 B和I宏块,B 宏块则利用双向的参考图象(当前和 来的已编码图象帧)进行帧内预测。
    • SP片(切换P):用于不同编码流之间的切换,包含 P 和/或 I 宏块
    • SI片:扩展档次中必须具有的切换,它包含了一种特殊类型的编码宏块,叫做 SI 宏块,SI 也是扩展档次中的必备功能。
码流分层结构

H.264的码流结构并没有那么复杂,编码后视频的每一组图像(GOP, 图片组)都给与传输序列(PPS)和本身这个帧的图像参数(SPS),故如下。

一帧图像

感谢

ffmpeg
ffmpeg 入门教程

推荐阅读更多精彩内容