音频基础知识集合

采样率(Sample Rate)

采样率(采样频率)即每秒内进行采样的次数。单位是Hz。采样率越高,数字波形的形状就越接近原始模拟波形,声音的还原就越真实。如44100HZ, 48000HZ等。

位深(Bit Depth)

采样位数(又称位宽,位深,位深度),采样位数的含义是用多少个点来描述声音信号的强度。采样位数反应了采样系统对声音的辨析度,位数越高,对声音的记录就越精细。常见的有8位,16位,24位和32位。如果是8bit,就有2^8 = 256个点。

声道(Channel)

声道是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,通俗的说声道数就是录音时的麦克风数量,也是播放时的音响数量。声道数,也叫通道数,轨道数,音轨数。

常见的声道数有单声道(Mono),双声道(即立体声,Stereo),5.1声道,7.1声道等。这里的 .1声道指的是低音声道。

一个5.1声道家庭影院包含六个扬声器,分别是 :C(Central)中置,FL(Front Left)左前置,FR(Front Right)右前置,SL(Surround Left)左环绕,SR(Surround Right)右环绕和SW(Subwoofer)低音炮。

比特率(Bit Rate)

比特是由bit音译而来,指二进制数中的位。

比特率就是指每秒传送或处理的比特的数量(位数),所以比特率又称为"二进制位速率",简称"位速或位率",常用于形容传输速度,带宽。

在数字多媒体领域,比特率是每秒播放连续的音频或视频的比特的数量,是音视频文件的一个属性。此时它相当于术语"数字带宽消耗量或吞吐量",也俗称为"码率"。

比特率的统一含义是"二进制码数量/时间",单位是比特每秒,bit per second,缩写为bit/s(不是"bits/s"),简写为bps或b/s。

格式(Format)

  • S16_LE - 有符号16位小端整数 (一个采样点16位,占2个字节)。两个值分别为0x1234和0xABCD的采样点在内存中表示为:
0x340x120xCD0xAB
  • S24_LE - 有符号24位小端整数 (一个采样点24位,占4个字节,高3字节有效,低1字节填充0)。两个值分别为0x123456和0xABCDEF的采样点在内存中表示为:
0x000x560x340x120x000xEF0xCD0xAB
  • S24_3LE - 有符号24位小端整数 (一个采样点24位,占3个字节)。两个值分别为0x123456和0xABCDEF的采样点在内存中表示为:
0x560x340x120xEF0xCD0xAB
  • S32_LE - 有符号32位小端整数 (一个采样点32位,占4个字节)。两个值匀为0x12345678的采样点在内存中表示为:
0x780x560x340x120x780x560x340x12
  • FLOAT_LE - 小端浮点数 (一个采样点32位,占4个字节)
  • S16_BE - 有符号16位大端整数 (一个采样点16位,占2个字节)。两个值分别为0x1234和0xABCD的采样点在内存中表示为:
0x120x340xAB0xCD
  • S24_BE - 有符号24位大端整数 (一个采样点24位,占4个字节,高3字节有效,低1字节填充0)。两个值分别为0x123456和0xABCDEF的采样点在内存中表示为:
0x000x120x340x560x000xAB0xCD0xEF
  • S24_3BE - 有符号24位大端整数 (一个采样点24位,占3个字节)。两个值分别为0x123456和0xABCDEF的采样点在内存中表示为:
0x120x340x560xAB0xCD0xEF
  • S32_BE - 有符号32位大端整数 (一个采样点32位,占4个字节)。两个值匀为0x12345678的采样点在内存中表示为:
0x120x340x560x780x120x340x560x78

问:为什么要区别大端小端?
答:处理器分大端处理器和小端处理器。大端处理器只能理解大端数据(即对大端数据做运算),小端处理器只能理解小端数据(即对小端数据做运算)。同样一个采样点,大端处理器把它写入内存或文件时,便形成了大端数据;小端处理器同理。想让大端处理器处理小端数据,那么处理前要先把小端数据转换为大端;小端处理器处理大端数据同理。

问:使用signed 和 unsigned储存pcm有什么区别?

答:两种表示方式,精度相同,如16位表示时,有符号区间为-2^15到2^15-1。无符号区间为0-2^16-1

帧(Frame)

帧是ALSA最基本的数据传输单元。所有声道在同一个时刻产生的1个采样点组成1帧。

单声道情况下的4帧:

L1L2L3L4............

双声道交错(interleave)情况下的4帧:

L1R1L2R2L3R3L4R4

双声道非交错(interleave)情况下的4帧:

L1L2L3L4............
R1R2R3R4............

周期(period)

一个period指的是若干个ALSA帧,类似于一个算法帧。period_size指一个period里包含多少ALSA帧。period_count指缓冲区里有多少个period。 例如一个period_size=1024, period_count=4 的缓冲区:

1024 ALSA帧1024 ALSA帧1024 ALSA帧1024 ALSA帧

问:一个period应该设定多长?
答:不能太长也不能太短。太长的话意味着延时就长,在延时敏感的应用场景下会不能接受。例如通话时,当一端用400毫秒长的period录音,就意味麦克风硬件采集到声音并把数据存放到内存时,说话的声音至少400毫秒后才被软件读走,即使将网络发送到对方再从对方的喇叭播放出来的时间忽略不计,对方也至少要400毫秒后才能听到这端的说话声音,这样通话的体验是非常差的。而period太短的话也有问题,举个最极端的例子,若一个period的长度等于一个ALSA帧,这意味着每隔一个ALSA帧(以48000Hz采样率为例,一个ALSA帧就是1/48000=20微妙)软件就要处理一次,这样会极大地增加系统开销。所以一个period应该设定多长取决于应用场景和系统负载。

xrun

xrun对于播放来说即underrun,对于录音来说即overrununderrun指缓冲区里已经没有数据给硬件去消耗了,但硬件还想要继续消耗数据。overrun指缓冲区数据已满,没有空位给硬件去填新的数据了,但硬件还想继续往里填新数据。

start_threshold

start_threshold决定了硬件什么时候开始消耗数据(开始输出)。通常它的值被设为内核缓冲区的一半或者整个缓冲区,这样的话起播的时候就不容易发生underrun。但是start_threshold越大的话,延时就会越大。对于延时敏感的应用,这个值要仔细考虑。

stop_threshold

stop_threshold决定了硬件什么时候停止消耗数据(停止输出)。当缓冲区里空位置的数量超过了这个值,播放就自动停止。如果这个值为整个缓冲区,那么播放会到所有数据都消耗光了才停止。这里有个风险,如果hw_ptr停止不及时,一些垃圾数据会被读走播放出来产生杂音。所有stop_threshold经常被设为比整个缓冲区稍微小一点,这样能尽量保证没有杂音输出,然而最后几帧也会相应丢失。

参考文章

https://zhuanlan.zhihu.com/p/212318683

https://zhuanlan.zhihu.com/p/537557158

https://zhuanlan.zhihu.com/p/537562136

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值