数字音视频技术:音频中的一些概念(采样率, 位深度, 声道数, Sample/Frame/Packet)

1. 采样率

采样率(sampleRate), 采样率就是每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示,说的简单一点就是每秒在每个声道上采样的个数。采样就是把模拟信号数字化的过程,不仅仅是音频需要采样,所有的模拟信号都需要通过采样转换为可以用0101来表示的数字信号,示意图如下所示:

 

 

 蓝色代表模拟音频信号,红色的点代表采样得到的量化数值。采样频率越高,红色的间隔就越密集,记录这一段音频信号所用的数据量就越大,同时音频质量也就越高。根据奈奎斯特理论,采样频率只要不低于音频信号最高频率的两倍,就可以无损失地还原原始的声音。通常人耳能听到频率范围大约在20Hz~20kHz之间的声音,为了保证声音不失真,采样频率应在40kHz以上。常用的音频采样频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。

2. 位深度

位深度,也叫位宽,量化精度,上图中,每一个红色的采样点,都需要用一个数值来表示大小,这个数值的数据类型大小可以是:4bit、8bit、16bit、32bit等等,位数越多,表示得就越精细,声音质量自然就越好,当然,数据量也会成倍增大。常见的位宽有:8bit 或者 16bit。

3. 声道数

由于音频的采集和播放是可以叠加的,因此,可以同时从多个音频源采集声音,并分别输出到不同的扬声器,故声道数一般表示声音录制时的音源数量或回放时相应的扬声器数量。单声道(Mono)和双声道(Stereo)比较常见,顾名思义,前者的声道数为1,后者为2。

4. Sample、Frame、Packet

这三个概念很重要,很容易搞混,苹果在其Core Audio 官方文档中明确定义了 audio stream, channel, sample, frame, packetsample rate 这些概念: https://developer.apple.com/library/archive/documentation/MusicAudio/Conceptual/CoreAudioOverview/WhatisCoreAudio/WhatisCoreAudio.html

  • A sample is single numerical value for a single audio channel in an audio stream.
  • A frame is a collection of time-coincident samples. For instance, a linear PCM stereo sound file has two samples per frame, one for the left channel and one for the right channel.
  • A packet is a collection of one or more contiguous frames. A packet defines the smallest meaningful set of frames for a given audio data format, and is the smallest data unit for which time can be measured. In linear PCM audio, a packet holds a single frame. In compressed formats, it typically holds more; in some formats, the number of frames per packet varies.

从上面文档定义,简单来说,可以这样理解:

  • sample 是一个声道的一个采样。
  • frame 是一个时间点的样本集合,举例来说,一个线性的PCM 双声道音频文件每个Frame有2个样本,一个左声道样本,和一个右声道样本。
  • packet 是一个或多个 frame 的集合,一个 packet 包含多少个 frame,是由声音文件格式决定的。譬如 PCM 文件格式中一个 packet 包含 1 个frame。而 MP3 文件格式中一个 packet 包含 1152 个frames。

 

从上面定义来看这三个概念互相独立,定义清晰。

这些概念为什么容易搞混?

然而在日常讨论中,会在多种场合下使用 frame 和 packet 两个词,但是各种场合下它们代表的含义是不同的,所以比较容易搞混。

举下面不同场景的例子来说明:

1. 在讨论 MPEG 格式的时候,如网上常见的MPEG文件格式介绍,把 MPEG 一个 header + payload (帧头 + 数据内容)的数据结构叫做一个 frame (MPEG数据帧),一个 MPEG 数据帧包含了多个音频帧。事实上这个东东在上述 iOS Core Audio 定义中,却又被称为一个 packet。所以两份文档中,分别使用了 packet 和 frame 两个词指代同一个概念。

2. 网络传输音频的时候,会把音频数据进行打包发送,这个时候也用到 packet 的概念,他有自己独立的 packet header 定义,又跟 iOS Core Audio 定义的 packet 不是同一个了。

3. 在讨论计算机网络时,硬件数据帧称为 frame,而数据链路层将 frame 打包成 packet 之后提供给上层网络层使用。 这里 frame 和 packet 的概念又跟音频讨论中的含义不一样了。

4. FFmpeg是一个音/视频编码解码及转换的开源软件。它定义了两个结构体,AVPacket 一份代表经过压缩的音频/视频数据,AVFrame 代表一份解压后的一个音频/视频数据。视频一个 AVPacket 通常只包含一个 AVFrame,经过压缩的音频 AVPacket 通常包括多个 AVFrame。可以看到 FFmpeg 在处理音频和视频时,对 packet 和 frame 概念的使用跟 iOS Core Audio 基本一致。
从上面例子可以看到,不同场景下都使用了 frame 和 packet 两个词语会代表不一样的含义。更糟糕的是,如果使用了中文“帧”,在某些语境下,到底是代表数据帧、音频帧、packet 还是 frame 呢,就更容易分不清楚了。

 

参考链接

1. 音频开发中常用到的概念
2. 理解iOS Core Audio音频概念

 

posted @ 2020-03-13 17:28  夜行过客  阅读(6950)  评论(0编辑  收藏  举报