我們修改藍牙堆疊以改善不使用 AAC、aptX 和 LDAC 編解碼器的耳機的聲音

在閱讀本文之前,建議您先閱讀上一篇文章: 透過藍牙的音訊:有關設定檔、編解碼器和裝置的最大詳細信息

一些無線耳機使用者反映,在使用所有音訊設備都支援的標準 SBC 藍牙編解碼器時,音質較差且缺乏高頻。 改善音質的常見建議是購買支援 aptX 和 LDAC 編解碼器的設備和耳機。 這些編解碼器需要許可費用,因此支援它們的設備更加昂貴。

事實證明,SBC 的低品質是由於藍牙堆疊和耳機設定的人為限製造成的,而透過對智慧型手機或電腦進行軟體更改,可以在任何現有設備上繞過此限制。

編解碼器SBC

SBC 編解碼器具有許多在連接設定階段協商的不同參數。 他們之中:

  • 聲道數量與類型:聯合立體聲、立體聲、雙聲道、單聲道;
  • 頻段數量:4或8;
  • 包裝內塊數:4、​​8、12、16;
  • 量化期間分配比特的演算法:響度、SNR;
  • 量化期間使用的位元池(bitpool)的最大值和最小值:通常從 2 到 53。

解碼設備必須支援這些參數的任意組合。 編碼器可能無法實現所有功能。
現有的藍牙堆疊通常同意以下設定檔:聯合立體聲、8 個頻段、16 個區塊、響度、位元池 2..53。 此設定檔以 44.1 kbps 的位元速率對 328 kHz 音訊進行編碼。
位元池參數直接影響一個設定檔中的位元率:此參數越高,位元率越高,因此品質也越高。
然而,位池參數並不依賴特定的配置; 位元率也很大程度上受到其他參數的影響:通道類型、頻帶數量、區塊數量。 您可以透過同意非標準設定檔來間接提高比特率,而無需更改比特池。

我們修改藍牙堆疊以改善不使用 AAC、aptX 和 LDAC 編解碼器的耳機的聲音

SBC碼率計算公式

例如,雙通道模式會單獨對通道進行編碼,為每個通道使用整個位元池。 透過強制設備使用雙通道而不是聯合立體聲,我們在相同的最大位元池值下獲得幾乎雙倍的位元率:617 kbps。
在我看來,在協商階段使用未與設定檔綁定的位元池值是 A2DP 標準中的缺陷,這導致了 SBC 品質的人為限制。 協商比特率比協商比特池更有意義。

這些固定的比特池和比特率值源自於包含用於高品質音訊的建議值的表。 但推薦並不是將自己限制在這些價值觀的理由。

我們修改藍牙堆疊以改善不使用 AAC、aptX 和 LDAC 編解碼器的耳機的聲音

A2DP v1.2 規範於 2007 年至 2015 年有效,要求所有解碼設備在高達 512 kbps 的位元率下正常運作:

SNK 的解碼器應支援不會導致超過最大位元速率的所有可能的位元池值。 此設定檔將單聲道模式的可用最大位元率限制為 320kb/s,雙通道模式的可用最大位元率限制為 512kb/s。

在新版的規格中,對位元率沒有限制。 據估計,2015年後發布的支援EDR的現代耳機可以支援高達約730 kbps的位元率。

由於某種原因,我測試的 Linux (PulseAudio)、Android、Blackberry 和 macOS 藍牙堆疊對位元池參數的最大值進行了人為限制,這直接影響了最大位元速率。 但這還不是最大的問題;幾乎所有耳機也將最大位元池值限制為 53。
正如我已經看到的,大多數設備在比特率為 551 kbps 的修改後的藍牙堆疊上完美工作,沒有中斷或裂縫。 但在正常條件下,在常規藍牙堆疊上,這樣的位元率永遠不會一致。

修改藍牙堆疊

任何與 A2DP 標準相容的藍牙堆疊都支援雙通道模式,但無法從介面啟動它。

讓我們在介面中加入一個切換開關! 我已經為Android 8.1 和Android 9 製作了補丁,為堆疊添加了完整的雙通道支持,在開發工具中的模式切換選單中添加了一個模式,並將支持雙通道的SBC 視為像aptX 這樣的附加編解碼器、AAC 或 LDAC(Android 稱為 HD 音訊),方法是在藍牙裝置設定中新增複選標記。 它看起來是這樣的:

