音视频编辑码常识
基本概念
实时音视频通讯 = 音视频处理 + 网络传输。包括采集、编码、网络传输、解码、播放等环节
视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。
视频播放器原理
- 解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如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数据。
- 视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
流媒体协议
流媒体协议是服务器与客户端之间通信遵循的规定。
当前网络上主要的流媒体协议
封装格式(容器)
封装格式也称多媒体容器,它只是为多媒体编码提供了一个“外壳”,也就是将所有的处理好的视频、音频或字幕都包装到一个文件容器内呈现给观众,这个包装的过程就叫封装。
常见的封装格式
编解码
编解码器(codec)指的是一个能够对一个信号或者一个数据流进行变换的设备或者程序。这里指的变换既包括将 信号或者数据流进行编码(通常是为了传输、存储或者加密)或者提取得到一个编码流的操作,也包括为了观察或者处理从这个编码流中恢复适合观察或操作的形式的操作。编解码器经常用在视频会议和流媒体等应用中。
H264
概述
H264 无疑是目前应用最广泛的编码技术。一些比较优秀的开源库x264/openh264, ffmpeg等让人们处理h264编解码变得相对容易。为了能更好地理解和处理h264问题,还是有必要了解相关的原理
H264压缩技术主要采用了以下几种方法对视频数据进行压缩:
帧内预测压缩,解决的是空域数据冗余问题。
帧间预测压缩(运动估计与补偿),解决的是时域数据冗徐问题。
整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化。
CABAC熵编码, 对量化后的系数进一步的压缩
经过压缩后的帧分为:I帧,P帧和B帧:
I帧:关键帧,采用帧内压缩技术。
P帧:向前参考帧,在压缩时,只参考前面已经处理的帧。采用帧音压缩技术。
B帧:双向参考帧,在压缩时,它即参考前而的帧,又参考它后面的帧。采用帧间压缩技术。
宏块
宏块是编码标准的基本处理单元,通常它的大小也为16x16像素。16X16 的宏块上可以划分出更小的子块。子块的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4。这主要看图像细节的丰富程度。
划分宏块
H264默认是使用 16X16 大小的区域作为一个宏块,也可以划分成 8X8 大小。
划分好宏块后,计算宏块的像素值
以此类推,计算一幅图像中每个宏块的像素值,所有宏块都处理完后如下面的样子。
划分子块
H264对比较平坦的图像使用 16X16 大小的宏块。但为了更高的压缩率,还可以在 16X16 的宏块上更划分出更小的子块。子块的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4非常的灵活。
上幅图中,红框内的 16X16 宏块中大部分是蓝色背景,而三只鹰的部分图像被划在了该宏块内,为了更好的处理三只鹰的部分图像,H264就在 16X16 的宏块内又划分出了多个子块。
这样再经过帧内压缩,可以得到更高效的数据。下图是分别使用mpeg-2和H264对上面宏块进行压缩后的结果。其中左半部分为MPEG-2子块划分后压缩的结果,右半部分为H264的子块划压缩后的结果,可以看出H264的划分方法更具优势。
宏块划分好后,就可以对H264编码器缓存中的所有图片进行分组了。
帧分组
对于视频数据主要有两类数据冗余,一类是时间上的数据冗余,另一类是空间上的数据冗余。其中时间上的数据冗余是最大的。下面我们就先来说说视频数据时间上的冗余问题。
为什么说时间上的冗余是最大的呢?假设摄像头每秒抓取30帧,这30帧的数据大部分情况下都是相关联的。也有可能不止30帧的的数据,可能几十帧,上百帧的数据都是关联特别密切的。
对于这些关联特别密切的帧,其实我们只需要保存一帧的数据,其它帧都可以通过这一帧再按某种规则预测出来,所以说视频数据在时间上的冗余是最多的。
为了达到相关帧通过预测的方法来压缩数据,就需要将视频帧进行分组。那么如何判定某些帧关系密切,可以划为一组呢?我们来看一下例子,下面是捕获的一组运动的台球的视频帧,台球从右上角滚到了左下角。
H264编码器会按顺序,每次取出两幅相邻的帧进行宏块比较,计算两帧的相似度。如下图:
通过宏块扫描与宏块搜索可以发现这两个帧的关联度是非常高的。进而发现这一组帧的关联度都是非常高的。因此,上面这几帧就可以划分为一组。其算法是:在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内,我们认为这样的图可以分到一组。
在这样一组帧中,经过编码后,我们只保留第一帧的完整数据,其它帧都通过参考上一帧计算出来。我们称第一帧为IDR/I帧,其它帧我们称为P/B帧,这样编码后的数据帧组我们称为GOP。
运动估计与补偿
在H264编码器中将帧分组后,就要计算帧组内物体的运动矢量了。还以上面运动的台球视频帧为例,我们来看一下它是如何计算运动矢量的。
H264编码器首先按顺序从缓冲区头部取出两帧视频数据,然后进行宏块扫描。当发现其中一幅图片中有物体时,就在另一幅图的邻近位置(搜索窗口中)进行搜索。如果此时在另一幅图中找到该物体,那么就可以计算出物体的运动矢量了。
运动矢量计算出来后,将相同部分(也就是绿色部分)减去,就得到了补偿数据。我们最终只需要将补偿数据进行压缩保存,以后在解码时就可以恢复原图了。压缩补偿后的数据只需要记录很少的一点数据。如下所示:
我们把运动矢量与补偿称为帧间压缩技术,它解决的是视频帧在时间上的数据冗余。除了帧间压缩,帧内也要进行数据压缩,帧内数据压缩解决的是空间上的数据冗余。
帧内预测,计数残差值
H264的帧内压缩与JPEG很相似。一幅图像被划分好宏块后,对每个宏块可以进行 9 种模式的预测。找出与原图最接近的一种预测模式。
然后,将原始图像与帧内预测后的图像相减得残差值。
再将我们之前得到的预测模式信息一起保存起来,这样我们就可以在解码时恢复原图了
对残差数据做DCT
可以将残差数据做整数离散余弦变换,去掉数据的相关性,进一步压缩数据。如下图所示,左侧为原数据的宏块,右侧为计算出的残差数据的宏块。
将残差数据宏块数字化后如下图所示:
将残差数据宏块进行DCT 转换。
去掉相关联的数据后,我们可以看出数据被进一步压缩了。
CACBC
CABAC属于无损压缩技术。
给高频数据短码,给低频数据长码
H264分层结构
H264的主要目标是为了有高的视频压缩比和良好的网络亲和性,为了达成这两个目标,H264的解决方案是将系统框架分为两个层面,分别是视频编码层面(VCL)和网络抽象层面(NAL)
H.264原始码流(裸流)是由一个接一个NALU组成,它的功能分为两层,VCL(视频编码层)和NAL(网络抽象层).
VCL(Video Coding Layer) + NAL(Network Abstraction Layer).
VCL:包括核心压缩引擎和块,宏块和片的语法级别定义,设计目标是尽可能地独立于网络进行高效的编码;
NAL:负责将VCL产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别。
因为H264最终还是要在网络上进行传输,在传输的时候,网络包的最大传输单元是1500字节,一个H264的帧往往是大于1500字节的,所以需要将一个帧拆成多个包进行传输。这些拆包、组包等工作都在NAL层去处理。
H264码流结构
在VCL进行数据传输或存储之前,这些编码的VCL数据,被映射或封装进NAL单元(NALU)。
H264码流是由一个个的NAL单元组成,其中SPS、PPS、IDR和SLICE是NAL单元某一类型的数据。
H264的NAL单元
一个NALU = 一组对应于视频编码的NALU头部信息 + 一个原始字节序列负荷(RBSP,Raw Byte Sequence Payload).
如图所示,下图中的NALU的头 + RBSP 就相当于一个NALU(Nal Unit),每个单元都按独立的NALU传送。H.264的结构全部都是以NALU为主,理解了NALU,就理解了H.264的结构。
一个原始的H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成,其中 Start Code 用于标示这是一个NALU 单元的开始,必须是”00 00 00 01” 或”00 00 01”
3字节的0x000001只有一种场合下使用,就是一个完整的帧被编为多个slice的时候,包含这些slice的nalu使用3字节起始码。其余场合都是4字节的。
NAL Header
NAL单元的头部是由forbidden_bit(1bit),nal_reference_bit(2bits)(优先级),nal_unit_type(5bits)(类型)三个部分组成的。
1、F(forbiden):禁止位,占用NAL头的第一个位,当禁止位值为1时表示语法错误;
2、NRI:参考级别,占用NAL头的第二到第三个位;值越大,该NAL越重要。
3、Type:Nal单元数据类型,也就是标识该NAL单元的数据类型是哪种,占用NAL头的第四到第8个位;
F
1bit
forbidden_zero_bit,H.264定义此位必须为0
NRI
2bit
nal_ref_idc,0-3,标识这个NALU的重要性(3最高)
Type
5bit
nal_unit_type,NALU单元的类型
0
未使用
1
未使用Data Partitioning、非IDR图像
2
未使用Data Partitioning、且为Slice A
3
未使用Data Partitioning、且为Slice B
4
未使用Data Partitioning、且为Slice C
5
IDR图像中的Slice
6
补充增强信息单元(SEI)
7
序列参数集(Sequence Parameter Set, SPS)
8
图像参数集(Picture Parameter Set, PPS)
9
分界符
10
序列结束
11
码流结束
12
填充
13…23
保留
24…31
未使用
举例来说:
00 00 00 01 06: SEI信息
00 00 00 01 67: 0x67&0x1f = 0x07 :SPS
00 00 00 01 68: 0x68&0x1f = 0x08 :PPS
00 00 00 01 65: 0x65&0x1f = 0x05: IDR Slice
在具体介绍NAL数据类型前,有必要知道NAL分为VCL和非VCL的NAL单元。其中SPS、SEI、PPS等非VCL的NAL参数对解码和显示视频都是很有用的。
而另外一个需要了解的概念就是参数集(Parameter sets),参数集是携带解码参数的NAL单元,参数集对于正确解码是非常重要的,在一个有损耗的传输场景中,传输过程中比特列或包可能丢失或损坏,在这种网络环境下,参数集可以通过高质量的服务来发送,比如向前纠错机制或优先级机制。
SODB与RBSP
SODB数据比特串->是编码后的原始数据.
RBSP原始字节序列载荷->在原始编码数据的后面添加了结尾比特。一个bit“1”若干比特“0”,以便字节对齐。
RBSP类型
描述
参数集PS
序列的全局参数,如图像尺寸、视频格式等等
增强信息SEI
视频序列解码的增强信息
图像定界符PD
视频图像的编辑
编码片
片的头信息和数据
数据分割
DP片层的数据,用于错误恢复解码
序列结束符
表明下一图像为IDR图像
流结束符
表明该流中已经没有图像
填充数据
哑元数据,用于填充字节
(1)SODB ,String Of Data Bits 原始数据比特流
因为它是流的形式,所以长度不一定是8倍数,它是由 VLC 层产生的。由于我们计算机是以8倍数去处理数据所以计算机在处理H264时,就需要 RBSP。
(2)RBSP,SODB + tailing bits (原始字节序列载荷)
由于它是一个压缩流,SODB 不知道是在何处结束,所以算法在SODB最后一位补一个1,没有按字节对齐的则补 0。
(3)EBSP (扩展字节序列载荷)
在生成压缩流之后,在每一帧的开头加一个起始位,这个起始位一般是 00 00 00 01 或者是 00 00 01。所以在h264码流中规定每有两个连续的00 00,就增加一个0x03。
转码
指将一段多媒体包括音频、视频或者其他的内容从一种编码格式转换成为另外一种编码格式。
帧
是影像中常用的最小单位,相当于电影中胶片的每一格镜头,一帧就是一副静止的画面,连续的帧就形成了视频。
帧率
是称为帧的位图图像连续出现在显示器上的频率(速率)。该术语同样适用于胶片和摄像机,计算机图形和动作捕捉系统。帧速率也可以称为帧频率,并以赫兹(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
色彩空间
RGB色彩空间
人眼看到的物体颜色,是光源照射到物体,物体吸收(还有透射)部分颜色的光,然后从物体表面反射的光线进入人眼后人眼得到的色彩感觉。 人眼看到物体为黑色,是因为物体将光线完全吸收,没有光从物体表面反射出来(例如白天我们看一件黑衣服);或者没有任何光线照射到物体(例如黑底我们看一张白纸)。 人眼看到物体为白色,是因为在白光源照射下,物体不吸收光线而将光线全部反射(例如白天我们看一张白纸)。 颜色与光源和物体的吸色特性密切相关,基于此,引出混色方法中的加色法和减色法。
加色法利用光源发射特性,将各分色的光谱成分相加得到混合颜色。RGB色彩空间采用加色法。当无任何光线照射时,R、G、B三种颜色分量都为0时,物体呈现黑色;当R、G、B三种颜色分量达到最大时,物体不吸收光线只反射的情况下,物体呈现白色。我们称黑色为最暗,白色为最亮,要达到最亮状态,需要三色分量最大程度混合,因此称为加色。
YUV色彩空间
YUV颜色空间是PAL、NTSC、SCEAM三大视频标准使用的颜色空间,主要应用于视频系统。YUV色彩空间中,Y表示亮度信息,U和V表示色度(色调和饱和度)信息。使用YUV色彩空间,后期出现的彩色电视系统和早期的黑白电视系统兼容,黑白电视机可以只处理彩色电信信号中的Y分量,而彩色电视机接收黑白电视信号并显示也没有任何问题。 YUV颜色空间和RGB颜色空间可以根据公式相互转换。