iOS中音频的理论知识

基础知识

参考简书

  • 声波是一种机械波,是一种模拟信号。
  • PCM,全称脉冲编码调制,是一种模拟信号的数字化的方法。
  • 采样精度(bit pre sample),每个声音样本的采样位数。
  • 采样频率(sample rate)每秒钟采集多少个声音样本。
  • 声道(channel):相互独立的音频信号数,单声道(mono)立体声(Stereo)
  • 语音帧(frame),In audio data a frame is one sample across all channels.

    线性PCM:

    参考博客
  • 这是表示线性脉冲编码调制,主要是描写用于将模拟声音数据转换成数字格式的技术。简单地说也就是未压缩的数据。因为数据是未压缩的,所以我们便可以最快速地播放出音频,而如果空间不是问题的话这便是iPhone音频的优先代码选择。

    音频文件计算大小

  • 声卡对声音的处理质量可以用三个基本参数来衡量,即采样频率、采样位数和声道数。
  • 采样频率:
    是指单位时间内的采样次数。采样频率越大,采样点之间的间隔就越小,数字化后得到的声音就越逼真,但相应的数据量就越大。声卡一般提供11.025kHz、22.05kHz和44.1kHz等不同的采样频率。
  • 采样位数:
    是记录每次采样值数值大小的位数。采样位数通常有8bits或16bits两种,采样位数越大,所能记录声音的变化度就越细腻,相应的数据量就越大。
  • 声道数:是指处理的声音是单声道还是立体声。单声道在声音处理过程中只有单数据流,而立体声则需要左、右声道的两个数据流。显然,立体声的效果要好,但相应的数据量要比单声道的数据量加倍。
  • 声音数据量的计算公式为:
数据量(字节/秒)= (采样频率(Hz)× 采样位数(bit)× 声道数)/ 8

单声道的声道数为1,立体声的声道数为2。

【例1】请计算对于5分钟双声道、16位采样位数、44.1kHz采样频率声音的不压缩数据量是多少?
根据公式:数据量=(采样频率×采样位数×声道数×时间)/8

得,数据量(MB)=[44.1×1000×16×2×(5×60)] /(8×1024×1024)=50.47MB
计算时要注意几个单位的换算细节:
时间单位换算:1分=60秒
采样频率单位换算:1kHz=1000Hz
数据量单位换算:1MB=1024×1024=1048576B
【例2】请计算对于双声道立体声、采样频率为44.1kHz、采样位数为16位的激光唱盘(CD-A),用一个650MB的CD-ROM可存放多长时间的音乐?
已知音频文件大小的计算公式如下:
文件的字节数/每秒=采样频率(Hz)X采样位数(位)X声道数/8
根据上面的公式计算一秒钟时间内的不压缩数据量:(44.1×1000×16×2)/8=0.168MB/s
那么,一个650MB的CD-ROM可存放的时间为:(650/0.168)/(60×60)=1.07小时。

基础

参考博客

  • 目前我们在计算机上进行音频播放都需要依赖于音频文件,音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号的过程,人耳所能听到的声音,最低的频率是从20Hz起一直到最高频率20KHZ,因此音频文件格式的最大带宽是20KHZ。根据奈奎斯特的理论,只有采样频率高于声音信号最高频率的两倍时,才能把数字信号表示的声音还原成为原来的声音,所以音频文件的采样率一般在40~50KHZ,比如最常见的CD音质采样率44.1KHZ。
  • 对声音进行采样、量化过程被称为脉冲编码调制(Pulse Code Modulation),简称PCM。PCM数据是最原始的音频数据完全无损,所以PCM数据虽然音质优秀但体积庞大,为了解决这个问题先后诞生了一系列的音频格式,这些音频格式运用不同的方法对音频数据进行压缩,其中有无损压缩(ALAC、APE、FLAC)和有损压缩(MP3、AAC、OGG、WMA)两种。
  • 目前最为常用的音频格式是MP3,MP3是一种有损压缩的音频格式,设计这种格式的目的就是为了大幅度的减小音频的数据量,它舍弃PCM音频数据中人类听觉不敏感的部分,从下面的比较图我们可以明显的看到MP3数据相比PCM数据明显矮了一截(图片引自imp3论坛)。
  • MP3格式中的码率(BitRate)代表了MP3数据的压缩质量,现在常用的码率有128kbit/s、160kbit/s、320kbit/s等等,这个值越高声音质量也就越高。MP3编码方式常用的有两种固定码率(Constant bitrate,CBR)和可变码率(Variable bitrate,VBR)。
  • MP3格式中的数据通常由两部分组成,一部分为ID3用来存储歌名、演唱者、专辑、音轨数等信息,另一部分为音频数据。音频数据部分以帧(frame)为单位存储,每个音频都有自己的帧头,如图所示就是一个MP3文件帧结构图(图片同样来自互联网)。MP3中的每一个帧都有自己的帧头,其中存储了采样率等解码必须的信息,所以每一个帧都可以独立于文件存在和播放,这个特性加上高压缩比使得MP3文件成为了音频流播放的主流格式。帧头之后存储着音频数据,这些音频数据是若干个PCM数据帧经过压缩算法压缩得到的,对CBR的MP3数据来说每个帧中包含的PCM数据帧是固定的,而VBR是可变的。

    iOS音频播放概述

  • 了解了基础概念之后我们就可以列出一个经典的音频播放流程(以MP3为例):
    • 1.读取MP3文件
    • 2.解析采样率、码率、时长等信息,分离MP3中的音频帧
    • 3.对分离出来的音频帧解码得到PCM数据
    • 4.对PCM数据进行音效处理(均衡器、混响器等,非必须)
    • 5.把PCM数据解码成音频信号
    • 6.把音频信号交给硬件播放
    • 7.重复1-6步直到播放完成
  • 在iOS系统中apple对上述的流程进行了封装并提供了不同层次的接口(图片引自官方文档)。

