第一章、音频基础知识

音频处理流程

音频数据流的处理过程

声音是如何被听到的

  • 声音是由于物体振动产生的;
  • 声音通过空气、液体或者固体等进行传输;
  • 声音通过振动耳膜,产生神经信号进入大脑。

人类在声音方面的生理特性

声音的三要素

  • 音调: 音调快慢 男生-> 女生 -> 儿童
  • 音量:振动的幅度
  • 音色: 谐波

模数转换

模拟音频(Analogous Audio)

用连续的电流或电压表示的音频信号,在时间和振幅上是连续。在过去记录声音记录的都是模拟音频,比如机械录音(以留声机、机械唱片为代表)、光学录音(以电影胶片为代表)、磁性录音(以磁带录音为代表)等模拟录音方式。

数字音频(Digital Audio)

通过采样和量化技术获得的离散性(数字化)音频数据。计算机内部处理的是二进制数据,处理的都是数字音频,所以需要将模拟音频通过采样、量化转换成有限个数字表示的离散序列(即实现音频数字化)。

模数转换就是将模拟信号转换为数值信号。

奈圭斯特定理

在进行模拟/数字信号的转换过程中,当采样频率fs.max大于信号中最高频率fmax的2倍时(fs.max>2fmax),采样之后的数字信号完整地保留了原始信号中的信息,一般实际应用中保证采样频率为信号最高频率的2.56~4倍;采样定理又称奈奎斯特定理

PCM(Pulse-code modulation

1. 什么是PCM?

PCM(Pulse Code Modulation,脉冲编码调制)音频数据是未经压缩的音频采样数据裸流,它是由模拟信号经过采样、量化、编码转换成的标准数字音频数据。

描述PCM数据的参数:

  • 采样率:常见采样率 8k 16k 32k 44.1k 48K
  • 采样大小或者位深: 音视频直播场景的位深是16bit (-32768-32767)
  • 声道数: 单声道、双声道和多声道

2. PCM的码率计算

要计算一个PCM的码率 = 采样率 * 采样大小 * 声道数。

例如:采样率为16Khz、采样大小16bit的双声道PCM的码率:16k*16*2 =512kbps。

  1. 播放PCM的工具

ffplay, 使用示例如下:

//播放格式为f32le,单声道,采样频率48000Hz的PCM数据

ffplay -f f32le -ac 1 -ar 48000 pcm_audio

4. PCM数据格式

如果是单声道的音频文件,采样数据按时间的先后顺序依次存入(有的时候也会采用LRLRLR方式存储,只是另一个声道的数据为0),如果是双声道的话就按照LRLRLR的方式存储,存储的时候与字节序有关。little-endian模式如下图所示:

5. FFmpeg支持的PCM数据格式

使用ffmpeg -formats命令,获取ffmpeg支持的音视频格式,其中我们可以找到支持的PCM格式。

DE alaw PCM A-law
DE f32be PCM 32-bit floating-point big-endian
DE f32le PCM 32-bit floating-point little-endian
DE f64be PCM 64-bit floating-point big-endian
DE f64le PCM 64-bit floating-point little-endian
DE mulaw PCM mu-law
DE s16be PCM signed 16-bit big-endian
DE s16le PCM signed 16-bit little-endian
DE s24be PCM signed 24-bit big-endian
DE s24le PCM signed 24-bit little-endian
DE s32be PCM signed 32-bit big-endian
DE s32le PCM signed 32-bit little-endian
DE s8 PCM signed 8-bit
DE u16be PCM unsigned 16-bit big-endian
DE u16le PCM unsigned 16-bit little-endian
DE u24be PCM unsigned 24-bit big-endian
DE u24le PCM unsigned 24-bit little-endian
DE u32be PCM unsigned 32-bit big-endian
DE u32le PCM unsigned 32-bit little-endian
DE u8 PCM unsigned 8-bit

s是有符号,u是无符号,f是浮点数。

be是大端,le是小端。

比如DE s16be,就表示一个样本用16bits有符号的整形数据表示,字节序为大端。

字节序

对于一个由2个字节组成的16位整数,在内存中存储这两个字节有两种方法:一种是将低序字节存储在起始地址,这称为小端(little-endian)字节序;另一种方法是将高序字节存储在起始地址,这称为大端(big-endian)字节序。

 谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian?

Big Endian

big endian是指低地址存放最高有效字节(MSB,Most Significant Bit)。

Little Endian

而little endian则是低地址存放最低有效字节(LSB,Least Significant Bit)。

假如现有一32位int型数0x12345678,那么其MSB(Most Significant Byte,最高有效字节)为0x12,其LSB (Least Significant Byte,最低有效字节)为0x78,在CPU内存中有两种存放方式:(假设从地址0x4000开始存放)

 所有网络协议都是采用big endian的方式来传输数据的。所以也把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。

参考资料

PCM音频数据

PCM音量控制

雷神:视音频数据处理入门:PCM音频采样数据处理

what-is-the-difference-between-av-sample-fmt-s16p-and-av-sample-fmt-s16

大小端参考自: 什么是大小端?如何确定大小端?_wwwlyj123321的博客-CSDN博客_大小端

猜你喜欢

转载自blog.csdn.net/codemanship/article/details/122716388