目錄
一、SBC編解碼器互操作性概述
二、編解碼器特定信息元素(Codec Specific Information Elements)
2.1 采樣頻率(Sampling Frequency)
2.2 聲道模式(Channel Mode)
2.3 塊長度(Block Length)
2.4 子帶數量(Subbands)
2.5 分配方法(Allocation Method)
2.6 最小 / 最大比特池值(Bitpool Value)
三、媒體數據包頭部要求
3.1 時間戳(Timestamp, TS)
3.2 有效負載類型(Payload type, PT)
3.3 標記(Marker, M)位
3.4 擴展(Extension, X)位
3.5 代碼示例(C語言模擬設置媒體數據包頭部)
四、媒體有效負載格式(Media payload format )
4.1 媒體有效負載組成
4.2 媒體有效負載格式選擇依據
4.3 媒體有效負載頭部格式
4.4 代碼示例(C 語言模擬媒體有效負載生成)
五、總結
六、參考資料
在藍牙音頻傳輸中,SBC(Subband Codec)作為一種強制支持的音頻編解碼器,其互操作性要求對于確保不同設備間的無縫音頻傳輸至關重要。本文深入剖析SBC編解碼器的互操作性要求,包括其特定的信息元素、采樣頻率、聲道模式、塊長度、子帶分配方法、比特池值等關鍵參數,以及媒體包頭和有效載荷格式的詳細規范。
一、SBC編解碼器互操作性概述
SBC編解碼器是藍牙規范的一部分,其互操作性要求在藍牙音頻傳輸中占據核心地位。根據SPEC規范,所有支持藍牙音頻的設備都必須支持SBC編解碼器。SBC編解碼器的規范詳細定義了如何在信號傳輸過程中使用特定的信息元素,以及這些元素如何影響音頻傳輸的質量和效率。其編解碼器規范可在SPEC的附錄 B 中找到。
二、編解碼器特定信息元素(Codec Specific Information Elements)
SBC 編解碼器特定信息元素用于信令過程,其結構如下圖所示。
這些元素分布在 4 個八位字節(Octet)中,每個八位字節承擔不同的功能。
-
Octet0:包含兩個重要信息,即采樣頻率和聲道模式。這兩個參數對于音頻的采集和播放聲道布局起著決定性作用。
-
Octet1:涵蓋塊長度、子帶數量和分配方法。塊長度影響音頻數據的處理單元大小,子帶數量關系到音頻的頻帶劃分,分配方法則決定了比特率在各個子帶間的分配策略。
-
Octet2:表示最小比特池值,為音頻編碼過程中的比特率下限提供了限制。
-
Octet3:代表最大比特池值,規定了音頻編碼時比特率的上限。
①不同消息中的設置規則:
-
AVDTP_GET_ALL_CAPABILITIES_RSP 消息:在該消息中,每個字段可以定義或設置一個或多個位。意味著設備在響應獲取所有能力的請求時,可以表明自己支持多種不同的參數組合,體現了設備的多樣性和靈活性。
-
AVDTP_SET_CONFIGURATION_CMD 消息和 AVDTP_RECONFIGURE_CMD 消息:在這兩個消息中,每個字段只能定義或設置一個位。因為在配置或重新配置設備時,需要明確指定具體的參數值,以確保設備按照預期進行工作。
②代碼示例(模擬設置 SBC 編解碼器參數)
以下是一個簡單的 C 語言示例,用于模擬設置 SBC 編解碼器的參數,并根據不同的消息類型進行相應的位設置。
#include <stdio.h>
#include <stdint.h>// 定義 SBC 編解碼器特定信息元素結構體
typedef struct {uint8_t octet0; // 采樣頻率和聲道模式uint8_t octet1; // 塊長度、子帶數量和分配方法uint8_t octet2; // 最小比特池值uint8_t octet3; // 最大比特池值
} SBC_Codec_Info;// 模擬 AVDTP_GET_ALL_CAPABILITIES_RSP 消息設置
void set_capabilities_response(SBC_Codec_Info *info) {// 假設支持多種采樣頻率和聲道模式info->octet0 = 0b11001100; // 示例設置// 支持多種塊長度、子帶數量和分配方法info->octet1 = 0b11111100; // 示例設置info->octet2 = 10; // 最小比特池值info->octet3 = 50; // 最大比特池值
}// 模擬 AVDTP_SET_CONFIGURATION_CMD 消息設置
void set_configuration_command(SBC_Codec_Info *info) {// 明確指定采樣頻率和聲道模式info->octet0 = 0b01000000; // 示例設置// 明確指定塊長度、子帶數量和分配方法info->octet1 = 0b00010000; // 示例設置info->octet2 = 20; // 最小比特池值info->octet3 = 40; // 最大比特池值
}// 打印 SBC 編解碼器信息
void print_sbc_info(SBC_Codec_Info *info) {printf("Octet0: 0x%02X\n", info->octet0);printf("Octet1: 0x%02X\n", info->octet1);printf("Octet2: 0x%02X\n", info->octet2);printf("Octet3: 0x%02X\n", info->octet3);
}int main() {SBC_Codec_Info sbc_info;// 模擬 AVDTP_GET_ALL_CAPABILITIES_RSP 消息set_capabilities_response(&sbc_info);printf("AVDTP_GET_ALL_CAPABILITIES_RSP message settings:\n");print_sbc_info(&sbc_info);// 模擬 AVDTP_SET_CONFIGURATION_CMD 消息set_configuration_command(&sbc_info);printf("\nAVDTP_SET_CONFIGURATION_CMD message settings:\n");print_sbc_info(&sbc_info);return 0;
}
2.1 采樣頻率(Sampling Frequency)
SBC 的采樣頻率信息通過 Octet0
中的特定位來表示。
①總體支持要求:
-
解碼端(SNK):對于 SNK 中的解碼器,必須支持 44.1kHz 和 48kHz 這兩種采樣頻率。意味著在接收音頻數據進行解碼時,解碼器能夠處理以這兩種頻率采樣的音頻信號。
-
編碼端(SRC):SRC 中的編碼器至少要支持 44.1kHz 和 48kHz 中的一種采樣頻率。為編碼器提供了一定的靈活性,可以根據實際情況選擇支持其中一種頻率進行音頻編碼。
②代碼示例(模擬檢查采樣頻率支持情況)
以下是一個簡單的 C 語言示例,用于模擬檢查 SBC 編碼端和解碼端對采樣頻率的支持情況。
#include <stdio.h>
#include <stdint.h>// 定義采樣頻率支持標志位
#define SUPPORT_16000HZ (1 << 7)
#define SUPPORT_32000HZ (1 << 6)
#define SUPPORT_44100HZ (1 << 5)
#define SUPPORT_48000HZ (1 << 4)// 檢查解碼端采樣頻率支持情況
int check_snk_sampling_frequency(uint8_t support_flags) {// 檢查是否支持 44.1kHz 和 48kHzif ((support_flags & SUPPORT_44100HZ) && (support_flags & SUPPORT_48000HZ)) {return 1; // 支持}return 0; // 不支持
}// 檢查編碼端采樣頻率支持情況
int check_src_sampling_frequency(uint8_t support_flags) {// 檢查是否支持 44.1kHz 或 48kHzif ((support_flags & SUPPORT_44100HZ) || (support_flags & SUPPORT_48000HZ)) {return 1; // 支持}return 0; //