在A2DP协议中,SBC(Subband Coding)是一个常见的音频编码格式,用于蓝牙音频传输。蓝牙协议规定在A2DP的传输中source和sink都必须支持SBC的编解码格式。这些参数配置的目的是根据应用需求和硬件能力来调整SBC编码的音频质量和效率。以下是这些参数的详细解释:
1. 采样频率(Sampling Frequency)
app_cfg_const.sbc_sampling_frequency =
BT_A2DP_SBC_SAMPLING_FREQUENCY_48KHZ |
BT_A2DP_SBC_SAMPLING_FREQUENCY_44_1KHZ |
BT_A2DP_SBC_SAMPLING_FREQUENCY_32KHZ |
BT_A2DP_SBC_SAMPLING_FREQUENCY_16KHZ;
SBC编码支持的采样频率决定了音频数据的频率范围。采样频率越高,音频质量通常越好,但数据量也会增大。常见的采样频率有:
- 48kHz:这种采样率常用于CD音质的音频传输,通常用于视频和音频设备。
- 44.1kHz:这是CD音质音频的标准采样频率。
- 32kHz:这种采样率通常用于低比特率的音频传输,能降低带宽需求。
- 16kHz:通常用于语音传输,特别是在低比特率和低延迟的环境中,如蓝牙耳机和电话。
在蓝牙规范中的可选为:
Position | Sampling Frequency (Hz) | Support in SRC | Support in SNK |
Octet0; b7 | 16000 | O | O |
Octet0; b6 | 32000 | O | O |
Octet0; b5 | 44100 | C1 | M |
Octet0; b4 | 48000 | C1 | M |
O表示可选;M表示必选;C1表示至少支持一个 |
2. 通道模式(Channel Mode)
app_cfg_const.sbc_channel_mode =
BT_A2DP_SBC_CHANNEL_MODE_MONO |
BT_A2DP_SBC_CHANNEL_MODE_DUAL_CHANNEL |
BT_A2DP_SBC_CHANNEL_MODE_STEREO |
BT_A2DP_SBC_CHANNEL_MODE_JOINT_STEREO;
通道模式决定了音频流中声道的数量。SBC支持多种通道模式,具体包括:
- MONO:单声道,只有一个声道,所有音频信号都通过一个通道输出。适用于低质量音频或节省带宽的应用。
- DUAL_CHANNEL:双声道,每个通道传输不同的音频信号。适用于立体声音频(但每个通道的质量会降低)。
- STEREO:立体声模式,通常用于高质量音频。每个通道传输不同的音频内容,确保更丰富的音频体验。
- JOINT_STEREO:联合立体声,一种压缩方式,利用两个声道之间的相似性来减少数据量,同时保留立体声效果。它适合在较低比特率下使用,能提供较高的音频质量。
在蓝牙规范中的可选为:
Position | Channel Mode | Support in SRC | Support in SNK |
Octet0; b3 | MOMO | M | M |
Octet0; b2 | DUAL CHANNEL | C1 | M |
Octet0; b1 | STEREO | C1 | M |
Octet0; b0 | JOINT STEREO | C1 | M |
O表示可选;M表示必选;C1表示至少支持一个 |
3. 块长度(Block Length)
app_cfg_const.sbc_block_length =
BT_A2DP_SBC_BLOCK_LENGTH_4 |
BT_A2DP_SBC_BLOCK_LENGTH_8 |
BT_A2DP_SBC_BLOCK_LENGTH_12 |
BT_A2DP_SBC_BLOCK_LENGTH_16;
块长度(Block Length)定义了SBC编码中每个音频块的大小。块越大,音频质量通常越好,但带宽和延迟也会增加。SBC支持的块长度有:
- 4:每个块包含4个子带。
- 8:每个块包含8个子带。
- 12:每个块包含12个子带。
- 16:每个块包含16个子带。
较大的块长度会在编码过程中提供更多的音频信息,因此可以提高音频质量,特别是在高比特率和高音质要求的应用中。
在蓝牙规范中的可选为:
Position | Block length | Support in SRC | Support in SNK |
Octet0; b7 | 4 | M | M |
Octet0; b6 | 8 | M | M |
Octet0; b5 | 12 | M | M |
Octet0; b4 | 16 | M | M |
O表示可选;M表示必选;C1表示至少支持一个 |
4. 子带数(Subbands)
app_cfg_const.sbc_subbands = BT_A2DP_SBC_SUBBANDS_4 | BT_A2DP_SBC_SUBBANDS_8;
SBC将音频频谱分成多个子带(subbands),每个子带处理一部分频率范围。子带数量的选择影响音频的频率响应和编码效率。
- 4子带:将音频频谱分成4个子带,适用于低比特率的应用,能够减小编码和解码的复杂度。
- 8子带:将音频频谱分成8个子带,适用于更高的音频质量和高比特率的应用,能提供更丰富的音频细节。
更多的子带可以带来更好的频率分辨率,从而提高音频质量。
在蓝牙规范中的可选为:
Position | Number of Subbands | Support in SRC | Support in SNK |
Octet0; b3 | 4 | O | M |
Octet0; b2 | 8 | M | M |
O表示可选;M表示必选;C1表示至少支持一个 |
5. 分配方法(Allocation Method)
app_cfg_const.sbc_allocation_method =
BT_A2DP_SBC_ALLOCATION_METHOD_SNR |
BT_A2DP_SBC_ALLOCATION_METHOD_LOUDNESS;
分配方法决定了如何在不同的频率子带上分配比特数,从而影响音频的质量和带宽效率。SBC支持两种主要的分配方法:
- SNR(Signal-to-Noise Ratio,信噪比):根据每个子带的信噪比来分配比特率。信噪比较高的子带分配更多的比特,从而保留更多的音频细节。
- LOUDNESS(响度):根据子带的响度来分配比特,通常会优先为响度较大的频段分配更多比特。
不同的分配方法影响编码器在音频信号中的细节保留,SNR方法通常用于高质量音频,而LOUDNESS方法适合于语音或其他频率范围比较窄的应用。
在蓝牙规范中的可选为:
Position | Allocation method | Support in SRC | Support in SNK |
Octet0; b1 | SNR | O | M |
Octet0; b0 | Loudness | M | M |
O表示可选;M表示必选;C1表示至少支持一个 |
6. 最小和最大比特池(Min and Max Bitpool)
app_cfg_const.sbc_min_bitpool = 2;
app_cfg_const.sbc_max_bitpool = 250;
比特池(Bitpool)决定了SBC编码的压缩程度和音频质量的平衡。较小的比特池值会导致较低的音频质量,但也能节省带宽;而较大的比特池值可以提供更好的音频质量,但会增加带宽需求。
- 最小比特池(Min Bitpool):最低的比特池值,通常用于低比特率和低音质的应用(如语音)。
- 最大比特池(Max Bitpool):最高的比特池值,适用于高音质要求的应用,如音乐流传输。
在蓝牙规范中推荐的比特池大小:
Position | Middle Quality | High Quality | ||||||
Momo | Joint Stereo | Momo | Joint Stereo | |||||
Sampling frequency(kHz) | 44.1 | 48 | 44.1 | 48 | 44.1 | 48 | 44.1 | 48 |
Bitpool value | 19 | 18 | 35 | 33 | 31 | 29 | 53 | 51 |
Resulting frame length(bytes) | 46 | 44 | 83 | 79 | 70 | 66 | 119 | 115 |
Resulting bit rate(kb/s) | 127 | 132 | 229 | 237 | 193 | 198 | 328 | 345 |
*Other settings: Block length = 16, Allocation method = Loudness, Subbands = 8 |