本文介绍音频的一些基础知识,比如客户端音频采集的常用指标:

RTMP:44100HZ, 每帧1024采样,帧率43,23.2ms一帧
WEBRTC:48000HZ,每帧480采样,帧率100,10ms一帧

音频相关概念

通道数(channels)

声音的通道数,常用的有单声道和立体声之分。

采样频率

也称为采样速度,定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(HZ)来表示。

采样位数(采样格式)

采样格式是为了实现度量每个采样点。通常使用16bit(2字节),也就是2的16次方,共有65536个不同的度量值,这样采样位数越高,音频度量化的就越精细,音质同样也就越高。

采样个数(样本数)

对于采样频率,采样频率是一秒采样的个数,例如48000HZ,每秒采样个数为48000,44100HZ,每秒采样个数为44100。

而对于一帧音频的采样个数,AAC固定一帧采样1024个,MP3格式则为1152。

音频大小和时长相关计算

计算一帧音频的大小

一帧音频的大小(字节) = 通道数 x 采样个数 x 采样位数。

例如该音频帧是FLTP格式的PCM数据,那么就是aac,所以一帧中包含1024个采样个数,并且是双声道的话,那么该音频帧包含的数据量是 2 x 1024 x 4 = 8192字节。 若格式改成AV_SAMPLE_FMT,那那么采样位数是64位8字节,数据量为 2 x 1024 x 8 = 16384字节。

每秒播放的音频字节大小

每秒播放的音频字节大小(字节) = 通道数 x 采样个数 x 采样位数。

公式是一样的,但是由于求的是每秒的数据量而不是一帧的数据量,所以我们需要知道它的采样频率。 例如当采样频率为48kHZ时,一秒包含48k个采样个数而不是1024个,同样是双声道,FLTP格式,那么每秒的数据量是 2 x 48000 x 4 = 384000字节。

一帧音频的播放时长

一帧播放时间(毫秒) = 每帧样本数 * 1000 / 采样率

以采样率44100HZ来计算,每秒44100个sample,而正常一帧为1024个sample,由于比是相等的,可知每帧播放时间/1024 = 1000ms/44100,得到每帧播放时间= (1024 * 1000) / 44100 = 23.2ms(更精确的是23.21995464852608)。

或者用另一种方式去理解公式,1s显示的帧数 = 44100 / 1024 = 43.06640625帧。所以每一帧的播放时长 = 1s / 43.06640625 = 1000ms / 43.06640625 = 23.21995464852607ms。和上面的公式一样(浮点数尾部运算存在极小误差是正常)。 帧率:44100(每秒的采样) / 1024(每帧的采样)= 43帧/s

所以转换一下公式: 一帧播放时间(毫秒) = 1000ms / (44100 / 1024) = 1000ms * 1024 / 44100 = 23.2ms(更精确的是23.21995464852607)。

关于音频时间精度的例子

例如当采样频率为44.1kHZ:一帧播放时间(毫秒) = nb_sample样本数 * 1000 / 采样率 = 1024 * 1000 / 44100 = 23.21995464852608ms,约等于23.2ms,精确损失了0.011995464852608ms,如果累计10万帧,误差 > 1199毫秒,如果有视频一起的就会出现音视频同步的问题,如果按着23.2msm去计算pts(0 23.2 46.4 …)就会有累积误差。