目录
1.音频
1.1音频基本概念
采样频率:每秒钟采样的点的个数。常用的采样频率有:
22000(22kHz): 无线广播。
44100(44.1kHz):CD音质。
48000(48kHz): 数字电视,DVD。
96000(96kHz): 蓝光,高清DVD。
192000(192kHz): 蓝光,高清DVD。
采样精度(采样深度):每个“样本点”的大小, 常用的大小为8bit, 16bit,24bit。
通道数:单声道,双声道,四声道,5.1声道。
2,比特率:每秒传输的bit数,单位为:bps(Bit Per Second) 间接衡量声音质量的一个标准。
没有压缩的音频数据的比特率 = 采样频率 * 采样精度 * 通道数。
码率: 压缩后的音频数据的比特率。常见的码率:
96kbps: FM质量
128-160kbps:一般质量音频。
192kbps: CD质量。
256-320Kbps:高质量音频
AAC通常压缩比为18:1,也有资料说为20:1,远胜mp3,而音质由于采用多声道,和使用低复杂性的描述方式,使其比几乎所有的传统编码方式在同规格的情况下更胜一筹.
码率越大,压缩效率越低,音质越好,压缩后数据越大。
码率 = 音频文件大小/时长。
Aac一个音频帧有1024个采样点, 所以 44.1K采样率 aac 通常1S含有44帧(44.1k / 1024 = 44.1帧))
比特率:每秒传输的bit数,单位为:bps(Bit Per Second)。
间接衡量声音质量的一个标准。
没有压缩的音频数据的比特率 = 采样频率 * 采样精度 * 通道数。
码率: 压缩后的音频数据的比特率。常见的码率:
96kbps:FM质量
128-160kbps:一般质量音频。
192kbps:CD质量。
256-320Kbps:高质量音频
码率越大,压缩效率越低,音质越好,压缩后数据越大。
码率 = 音频文件大小/时长。
帧:音频的帧的概念没有视频帧那么清晰,几乎所有视频编码格式都可
以简单的认为一帧就是编码后的一张图像。
帧长:
(1)可以指每帧采样数播放的时间, mp3 48k, 1152个采样点,每帧则为
24ms;aac则是每帧是1024个采样点。 攒够一帧的数据才送去做编码
(2)也可以指压缩后每帧的数据长度。所以讲到帧的时候要注意他适用
的场合。
每帧持续时间(秒) = 每帧采样点数 / 采样频率(HZ)
1.2音频编码原理
数字音频压缩编码采取去除声音信号中冗余成分的方法来实现。所谓冗余成分指的是音频中不能被人耳感知到的信号,它们对确定声音的音色,音调等信息没有任何的帮助。
这就是人耳听觉的掩蔽效应,主要表现在频谱掩蔽效应和时域掩蔽效应。
音频压缩分为两种,其基本的方法都是消除冗余信息,在这里的冗余信息指的是
人的听觉范围以外的音频信息: (1)有损压缩:消除冗余信息后,无法还原出原声。 (2)无损压缩:消除冗余信息后仍能够还原出原声
有损压缩使用信号遮蔽的方法,信号遮蔽使用的两种效应:
(1)频域遮蔽:不同频率的声音产生遮蔽效应
(2)时域遮蔽:声音强度高的在前后时间内将声音强度低的进行遮蔽
同一段频率 上音量高的 会遮住音量低的。但是不同频率 不会遮挡
比如两个女生吵架,频率相近,声音小的 会被盖住。
但男生和女生吵架,即使男生声音低一点,也不会被完全遮住,因为频率不同
压缩越小越好,速率越快越好。在两者之间追求平衡
消除冗余信息--有损压缩,无法还原成和原来一摸一样了
以下两种技术:先有损 删除冗余信息,然后剩下的有效信息 要无损压缩。
冗余信息:比如人的听力范围(20hz-20Khz)以外的数据
有损压缩
去除冗余信息的技术方法:去除人听力范围以外的数据,频域遮蔽,时域遮蔽。
一段主要声音前(一般50ms)、后(可达200ms),次要声音可能被遮蔽
音频编码过程
心理声学模型-去除听力范围以外的数据
常见的音频编码器
( 1) OPuS:目前较新的音频编码器,webRTC默认使用0PUS,
( 2) AAC:在直播系统中应用比较广泛的编码器;
(3) ogg:软件牧费,应用比较少;
(4) Speez:显著的特点是支持回音消除,是七八年前应用非常广泛的编码器;
(5)G.711:固话使用的窄带音频编码器,但是音损非常严重,不适合实时通信;(6)其他: iLBC、AME。
二、不同音频编码器的音频编码质量比较
OPUS对不同的网络质量(窄带、宽带、超宽带、全带)都有对应的码流选择三、不同音频编码器的音频编码码率
不同编码器在不同的延时对码率的支持范围。
aac 取代mp3.(音质更好 压缩率更高)
opus逐渐会取代aac,实时一般用opus比如在线课堂等。
这几种的 优缺点比较。
主要研究aac和opus即可
音频编码质量对比:
纵轴是音频质量,窄带、宽带、超宽带、全波段、全波段立体声
横轴是码流大小
opus适用范围非常广
AAC规格描术
AAC LC : (Low Complexity)低复杂度规格,码流是128k,音质好。AAC HE:等于AAC LC + SBR(Spectral Band Replication)。其核心思相是按频谱分保存。低频编码保存主要成分,高频单独放大编码保存音质。码流在64k左右。
AAC HE V2:等于AAC LC +SBR + PS(Parametric Stereo)。其核心思相是双声道中的声音存在某种相似性,只需存储一个声道的全部信息,然后,花很少的字节用参数描述另一个声道和它不同的地方。
aac前边一般都是使用一个adts头,更适合流式传输。
如果不能播放一般是 adts头有问题
adts 结构
AAC格式
ADIF ( Audio Data Interchange Format )
这种格式的特征是可以确定的找到这个音频数据的开始,只能从头开始解码,不能在音频数据流中间开始。这种格式常用在磁盘文件中
ADTS ( Audio Data Transport Stream )
这种格式的特征是每一帧都有一个同步字,所以可以在音频流的任何位置开始解码。它类似于数据流格式。ADTS每一帧数据都有头, 所以比ADIF大.
1.3 ADTS
1.3.1 ADTS工具
ADTS是一种音频传输格式
1.ADTS是个啥
ADTS全称是(Audio Data Transport Stream),是AAC的一种十分常见的传输格式。
记得第一次做demux的时候,把AAC音频的ES流从FLV封装格式中抽出来送给硬件解码器时,不能播;保存到本地用pc的播放器播时,我靠也不能播。当时崩溃了,后来通过查找资料才知道。一般的AAC解码器都需要把AAC的ES流打包成ADTS的格式,一般是在AAC ES流前添加7个字节的ADTS header。也就是说你可以吧ADTS这个头看作是AAC的frameheader。
2.ADTS内容及结构
ADTS 头中相对有用的信息 采样率、声道数、帧长度。想想也是,我要是解码器的话,你给我一堆得AAC音频ES流我也解不出来。每一个带ADTS头信息的AAC流会清晰的告送解码器他需要的这些信息。
一般情况下ADTS的头信息都是7个字节,分为2部分:
adts_fixed_header();
adts_variable_header();
syncword :同步头 总是0xFFF, all bits must be 1,代表着一个ADTS帧的开始
ID:MPEG Version: 0 for MPEG-4, 1 for MPEG-2
Layer:always: '00'
profile:表示使用哪个级别的AAC,有些芯片只支持AAC LC 。在MPEG-2 AAC中定义了3种:
profile的值等于 Audio Object Type的值减1 profile = MPEG-4 Audio Object Type - 1
MPEG-4 Audio Object Types: 主要 2 aaclc; 5 sbr=aac he v1; 29:ps=aac he v2
0: Null
1: AAC Main
2: AAC LC (Low Complexity)
3: AAC SSR (Scalable Sample Rate)
4: AAC LTP (Long Term Prediction)
5: SBR (Spectral Band Replication)
6: AAC Scalable
7: TwinVQ
8: CELP (Code Excited Linear Prediction)
9: HXVC (Harmonic Vector eXcitation Coding)
10: Reserved
11: Reserved
12: TTSI (Text-To-Speech Interface)
13: Main Synthesis
14: Wavetable Synthesis
15: General MIDI
16: Algorithmic Synthesis and Audio Effects
17: ER (Error Resilient) AAC LC
18: Reserved
19: ER AAC LTP
20: ER AAC Scalable
21: ER TwinVQ
22: ER BSAC (Bit-Sliced Arithmetic Coding)
23: ER AAC LD (Low Delay)
24: ER CELP
25: ER HVXC
26: ER HILN (Harmonic and Individual Lines plus Noise)
27: ER Parametric
28: SSC (SinuSoidal Coding)
29: PS (Parametric Stereo)
30: MPEG Surround
31: (Escape value)
32: Layer-1
33: Layer-2
34: Layer-3
35: DST (Direct Stream Transfer)
36: ALS (Audio Lossless)
37: SLS (Scalable LosslesS)
38: SLS non-core
39: ER AAC ELD (Enhanced Low Delay)
40: SMR (Symbolic Music Representation) Simple
41: SMR Main
42: USAC (Unified Speech and Audio Coding) (no SBR)
43: SAOC (Spatial Audio Object Coding)
44: LD MPEG Surround
45: USAC
sampling_frequency_index:表示使用的采样率下标,通过这个下标在 Sampling Frequencies[ ]数组中查找得知采样率的值。
There are 13 supported frequencies:
0: 96000 Hz
1: 88200 Hz
2: 64000 Hz
3: 48000 Hz
4: 44100 Hz
5: 32000 Hz
6: 24000 Hz
7: 22050 Hz
8: 16000 Hz
9: 12000 Hz
10: 11025 Hz
11: 8000 Hz
12: 7350 Hz
13: Reserved
14: Reserved
15: frequency is written explictly
channel_configuration: 表示声道数
0: Defined in AOT Specifc Config
1: 1 channel: front-center
2: 2 channels: front-left, front-right
3: 3 channels: front-center, front-left, front-right
4: 4 channels: front-center, front-left, front-right, back-center
5: 5 channels: front-center, front-left, front-right, back-left, back-right
6: 6 channels: front-center, front-left, front-right, back-left, back-right, LFE-channel
7: 8 channels: front-center, front-left, front-right, side-left, side-right, back-left, back-right, LFE-channel
8-15: Reserved
frame_length : 一个ADTS帧的长度包括ADTS头和AAC原始流.
adts_buffer_fullness:0x7FF 说明是码率可变的码流
1.4 音频重采样
音频的三元组:采样率、采样大小、声道数
什么事音频重采样?将音频三元组的值转成另一组值。
为什么要重采样?(1〉从设备中采集的音频数据与编码器要求的数据格式不一致y(2〉扬声器要求的音频数据与要播放的音频数据不一致,(3)更方便运算〈回声消除时,将多通道重采样成单通道方便运算。)
重采样的步骤:(1)创建重采样上下文,(2〉设置参数;(3)初始化重采样;(4)进行重采样。重要的API: (1) swr_alloc_set_opts; (2) swr_init; (3) swr_convert; (d〉 swr_freeo
为什么要重采样:
设备采集数据与编码设备要求的数据不一致;(采集的是44.1K 32bit 2声道, aac编码44.1K 采样大小16bit, 双声道);
播放设备 要求的数据与待播放数据不一致;(mac win 安卓 ios设备可播放的参数都可能不一致)硬件设备的参数 一般是固定的, 所以各种数据都要重采样成硬件设备的参数;更方便运算(比如混音消除时 变成单个声道)
2. 视频
2.1基本概念
像素--- RGB---分辨率(宽*高像素个数)---图像
像素位深:每个像素用几个bit表示
1.非16:9或者4:3的视频是非标准的视频,渲染容易出问题,最好先转化成标准宽高比.现在主要是16:9
2.XXX P值得是高,然后按宽高比计算宽
360p= 640*360
720=1280*720
帧率:每秒钟采集或播放的图像个数。
帧率和分辨率的关系:帧率决定了视频的平滑度;分辨率决定了清晰度。
电影一般都是 60帧以上
直播上课 一般30帧
实时通信一般15帧
动画的帧率是25帧
使用RGB24(888)编码
RGB码流=分辨率*3Bytes*帧率*8bit
视频码流的计算
(1)分辨率,X轴的像素个数(宽)乘以 Y轴的像素个数(高)
常见的宽高比是:16:9/4:3
常见的分辨率:360P(640*360)/720P(1280*720)/1K()/2K,这些分辨率都是16:9的.
4:3常见的是640*480,320*160
(2)帧率,每秒钟采集或者播放图像的个数。
动画的帧率是25帧/s;
常见的帧率:15帧/s,30帧/s,60帧/s
实时通信一般是15帧/s(帧率越大,占用的传输带宽就越大)
录课一班30帧/s能够满足需求;
电影一般在60帧/s;
要求的平滑度越高,帧率就越大。
要求的清晰度越高,分辨率就要越高。
图像的显示,分以下几种情况:
1、图像大小等于显示区域的大小
2、图像大小 小于 显示区域的大小(需要进行拉伸或者留白处理)。如果留白的话,一般是左右留白,很少有上下留白的。
3、图像大于显示区域(需要进行缩小或者截断剪切处理)
标准的YUV(也称YCbCr,Blue,Read)格式是YUV4:2:0。 YUV420 一般播放器都支持. 422和444有些播放器可能不支持. 数据量少,且向前兼容电视格式 所以需要yuv
电视是yuv,显示器是rgb。
yuv是采集数据,转换成rgb才能展示
为何需要yuv:因为yuv存储的数据要比rgb少很多
u分量 是 cb分量 blue, Y分量就是黑白色的图片
V分量 是cr分量 red
YUV介绍wiki:https://en.wikipedia.org/wiki/YUV
播放器兼容,yuv420都支持,
其他两种可能有部分播放器不支持
1) YUV4:4:4一幅图的数据量 与RGB相同(以1280*720为例)为:*3
2) YUV4:2:2 (1 + 2/4 + 2/4 ) * 1280*720
3) YUV4:2:0 (1 + 1/4 + 1/4 ) * 1280*720 其实是4:1:1?? = 1.5/3 = 0.5* RGB数据量
yuv420存储格式
分层存储,非常方便兼容黑白电视。
黑白电视只需要读取前边的 y分量数据.安卓:nv21 ios:yv12
YUV4:2:0是分层存储的,即现存储Y分量,然后存储U分量,最后存储V分量。
YUV存储格式:
(1)planar(平面),分成两种模式
1、I420:YYYYYYYY UU VV -> YUV420P
2、YV12:YYYYYYYY VV UU -> YUV420P
以上两个的主要区别是现存U还是现存V。IOS是YV12格式存储的;android系统一般都是NV21存储。
(2)packed(打包)
NV12:YYYYYYYY UVUV -> YUV420SP
NV21:YYYYYYYY VUVU -> YUV420SP
2.3 h264原理
h264 压缩比 约1/100
yuv420 640*480 帧率15帧,原始码流640*480 * 1.5 * 15 *8=55Mbps而h264建议 500kbps. ---压缩55Mbps*1/100=550kbps
GOP:一组差别小的 强相关的视频帧
在视频编码序列中,GOP即Group of picture(图像组),指两个I帧之间的距离,
Reference(参考周期)指两个P帧之间的距离。⼀个I帧所占⽤的字节数⼤于⼀个P帧,⼀个P帧所占⽤的字节数⼤于⼀个B帧。
所以在码率不变的前提下,GOP值越⼤,P、B帧的数量会越多,平均每个I、P、B帧所占⽤的字节数就越多,也就更容易获取较好的图像质量;Reference越⼤,B帧的数量越多,同理也更容易获得较好的图像质量。
需要说明的是,通过提⾼GOP值来提⾼图像质量是有限度的,在遇到场景切换的情况时,
H.264编码器会⾃动强制插⼊⼀个I帧,此时实际的GOP值被缩短了。另⼀⽅⾯,在⼀个GOP
中,P、B帧是由I帧预测得到的,当I帧的图像质量⽐较差时,会影响到⼀个GOP中后续P、B帧的图像质量,直到下⼀个GOP开始才有可能得以恢复,所以GOP值也不宜设置过⼤。
同时,由于P、B帧的复杂度⼤于I帧,所以过多的P、B帧会影响编码效率,使编码效率降低.
另外,过长的GOP还会影响Seek操作的响应速度,由于P、B帧是由前⾯的I或P帧预测得到的,所以Seek操作需要直接定位,解码某⼀个P或B帧时,需要先解码得到本GOP内的I帧及之前的N个预测帧才可以,GOP值越,需要解码的预测帧就越多,seek响应的时间也越长。
2.3.1常用分辨率、帧率、码率
通常来讲,视频参数的选择要根据产品实际情况来确定,比如,如果一对一教学场景中 ,老师和学生的窗口比较大,要求的分辨率会高一点,随之帧率和码率也高;如果是一对四, 老师和学生的窗口都比较小,分辨率可以低一点,对应的码率帧率也会低一点,以减少编解码的资源消耗和缓解下行带宽压力。一般可按下列场景中的推荐值进行设置。
二人视频通话场景:
分辨率 320 × 240、帧率 15 fps、码率 200 Kbps
分辨率 640 × 360、帧率 15 fps、码率 400 Kbps
多人视频通话场景:
分辨率 160 × 120、帧率 15 fps、码率 65 Kbps
分辨率 320 × 180、帧率 15 fps、码率 140 Kbps
分辨率 320 × 240、帧率 15 fps、码率 200 Kbps
编码帧分类
B帧 压缩率高,但是耗cpu,所以实时通信 不常用
编码帧分类:I帧一般是GOP中第一帧,不参考别的帧。P帧占I帧一半大小。B帧占I帧1/4的大小,但是耗时,占用CPU,会导致延时增加,实时通讯(音视频会议,在线教育)一般只有I、P帧,音视频转码服务会大量使用B帧。
IDR帧核⼼作⽤是,是为了解码的重同步,当解码器解码到 IDR 图像时,⽴即将参考帧队列清 空,将已解码的数据全部输出或抛弃,重新查找参数集,开始⼀个新的序列。这样,如果前⼀个序列出现重⼤错误,在这⾥可以获得重新同步的机会。IDR图像之后的图像永远不会使⽤
IDR帧,解码器立即刷新帧,防止错误的传播。如果没有idr帧 中间只要错一帧,后边就全部无法解析了。
IDR帧可以防止错误传播
IDR帧,解码器立即刷新帧,防止错误的传播。如果没有idr帧 中间只要错一帧,后边就全部无法解析了。
b帧: 1/4左右,但耗诗 占用cpu,会导致延迟增加。所以实时通讯,音视频会议一般只有i p帧,转码服务的会大量使用b帧,节约空间。
编码帧分类:I帧一般是GOP中第一帧,不参考别的帧。P帧占I帧一半大小。B帧占I帧1/4的大小,但是耗时,占用CPU,会导致延时增加,实时通讯(音视频会议,在线教育)一般只有I、P帧,音视频转码服务会大量使用B帧。
I帧: 帧内编码帧 intra picture
P帧:前向预测编码帧 predictive-frame
B帧:双向预测帧 bi-directional interpolated prediction frame
1.gop1 解帧顺序:I帧-P-BBB。但播放时等GOP所有帧解析完,然后IBBBP播放。
I帧不依赖于其他,p帧向前依赖I, B前依赖I 后依赖P。BBB之间不互相依赖。
3. 一般是 一个I,3个B, 1个P
Sps是设置GOP的参数, pps设置单个图像的参数
2.3.2编码技术
H264压缩技术是一个技术合集.H264进行编解码是以宏块为单位进行处理的,以像素为单位效率太低了.
有损压缩:帧内压缩、帧间压缩
无损压缩:DCT、CABAC压缩
1有损压缩
1.1)帧内压缩 帧内预测 有损压缩
存储的数据 就是:预测模式数据 + 预测残差值数据
帧内压缩理论,用于压缩I帧 IDR帧.
帧内压缩的理论: 以此为理论 以一个宏块为基础预测下一个宏块(上 下 左 右)
帧内预测 9中模式,h264有算法决策使用哪种模式。每个宏块使用的模式 都可能是不同的
1.亮度块和色度块 是分开预测的
2.预测模式信息+帧内预测残差值
3.这些都是解决I帧的 压缩技术
1.2)帧间压缩
帧间压缩:一个GOP内相邻的帧,进行帧间压缩。 参考帧:后面的帧要参考前面的帧进行压缩。
运动估计:帧间压缩最重要的技术.指的是一个过程,通过宏块匹配的方法,最终找到运动的矢量。也就是宏块查找的过程,用于查找相同的宏块(比如相似度达到95%以上相似就认为是相同的)
运动补偿:计算残差值,在解码时 把残差值补上
帧间压缩理论原理:B P帧
帧间压缩比 帧内压缩要大。
所以I帧太多, 数据比较大。
B帧多,数据小,但解析算法复杂,耗cpu
1.同一个gop内 帧之间压缩
2.运动估计
花屏原因 主要是丢P帧和B帧.
卡顿:为避免花瓶 丢帧时直接丢掉改组gop。
花屏和卡顿 无法兼顾,要么花屏 要么卡顿。看自己的业务选择
2. 无损压缩
进行无损压缩之前,先要DCT变换:经过有损压缩之后的数据 是分散的二维图表的各个节点上的,数据分散 压缩比较困难.DCT变换把分散的数据集中到一块区域.
1) VLC压缩
即可变长的压缩编码,高频数据块采用少的数据量编码表示,低频数据块采用多的数据量编码表示,就可以将目标数据中的高频字符占用的体积大大压缩
2) CABAC 上下文适配的二进制算术编码压缩技术,属于无损压缩,在H264的编码过程中常用于 DCT (将分散的数据集中到一块儿)变换之后的进一步数据压缩。
H264的编码流程图(最下面一行是解码流程)。(Fn:当前帧,ME运动评估(宏块匹配查找)、MC运动矢量、T:DCT转换、Q量化(无损编码)、choose intra prediction帧内压缩选择的帧内预测模式,intra prediction帧内预测)
2.3.3H264码流结构
h264码流分层 网络传输协议层 NAL层 Network Abstraction Layer ,视频数据网络抽象层 接收端可以区分有没有乱序 丢包重传等错误 出现错误的时候可以通知发送者重新传 vcl 层 视频编码层.
分层存储
nal层 网络传输功能,处理 乱序 丢包 重传等;
vcl层:数据编码层
码流基本概念:
SODB 按bit编码,vcl层产生
RBSP sodb字节补齐,查3bit 则补100,差5bit则补10000
NALU NAL header(1B)+RBSP
一般是一张图用一个slice,但可以用多个slice。
一个视频包含多个帧(压缩后的图像),一个帧可有一个或多个slice。一个slice包含多个宏块,每个宏块又可划分成多个子块
一个packet里可能包含多个帧 比如包含sps pps sei i/b/p帧等
2.3.4 sps
profile 描述压缩特性
level 是视频的描述,视频的码率
sps/pps/sliceheader 可以知道分辨率 码率 解码和播放顺序
通过sps 可以知道profile,level,图像格式,帧率 分辨率,码率,最大帧数量,参考帧帧数,帧显示序号
Sps两个重要参数: profile和level
profile右侧 向上发展 压缩特性
向左侧发展的特性 视频level
通常用得比较多的是MAIN Profile
每一级level对应的应该设置的bitrate,分辨率,每秒 帧数
Sps参数:分辨率相关
SPS参数:帧相关
1)最大帧数:log2_max_frame_num_minus4的值应在0-12范围内(包括0和12),这个句法元素主要是为读取另一个句法元素 frame_num 服务的,frame_num 是最重要的句法元素之一,它标识所属图像的解码顺序 。这个句法元素同时也指明了 frame_num 的所能达到的最大值: MaxFrameNum = 2*exp( log2_max_frame_num_minus4 + 4 ) 。
2).最大参考帧数max_num_ref_frames,解码器设置缓冲区大小用到
3).显示帧序号pic_order_cnt_type, 计算帧显示顺序
SPS参数:帧率相关
2.3.5 PPS
2.3.6 slice header
1.帧类型 I B P。 每个slice是什么帧?一个slice是一个帧吗?
2.GOP中解码顺序
3.预测权重
4.滤波
2.3.7 H264分析工具
Elecard Sream Eye 收费 专业的 一般用这个
CodecVisa 也是收费
雷神的工具 免费specialvh2 64.exe he videoeye
videoeye 一般用这个就够了,但没有sps pps
specialV 只能打开h264文件,可以查看sps pps
视频中Sream Eye 和 specialV对于sps参数的解析
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。