C++ 音频
一、采样频率
当前主流的采样频率为22.05KHz、44.1KHz、48KHz
22.05KHz:为FM广播声音品质
44.1KHz:为理论上最高的CD声音品质(直播,录像,acc)
48KHz:人耳可分辨的最高采样频率
( 比如 “ 44100Hz 16bit stereo ” 表示 采样频率44.1KHz,每个采样点占2字节,双声道)
( 比如 “ 22050Hz 8bit mono ” 表示 采样频率22.05KHz,每个采样点占1字节,单声道)
二、PCM
PCM(Pulse Code Modulation) 为 脉冲编码调制。PCM中的声音数据没有被压缩。
一般情况下,一帧PCM由2048次采样获得。
注意:双声道时,采样低字节在前,高字节在后。
1分钟的PCM声音大小 = 44100 × 2(声道) × 2(字节) 60(秒) ÷ 1024 ÷ 1024 ≈ 10MB(兆)
直接传输非常大,因此需要对PCM流进行压缩。(最常见的压缩方式:aac)
三、aac
aac是音频流PCM最常用的压缩方式,除此以外还有g711,opus,mp3等。
3.1 数据格式
acc有两种数据格式:
ADIF(Audio Data Interchage Format):音频数据交换格式。只有一个统一的头,
必须得到所有数据后才能解码,适用于本地文件。
ADTS(Audio Data Transport Stream):音频数据传输流。每一帧都有头信息,
任意帧解码,适用于传输流。
struct AdtsHeader {
unsigned int syncword; //12 bit 同步字 '1111 1111 1111',一个ADTS帧的开始
uint8_t id; //1 bit 0代表MPEG-4, 1代表MPEG-2。
uint8_t layer; //2 bit 必须为0
uint8_t protectionAbsent; //1 bit 1代表没有CRC,0代表有CRC
uint8_t profile; //2 bit AAC级别(MPEG-2 AAC中定义了3种profile,MPEG-4 AAC中定义了6种profile)
uint8_t samplingFreqIndex; //4 bit 采样率(4表示44100Hz)
uint8_t privateBit; //1bit 编码时设置为0,解码时忽略
uint8_t channelCfg; //3 bit 声道数量
uint8_t originalCopy; //1bit 编码时设置为0,解码时忽略
uint8_t home; //1 bit 编码时设置为0,解码时忽略
uint8_t copyrightIdentificationBit; //1 bit 编码时设置为0,解码时忽略
uint8_t copyrightIdentificationStart; //1 bit 编码时设置为0,解码时忽略
unsigned int aacFrameLength; //13 bit 一个ADTS帧的长度包括ADTS头和AAC原始流
unsigned int adtsBufferFullness; //11 bit 缓冲区充满度,0x7FF说明是码率可变的码流,不需要此字段。CBR可能需要此字段,不同编码器使用情况不同。这个在使用音频编码的时候需要注意。
/* number_of_raw_data_blocks_in_frame
* 表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧
* 所以说number_of_raw_data_blocks_in_frame == 0
* 表示说ADTS帧中有一个AAC数据块并不是说没有。(一个AAC原始帧包含一段时间内1024个采样及相关数据)
*/
uint8_t numberOfRawDataBlockInFrame; //2 bit
};