【iOS 音频处理 (1)】音频基础信息

6,882

blog 迁移

1.什么是声音?

声音是介质振动在听觉系统中产生的反应。声音总可以被分解为不同频率不同强度正弦波的叠加(傅里叶变换)。

声音基本的两个属性:

  • 振幅:声音的振幅就是音量

  • 频率:声音的频率就是音调的高低单位 Hz

音频又分为:

  • 模拟音频:上图蓝色曲线,在时间和振幅都是连续的。比如:磁带,唱片等。

  • 数字音频:上图红色点,通过采样和量化获得离散性数据。比如:CD,MP3 等数字格式。

通过上图来介绍一下几个基础的概念:

  • 采样率 Sampling Rate:单位时间内的采样点,即上图一个区间内红点的个数,单位为 kHz,每秒千个采样。

  • 量化深度 Depth :每个样本的二进制位数,即上图红点的 Y 坐标的值,位数越多,振幅能区分的更细,通常量化深度为 4,8,16,32 bit,

  • 声道数 Channel Num :每次生成一个采样数据,为单声道,多个声道可以重现出声音的位置。

为什么 CD 的采样率是 44.1 khz ?

Nyquist-Shannon Sampling Theorem 采样定理

当采样频率fs.max大于信号中最高频率fmax的2倍时,数字信号就能完整的保留原始信号中的信息。

而 44.1khz * 0. 5 为 22.05 khz,基本包含了人声能听到的频率范围( 14-15 khz)。

深度信息为位信息,即每个采样值的长度,即 depth,位信息越长,质量越高同时越消耗系统的性能。

声音的码率就是 depth * sample rate = bkhz

比如一张 CD ,2 x 16 x 44100 = 1,411,200 比特每秒 ,即每秒 172 kb

和图片有颜色通道一样,声音也有通道:左声道,右声道。

而 5.1 声道的信号包括 6 个声道:前后的左右声道,中间声道,无方向的低频声道。

数字音频编码 PCM ( pulse code modulation) ,采样率为 1s 之内有多少个采样值,最常见的是 44.1 kHz,即 1s 内存在 44,100 个采样。采样率越高越接近声音真实的频率。

对声音进行采样、量化过程被称为脉冲编码调制(Pulse Code Modulation),简称PCM。PCM数据是最原始的音频数据完全无损,所以PCM数据虽然音质优秀但体积庞大,为了解决这个问题先后诞生了一系列的音频格式,这些音频格式运用不同的方法对音频数据进行压缩,其中有无损压缩(ALAC、APE、FLAC)和有损压缩(MP3、AAC、OGG、WMA)两种。

所有的声道数据组成 音频帧 。

在一些压缩的声音格式中,会对多个音频帧,组合成一个包,进行特殊的算法处理,来实现数据压缩的功能,不过这样的音频就不是无损的了。

如我们常见的 MP3, AAC 格式等,

这边容易搞混的是

音频编码 Audio Codec :

音频压缩格式 Audio Coding Format :如 MP3, AFLAC,FLAC等

2.怎么展示音频?

波形图

一般情况下我们能见到的肯定都是 波形图

音频的声音是 波形的幅度 幅度越大 代表着声音越大

这个又称为 时域图 ,即在时间领域的声音数据模型。

x 轴是时间,y轴是声音的大小

控制声音的大小就是要将其幅度进行缩小 进行固定 scale 的缩放就能控制声音的音量。

控制时间,就是调整齐播放的速度,可以实现快放和慢放。

时域的效果

频域

而在我们日常生活中听到的声音,是由不同频率的声音叠加起来,最终得到我们人耳听见混合之后的声音。

当然,这样三维的图片,查看起来肯定不方便,所以便有了下面这种频谱图:

频谱图

x 轴为时间

y 轴是频域

对应点的颜色代表着该时间点的该频率的峰值,颜色越深,代表峰值越高。可以理解为将上面的 3D 图,拍扁之后的效果。

3.在 iOS 中的音频

音频格式: iOS 默认录制的音频采样格式为 16 bit 的 线性 PCM 格式。

通过 AVCaptureAudioDataOutput 能得到录制后的 CMSampleBufferRef 格式的 RAW 音频文件。

CMSampleBuffer 介绍 developer.apple.com/documentati…

包含 0 或多个采样数据,格式可能是 音频或视频等。

  • CMSampleBuffer 为音视频的 Raw Data 即源数据。有如下来源和用法

  • AVCaptureDataOutput 读通过代理提供 CMSampleBuffer

  • AVAssetReader 读取本地文件的 CMSampleBuffer

  • AVAssetWriter 写文件

内部包含了数据格式

CVImageBuffer / CVPixelBuffer 视频帧

CMBlockBuffer 任何数据(声音,字幕,timecode)

参考:idup.club/avfoundatio…