CoreAudio的接口层次

  • 下面对其中的中高层接口进行功能说明:

    • Audio File Services:读写音频数据,可以完成播放流程中的第2步;
    • Audio File Stream Services:对音频进行解码,可以完成播放流程中的第2步;
    • Audio Converter services:音频数据转换,可以完成播放流程中的第3步;
    • Audio Processing Graph Services:音效处理模块,可以完成播放流程中的第4步;
    • Audio Unit Services:播放音频数据:可以完成播放流程中的第5步、第6步;
    • Extended Audio File Services:Audio File Services和Audio Converter services的结合体;
    • AVAudioPlayer/AVPlayer(AVFoundation):高级接口,可以完成整个音频播放的过程(包括本地文件和网络流播放,第4步除外);
    • Audio Queue Services:高级接口,可以进行录音和播放,可以完成播放流程中的第3、5、6步;
    • OpenAL:用于游戏音频播放,暂不讨论
  • 可以看到apple提供的接口类型非常丰富,可以满足各种类别类需求:

    • 如果你只是想实现音频的播放,没有其他需求AVFoundation会很好的满足你的需求。它的接口使用简单、不用关心其中的细节;
    • 如果你的app需要对音频进行流播放并且同时存储,那么AudioFileStreamer加AudioQueue能够帮到你,你可以先把音频数据下载到本地,一边下载一边用NSFileHandler等接口读取本地音频文件并交给AudioFileStreamer或者AudioFile解析分离音频帧,分离出来的音频帧可以送给AudioQueue进行解码和播放。如果是本地文件直接读取文件解析即可。(这两个都是比较直接的做法,这类需求也可以用AVFoundation+本地server的方式实现,AVAudioPlayer会把请求发送给本地server,由本地server转发出去,获取数据后在本地server中存储并转送给AVAudioPlayer。另一个比较trick的做法是先把音频下载到文件中,在下载到一定量的数据后把文件路径给AVAudioPlayer播放,当然这种做法在音频seek后就回有问题了。)
    • 如果你正在开发一个专业的音乐播放软件,需要对音频施加音效(均衡器、混响器),那么除了数据的读取和解析以外还需要用到AudioConverter来把音频数据转换成PCM数据,再由AudioUnit+AUGraph来进行音效处理和播放(但目前多数带音效的app都是自己开发音效模块来坐PCM数据的处理,这部分功能自行开发在自定义性和扩展性上会比较强一些。PCM数据通过音效器处理完成后就可以使用AudioUnit播放了,当然AudioQueue也支持直接使对PCM数据进行播放。)。下图描述的就是使用AudioFile + AudioConverter + AudioUnit进行音频播放的流程(图片引自官方文档)。

image


AudioSession简介

  • AudioSession这个玩意的主要功能包括以下几点(图片来自官方文档):
    • 1.确定你的app如何使用音频(是播放?还是录音?)
    • 2.为你的app选择合适的输入输出设备(比如输入用的麦克风,输出是耳机、手机功放或者airplay)
    • 3.协调你的app的音频播放和系统以及其他app行为(例如有电话时需要打断,电话结束时需要恢复,按下静音按钮时是否歌曲也要静音等)
      image
  • AudioSession相关的类有两个:
  • ==AudioToolBox中的AudioSession==
  • ==AVFoundation中的AVAudioSession==
  • 其中AudioSession在SDK 7中已经被标注为depracated,而AVAudioSession这个类虽然iOS 3开始就已经存在了,但其中很多方法和变量都是在iOS 6以后甚至是iOS 7才有的。所以各位可以依照以下标准选择:
  • 如果最低版本支持iOS 5,可以使用AudioSession,也可以使用AVAudioSession;
  • 如果最低版本支持iOS 6及以上,请使用AVAudioSession
  • ==注意:在使用MPMusicPlayerController时不必关心AudioSession的问题。==

   转载规则


《iOS中音频的理论知识》 刘星星 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录