我們修改藍牙堆疊以改善不使用 AAC、aptX 和 LDAC 編解碼器的耳機的聲音

安卓9補丁
安卓8.1補丁

當啟動此複選框時,藍牙音訊開始以位元率傳輸 551kbps,如果耳機支援 3 Mbit/s 的連線速度,或 452kbps,如果耳機僅支援 2 Mbit/s。

該補丁包含在以下替代韌體中:

  • LineageOS
  • 復活混音
  • 機器人

551 和 452 kbit/s 從何而來?

藍牙空中共享技術旨在高效傳輸大型固定大小的資料包。 資料傳輸發生在時隙中,一次傳輸中發送的最大時隙數為5。也有使用1 或3 個時隙的傳輸模式,但不使用2 或4 個時隙。在5 個時隙中,您可以以連線速度傳輸最多679 位元組速度為 2 Mbit/s 時,速度可達 1021 Mbit/s,高達 3 位元組;速度分別為 3 - 367 位元組和 552 位元組。

我們修改藍牙堆疊以改善不使用 AAC、aptX 和 LDAC 編解碼器的耳機的聲音

如果我們要傳輸的資料少於 679 或 1021 字節,但多於 367 或 552 字節,則傳輸仍然需要 5 個時隙,並且資料會同時傳輸,從而降低了傳輸效率。

我們修改藍牙堆疊以改善不使用 AAC、aptX 和 LDAC 編解碼器的耳機的聲音

雙通道模式下的 SBC,44100 Hz 音頻,Bitpool 38 個參數,每幀 16 個區塊,8 個頻率範圍,將音頻編碼為 164 位元組幀,位元率為 452 kbps。
音訊必須封裝在 L2CAP 和 AVDTP 傳輸協定中,這些協定從音訊有效負載中佔用 16 個位元組。

我們修改藍牙堆疊以改善不使用 AAC、aptX 和 LDAC 編解碼器的耳機的聲音

因此,一個具有 5 個插槽的藍牙傳輸可以容納 4 個音訊幀:

679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (заголовок SBC) - (164*4) = 6

我們將 11.7 毫秒的音訊資料放入正在傳送的資料包中,該資料包將在 3.75 毫秒內傳輸,並且資料包中還剩下 6 個未使用的位元組。
如果稍微提高位元池,將不再可能將 4 個音訊幀打包到一個包中。 您必須一次發送 3 幀,這會降低傳輸效率​​,減少每幀傳輸的音訊量,並且在無線電條件較差的情況下會更快地導致音訊卡頓。

同樣,為 EDR 551 Mbit/s 選擇 3 kbit/s 的位元率:使用 Bitpool 47,每幀 16 個區塊,8 個頻率範圍,幀大小為 200 位元組,位元率為 551 kbit/s。 一包包含 5 幀或 14.6 毫秒的音樂。

計算所有SBC參數的演算法相當複雜,如果手動計算很容易混淆,所以我做了一個互動式計算器來幫助有興趣的人: btcodecs.valdikss.org.ru/sbc-位元率計算器

為什麼需要這一切?

與人們對 aptX 編解碼器音質的普遍看法相反,在某些檔案上,它產生的結果比標準位元率為 328 kbps 的 SBC 還要差。

SBC 按照從低到高的方式將量化位元動態分配到頻帶。 如果所有位元率都用於低頻和中頻,則高頻將被「切斷」(反而會出現靜音)。
aptX 始終使用相同位數量化頻段,這就是它具有恆定位元率的原因:352 kHz 為 44.1 kbps,384 kHz 為 48 kbps,並且它無法「位移」到最需要它們的頻率。 與 SBC 不同,aptX 不會「削減」頻率,而是會為頻率添加量化噪聲,從而降低音頻的動態範圍,有時還會引入特有的爆裂聲。 SBC「吃掉細節」-丟棄最安靜的區域。
平均而言,與SBC 328k相比,aptX在寬頻率範圍的音樂中引入的失真較少,但在窄頻率範圍和寬動態範圍的音樂中,SBC 328k有時會勝出。

讓我們考慮一個特殊情況。 鋼琴演奏錄音的頻譜圖:
我們修改藍牙堆疊以改善不使用 AAC、aptX 和 LDAC 編解碼器的耳機的聲音

