[iOS音频开发] 音频基础

515 阅读2分钟

概述

声音是模拟的连续信号,而计算机只能离散的存储。为了使得计算机具备音频的能力,必须支持连续音频信号的离散化描述,而PCM(脉冲编码调制)具备这个能力。

为了将音频信号数字化,主要会做这三件事,分别是采样、量化和编码。

采样

所谓采样就是在时间轴上对信号进行数字化。根据奎斯特定理,按比声音最高频率高两倍以上的频率对声音进行采样(AD转换),对于高质量的音频信号,人耳能够听到的范围为10Hz~20kHz,所以一般的采样率为44.1kHz,就是说1秒会采样44100次。

量化

量化是指在幅度轴上对信号进行数字化。

编码

编码就是按照一定格式记录采样和量化后的数据,比如顺序存储或压缩存储等。

PCM脉冲编码调制(Pulse Code Modulation)

脉冲编码调制就是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输。脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化,编码的过程。我们通常说的音频裸数据格式就是脉冲编码调制(PCM)数据。

PCM基础概念

1. 声道

录制和播放时,音频信号的数量。

2.采样率

每秒从连续信号中提取并组成离散信号的采样个数,单位是赫兹(Hz)。

3.采样深度

量化的二进制位数,常为16位。

4.码率

音频流每秒的大小,单位常用bps;一个采样率为44.1KHz,采样大小为16bit,双声道的PCM编码的文件,码率为 44.1K×16×2 =1411.2 Kbps。

PCM数据操作

了解完PCM的相关概念后,再来看看PCM相关的数据操作。

1.PCM混合

重采样,对位相加,溢出处理。

2.单声道变立体声

增加声道,复制数据。

3.立体声变单声道

减少声道,声道混合或只取其一。

4.音量调整和静

改变量化值,对数优化,清零静音。

5.播放速率调整;

快放:相邻位合并,缩减长度。

慢放:长度增加,量化值不变。

PCM数据的操作,就是直接操作音频流数据,比如一个简单的音量变大操作:

    int16_t *curData = (int16_t *)ioData->mBuffers[0].mData;
    int size = ioData->mBuffers[0].mDataByteSize;

		//  音量操作
    for (int pos = 0; pos < size; pos += 2, ++curData) {
        int data = *curData;

        { // 音量调整
            data = data * 2;
            // 溢出
            if (data > 32767) {
                data = 32767;
            }
            else if (data < -32768) {
                data = -32768;
            }
        }
        *curData = data;
    }

原文链接:www.jianshu.com/p/80a140cf3…