音频重采样

重采样就是改变音频的采样率、sample format(采样格式)、声道数(channel)等参数
为什么需要重采样?
1、音频重采样是为了将音频统一格式
比如直播:
麦克风采集 44.1Khz(采样率) f32(格式) 2chn(通道数)
添加背景音乐 48Khz s16 2chn
将麦克风采集的和背景音乐的音频合并叠加,也就是混音,就需要统一格式,统一采样率,这样才能混音(amix)进行编码
2、多个播放器播放音频
播放器1 44.1Khz(采样率) f32(格式) 2chn(通道数)
播放器2 48Khz s16 2chn
对于声卡来讲能否同时播放两种不同采样率不同格式的音频?
答案是不能,那怎样才能同时播放两个播放器的内容,比如声卡固定设置为48Khz,S16格式的,这个时候不管什么格式什么采样率的音频最终都要转为48Khz,S16格式的音频进行输出
这就是为什么音频需要重采样,就是为了统一采样率,统一格式

音频aac、mp3文档规定:
AAC:帧大小1024个sample,采样率为44100Hz ,帧播放时长:acc dur=1024/44100 = 0.02322s=23.22ms
MP3:帧大小1152个sample,采样率为44100Hz ,帧播放时长: mp3 dur=1152/44100 = 0.02608s=26.08ms

在ffmpeg中不同的AAC编码器,ID都是一样的,不同的是name
audacity软件分析音频

重采样参数

sample rate(采样率):采样设备每秒抽取样本的次数
sample format(采样格式)和量化精度:这个应该好理解,就是采用什么格式进行采集数据;每种⾳频格式有不同的量化精度(位宽),位数越多,表示值就越精确,声⾳表现⾃然就越精准。
channel layout(通道布局,也就是声道数):这个就是采样的声道数

ffmpeg中音频的格式

enum AVSampleFormat {
    AV_SAMPLE_FMT_NONE = -1,
    AV_SAMPLE_FMT_U8,          ///< unsigned 8 bits
    AV_SAMPLE_FMT_S16,         ///< signed 16 bits
    AV_SAMPLE_FMT_S32,         ///< signed 32 bits
    AV_SAMPLE_FMT_FLT,         ///< float 4字节 32 bits
    AV_SAMPLE_FMT_DBL,         ///< double
 
    AV_SAMPLE_FMT_U8P,         ///< unsigned 8 bits, planar
    AV_SAMPLE_FMT_S16P,        ///< signed 16 bits, planar
    AV_SAMPLE_FMT_S32P,        ///< signed 32 bits, planar
    AV_SAMPLE_FMT_FLTP,        ///< float, planar
    AV_SAMPLE_FMT_DBLP,        ///< double, planar
    AV_SAMPLE_FMT_S64,         ///< signed 64 bits
    AV_SAMPLE_FMT_S64P,        ///< signed 64 bits, planar
 
    AV_SAMPLE_FMT_NB           ///< Number of sample formats. DO NOT USE if linking dynamically
};

这里的数字,8,16(两个字节),32等都是代表音频采样的位深

android 音频为什么需要重采样 音频重采样有什么用_数据


其中s16le,f32le,s8就是采样位深,le代表大小端,

交错模式和平面模式(Planar)

采样格式最后一个字母如果是P就代表数据格式是平面模式,存储时其左声道和右声道的数据是分开存储的,左声道的数据存储在data[0],右声道的数据存储在data[1],每个声道的所占⽤的字节数为linesize[0]和linesize[1];
LLLLLLRRRRRRLLLLLLRRRRRRLLLLLLRRRRRRL…(每个LLLLLLRRRRRR为一个音频帧)
如果最后一个字母不是P就代表是交错模式,存储时是按照LRLRLR…的格式交替存储在data[0]中,linesize[0]表示总的数据量。
LRLRLRLRLRLRLRLRLRLRLRLRLRLRLRLRLRLRL…(每个LR为一个音频样本)

比如AAC目前编码基本都是一帧有1024个采样点,那么对于2chn的交错模式,就需要一帧1024个LR数据,对于planar模式就是一帧中先有1024个L,再加上1024个R
保存到本地的音频一定要用交错模式

linesize和nb_samples

linesize表示一个平面内总比特数(经过内存对齐), nb_samples表示一帧音频帧的采样点数

采样频率:每秒钟采样的点的个数。常用的采样频率有:
22000(22kHz): 无线广播。
44100(44.1kHz):CD音质。
48000(48kHz): 数字电视,DVD。
96000(96kHz): 蓝光,高清DVD。
192000(192kHz): 蓝光,高清DVD。
采样精度(采样深度):每个“样本点”的大小,
常用的大小为8bit, 16bit,24bit。
通道数:单声道,双声道,四声道,5.1声道。