本文梳理了音视频编程开发者须要了解的基本概念
访问 个人博客了解更多
本文梳理了音视频编程开发者须要了解的基本概念,固然,有的人一开始看着干巴巴的理论,感到困乏,倒是一个喜欢动手实践的开发者,那么先实践 ffmpeg的C语言编程入门,而后再来看理论篇更好了。算法
音频技术是为了采样、存储、播放"声学现象"而存在的,详细一点,是模拟信号与数字信号转换;在人耳可听的时域与频域的范围内,进行压缩、转码,在数据大小与音质的取舍中存储音频文件;播放时解读文件的音频参数,进行转码。编程
声音是有物体振动而产生的,是一种压力波。网络
声音的振动会引发空气有节奏的振动,是周围的空气发生疏密变化,造成疏密相间的纵波
经过上一句话,容易理解声波三要素:工具
回声的区分:两道声音传入人耳的时差小于 80 毫秒,人耳便没法区分这两道声音。性能
人耳可接收的频率范围:20Hz~20kHz测试
数字音频的三个要素: 采样、量化、编码优化
音频文件的原始格式,PCM, WAV编码
PCM + WAV header (44 bit) = WAVspa
PCM 全称 Pulse Code Modulation,脉冲编码调制,是音频的裸数据,PCM 文件缺乏描述参数,通常须要 WAV header 来描述,如:量化格式(sampleFormat)、采样率(sampleRate)、声道数(channel)。设计
描述音频文件的大小、质量
计算比特率的公式: 采样率 × 采样格式 × 声道数 = 比特率
声音的大小单位——分贝
什么是分贝,为何使用分贝做单位?
若以声压值来表示声音大小,变化范围太大,能够达到六个数量级以上,另外,人耳对声音信号的强弱刺激的反应不是线性的,而是呈对数比例关系,因而采用分贝的概念:
分贝是指两个物理量之比除以 10 为底的对数并乘以 10,中文描述有点绕,看简洁的公式
N = 10 * lg(A1/A0)
分贝符号:dB, 它是无量纲的,式中 A0 是基准量,A1是"被量度"量
CD 音质的格式是 WAV,完整地存储采样数据。可是存储空间较大,计算一下,CD的音质参数:量化格式16 bit,采样率 44100,声道数 2,计算一秒的比特数:
44100 16 2 = 1378.125 kbps (千比特每秒) = 176400 字节每秒
一分钟的 CD 音质的存储空间约为 10.09 MB。存储空间太大,不适合在 4G 如下的网络中在线播放音频。
在实际应用中,须要对数据进行压缩,有效的压缩方法是从两个维度上进行压缩,分别是频域与时域。
提供给人类播放的音频,只需保存人耳听觉范围内的信号,因而音频压缩编码的原理其实是压缩掉冗余信号,冗余信号包括人耳听觉范围以外的音频信号以及被掩蔽掉的音频信号等,被掩蔽掉的音频信号主要是由于人耳的掩蔽效应,主要表现为频域掩蔽效应与时域掩蔽效应,不管是时域上仍是频域上,被掩蔽掉的声音信号都被认为是冗余信息,不进行编码处理。
介绍常见的音频格式:
常见两种表示方式为: RGB, YUV
RGB的概念,不少人都了解,三种原色来描述一个像素点,还有 RGBA 格式,A 是透明度。
像素的取值范围有几种:
一张图片的裸数据是 bitmap,内存很大,也浪费空间,因而有压缩算法:
JPEG 是静态图像压缩标准,有良好的压缩性能,然而,对于视频来讲还不够,视频还须要在时域上进行压缩,后面讲到。
若是你未理解过 YUV 概念,来看这一张熟悉的图片:
90年代彩色电视或黑白电视,测试画面使用的图片,图片的色块直接地反映了 YUV 的色彩空间,再来看下一张端口图:
以上端口中,老式的黑白电视使用 Y C 端口,彩色电视采用 YUV 端口,之前在家接过电视盒、DVD端口的童鞋是否是很熟悉。其中 Y 表明明亮度/灰阶值 (Luma);U 和 V 表明色度(chroma),指定像素的颜色。
归纳而言,YUV 主要应用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。
与直观的 RGB 不一样,YUV 的表示方式是差分的:
看下一张图片反映 YUV 与 RGB 的差别
YUV 最多见的采样格式是 4:2:0,其中 0 不表明其中一个输入为0,而是交错的 4:2:0 与 4:0:2,左右两列的色度是共享的,以下图片
不考虑时域压缩,YUV的一帧图片比RGB的一帧图片的比特量化要大,好比 RGB 用 8 bit 表示一个像素,YUV 须要用 12 bit 表示一个像素。
了解 YUV 的概念,对于音视频编程中的客户端开发,是必要的。在IOS或安卓,摄像头采集到的裸数据格式是 YUV,而后须要调用相关API使其转换成 RGB 格式,详细暂且打住。
音视频的编码一般是去除冗余信息,从而实现数据量的压缩。对于视频,能够从空间与时间维度上进行压缩,并且,视频数据有极强的相关性,有着大量的冗余信息。
从时间维度上去除冗余信息的方法:
从空间维度上,运用帧内编码技术,例如,静态图像编码标准 JPEG,在视频上,ISO 制定了 Motion JPEG,即 MPEG,MPEG算法是适用于动态视频的压缩算法,除了对单幅图像进行编码外,还利用图像序列中相关原则去除冗余,大大提升压缩比。MPEG版本一直在不断更新,如:Mpeg1(用于VCD),Mpeg2(用于DVD),Mpeg4 AVC(流媒体的主力算法)
独立于 ISO 制定的 MPEG 视频压缩标准,ITU-T制定了 H.261~H.264一系列视频标准,其中 H.264吸收了众多标准的经验,采起简约设计,比起 Mpeg4更容易推广。
H.264使用了新的压缩技术,例如:多参考帧,多块类型,整数变换,帧内预测等,使用了更精细的分像素运动矢量(1/4,1/8)和新一代的环路滤波器。
IPB 帧,是最多见的帧间编码技术类型,在GOP(Group Of Pictures)中有如下三种帧:
gop_size,表明两个 I 帧之间的帧数目。理论上,在存储空间固定的条件下,gop_size越大,画面质量越好,由于能够留下更多的空间存储画质更高的 I 帧。
压缩比,通常而言,I帧的压缩率是 7 (与 JPG 差很少),P帧是20,B帧是50
PTS 与 DTS
通常来讲,若是视频的各帧编码是按输入顺序依次进行的,那么解码时间与显示时间应该一致,然而事实上,大多数编解码标准(如H.264),编码顺序与显示顺序并不一致,因而须要 PTS 与 DTS 两种时间戳。
Tip: 在 FFmpeg 工具中,AVPacket结构体是描述解码前或编码后的压缩数据,AVFrame是描述视频的一帧图像,而 DTS 是 AVPacket 结构体的一个成员属性,PTS 是 AVFrame 的一个成员属性。另外,FFmpeg 中还有一个属性,基准时间 time_base ,即每 1 pts 的时间间隔,单位秒
本文的文字摘抄于《音视频开发进阶指南》,便是我阅读后将知识内化的再输出
图片均来自互联网