主要能量位於 0 至 4 kHz 的頻率,並持續到 10 kHz。
在 aptX 中壓縮的檔案的頻譜圖如下所示:
我們修改藍牙堆疊以改善不使用 AAC、aptX 和 LDAC 編解碼器的耳機的聲音

這就是 SBC 328k 的樣子。
我們修改藍牙堆疊以改善不使用 AAC、aptX 和 LDAC 編解碼器的耳機的聲音

可以看出,SBC 328k 週期性地完全關閉 16 kHz 以上的範圍,並將所有可用位元率花在低於該值的範圍上。 然而,aptX 在人耳可聽的頻譜中引入了更多的失真,從 aptX 頻譜圖減去原始頻譜圖中可以看出(越亮,失真越大):
我們修改藍牙堆疊以改善不使用 AAC、aptX 和 LDAC 編解碼器的耳機的聲音

而 SBC 328k 在 0 至 10 kHz 範圍內對訊號的破壞較小,並切斷其餘部分:
我們修改藍牙堆疊以改善不使用 AAC、aptX 和 LDAC 編解碼器的耳機的聲音

SBC 的 485k 位元速率足以保留整個頻率範圍,而無需停用頻段。
我們修改藍牙堆疊以改善不使用 AAC、aptX 和 LDAC 編解碼器的耳機的聲音

在該軌道上,SBC 485k 在 0-15 kHz 範圍內明顯領先 aptX,15-22 kHz 的差異較小但仍然明顯(越暗失真越少):
我們修改藍牙堆疊以改善不使用 AAC、aptX 和 LDAC 編解碼器的耳機的聲音

原始音訊、SBC 和 aptX 存檔.

透過切換到高位元率 SBC,您將獲得在任何耳機上都優於 aptX 的音訊。 在支援 3 Mbps EDR 連接的耳機上,551 kbps 的位元率可產生與 aptX HD 相當的聲音。

你還能做得更多嗎?

Android 修補程式還包括進一步提高 2 Mbps EDR 裝置位元率的選項。 您可以將位元率從 452 kbit/s 增加到 595 kbit/s,但代價是在困難的無線電條件下降低傳輸穩定性。
將 persist.bluetooth.sbc_hd_higher_bitrate 變數設為 1 就足夠了:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

目前,極限位元速率補丁僅在 LineageOS 15.1 中採用,在 16.0 中尚未採用。

設備兼容性

幾乎所有耳機、揚聲器和汽車音響主機都支援 SBC 雙聲道。 這並不奇怪 - 該標準需要任何解碼設備的支援。 此模式會在少數設備上導致問題,但這些都是孤立的實例。
有關兼容設備的更多詳細信息,請訪問 4pdaXDA開發.

聲音差異比較

我製作了一個 Web 服務,可以在瀏覽器中即時將音訊編碼為 SBC(以及 aptX 和 aptX HD)。 有了它,您可以在任何有線耳機、揚聲器和您喜愛的音樂上比較不同 SBC 配置文件和其他編解碼器的聲音,而無需實際通過藍牙傳輸音頻,還可以在播放音頻時直接更改編碼參數。
btcodecs.valdikss.org.ru/sbc-encoder

聯絡 Android 開發者

我寫信給 Google 的許多藍牙堆疊開發人員,要求他們考慮在 Android 主分支 - AOSP 中添加補丁,但沒有收到任何回應。 我的補丁在 適用於 Android 的 Gerrit 補丁系統 任何相關人員也沒有發表評論。
如果我能得到一些幫助來聯繫 Google 的開發人員並將 SBC HD 引入 Android,我會很高興。 gerrit中的補丁已經過時了(這是早期的修訂之一),如果開發者對我的更改感興趣我會更新它(對我來說更新它並不容易,我沒有兼容Android Q的設備)。

結論

使用 LineageOS、Resurrection Remix 和 crDroid 韌體的智慧型手機用戶現在只需啟動藍牙裝置設定中的選項即可享受改進的音質。 Linux 用戶還可以透過安裝來獲得更高的 SBC 位元率 巴利·羅哈爾的補丁,其中增加了對 aptX、aptX HD 和 FastStream 編解碼器的支援。

來源: www.habr.com

添加評論