Bluetoothオーディオ品質を大幅に向上させるためにAndroidでBluetoothスタックを変更する方法

警告:これは、AndroidでBluetoothスタックを変更することに関する非常に高度なガイドです。このガイド全体を読み、記載されているとおりにすべての指示に従ってください。

BluetoothヘッドセットとBluetoothオーディオが非常に人気を博しているという事実にもかかわらず、Bluetoothはストリーミングで空気中に失われるため、Bluetoothはオーディオ品質を低下させることが証明されているため、オーディオ愛好家にとっては少々の問題です。

このため、一部のメーカーは、すべてのヘッドフォンとほとんどのBluetoothデバイスでサポートされている標準のSBC Bluetoothコーデックよりも音質を向上させるためにaptXおよびLDACコーデックを提供しています。消費者が長期的に支払うライセンス料が必要です。

SBC Bluetoothコーデックの低音質は、現在のすべてのBluetoothスタックとヘッドフォンの構成の人為的な制限が原因であり、この制限は既存のデバイスで回避できます。

Bluetoothオーディオに興味がある場合は、このガイドの最後で、Bluetoothオーディオログダンプを取得し、AndroidのBluetoothレシーバーから取得しているオーディオ品質と周波数の種類を確認する方法を説明します。

このガイドの大部分は、標準のSBC Bluetoothコーデックの出力品質を大幅に向上させるために、いくつかの簡単な調整とBluetoothオーディオ出力の読み方に焦点を当てます。このガイド全体は非常に教育的であり、さまざまなものがあるため、注意深くお読みくださいデバイスモデルに応じて、フラッシュまたは微調整します。

このガイドの最後には、多くの人気のあるAndroidデバイス用の事前にパッチされたBluetoothスタックのリストがあります。これらは、他のフラッシュ可能な.zipと同様に回復時にフラッシュできます。 AndroidでBluetoothスタックを変更するためのガイドに従ってください。

SBCコーデックに関する短い技術情報

SBCには、接続セットアップフェーズでネゴシエートされるさまざまなパラメータがたくさんあります。

  • オーディオチャンネルのタイプと番号:ジョイントステレオ、ステレオ、デュアルチャンネル、モノ。
  • 周波数帯域の数:4または8。
  • 1つのパケットのオーディオブロックの数:4、8、12、16。
  • 量子化ビット割り当てアルゴリズム:ラウドネス、SNR;
  • 量子化プロセスで使用される最大および最小ビットプール:通常2〜53。

これらのパラメーターの任意の組み合わせをサポートするには、デコーダーが必要です。 エンコーダはそれらの一部のみを実装できます。

通常、既存のBluetoothスタックは、ジョイントステレオ、8バンド、16ブロック、ラウドネス、ビットプール2..53のプロファイルをネゴシエートします。 このプロファイルは、328 kbpsのビットレートで44.1 kHzのオーディオをエンコードします。

ビットプールパラメータは、同じプロファイル内のビットレートに直接影響します。値が大きいほど、ビットレートが高くなるため、品質が高くなります。

ただし、bitpoolパラメーターは特定のプロファイルにバインドされていません。 ビットレートは、オーディオチャネルの種類、周波数帯域の数、オーディオブロックの数など、他のパラメーターの影響も大きく受けます。 ビットプールを変更せずに、非標準プロファイルをネゴシエートすることにより、ビットレートを間接的に増やすことができます。

たとえば、デュアルチャネルは、各チャネルのビットプール全体を使用して、チャネルを個別にエンコードします。 デバイスでジョイントステレオの代わりにデュアルチャネルを使用するように強制すると、同じ最大ビットプールである617 kbpsでビットレートがほぼ2倍になります。

私にとっては、ビットプールは内部変数であるべきだと感じています。 ビットプール値が他のコーデックパラメータにバインドされておらず、グローバル値としてのみ定義されているのは、A2DP仕様の設計上の誤りです。

これらの固定ビットプールとビットレートの値は、高品質オーディオの推奨値に由来します。 ただし、推奨事項は、プロファイルをこれらの値に制限する言い訳ではありません。

2007年から2015年までアクティブだったA2DP仕様v1.2では、すべてのデコーダーが最大512 kbpsのビットレートで正しく動作する必要があります。

SNKのデコーダーは、最大ビットレートを超過しないすべての可能なビットプール値をサポートするものとします。 このプロファイルは、使用可能な最大ビットレートをモノラルでは320 kb / s、2チャネルモードでは512 kb / sに制限します。

新しいバージョンの仕様では、ビットレートの制限はありません。 2015年以降にリリースされた最新のヘッドフォンは、 最大1000 kbpsのビットレートをサポートできると想定されています。

何らかの理由で、現在テストされているすべてのBluetoothスタック(Linux(PulseAudio)、Android、Blackberry、およびmacOS)には、最大ビットレートに直接影響する最大ビットプールパラメーターの人為的な制限があります。 しかし、これは最大の問題ではありません。ほとんどすべてのヘッドフォンは最大ビットプール値を53に制限しています。

ほとんどのデバイスは、507 kbpsのビットレートで修正されたBluetoothスタックで正常に動作し、割り込みやパチパチはありません。 しかし、このようなビットレートは、通常のBluetoothスタックでは通常の状態ではネゴシエートされません。

***以下のガイドを使用したテストに必要:bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso.torrent

PCでテストする方法

高ビットレートのSBCヘッドフォン互換性テストは、Bluetoothアダプターを搭載したPCで実行するのが最も簡単です。 仮想マシンで実行できる(Bluetoothアダプターを仮想マシン内のUSBデバイスとして接続することにより、ラップトップに組み込まれたアダプターでも動作する)または起動して、変更されたBluetoothスタックでUbuntuイメージを準備しましたUSBフラッシュドライブ。 この画像では、デュアルチャネル、8バンド、16ブロック、ラウドネス、ビットプール2..41、44.1 kHzのプロファイルを使用し、485 kbpsビットレートを提供します。

VMで実行する

  • VirtualboxおよびVirtualbox Extension Packをダウンロードします://www.virtualbox.org/wiki/Downloads;
  • Virtualboxをインストールして起動します。
  • File→Preferences→Extensionsを使用してExtension Packをインストールします。
  • 新しい仮想マシンを作成します:Linux、Ubuntu(64ビット)、1024 RAM。 HDDを作成しないでください。
  • 仮想マシンの設定に移動し、[ストレージ]で[コントローラー:IDE]、[空]を選択し、CDアイコンを押します→[仮想光ディスクファイルを選択]。
  • ダウンロードしたbluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.isoを選択します。
  • 設定ウィンドウを保存して閉じ、仮想マシンを起動します。
  • 右下のUSBケーブルアイコンを右クリックして、Bluetoothアダプターを選択します。

PCで実行する

このイメージは、BIOS / CSMおよびUEFIブートをサポートしています。

  • Etcherを使用して、イメージをUSBフラッシュドライブに書き込みます://etcher.io/。 この操作により、USBドライブ上の既存のファイルがすべて削除されます。
  • PCの電源を切ります。
  • USBフラッシュドライブを挿入し、PCの電源を入れて、起動順序ボタン(通常はEscまたはF12)を押します。
  • USBフラッシュドライブを選択します。

テストを実行する

  • (オプションですが推奨)デスクトップ上の「Btsnoop Dump」スクリプトをダブルクリックします。 後で分析するために、Bluetoothデータキャプチャを開始します。 端末ウィンドウを閉じないでください。
  • ヘッドフォンをペアリングモードに切り替えます。
  • 右上隅の矢印をクリックして、Bluetoothアイコン→Bluetooth設定を選択します。
  • ヘッドフォンを選択し、ペアリングが完了するまで待ってからウィンドウを閉じます。
  • Ubuntuのボリュームを約2/3に設定します。 また、ペアリング後に非常に大きな音量になる可能性があるため、ヘッドセットボタンを使用して音量を下げます。
  • 「音楽」フォルダを開き、「testrecord1.flac」を再生します。
  • (オプションですが推奨)プレーヤーを閉じ、ターミナルウィンドウを閉じます。 これにより、データキャプチャが停止します。
  • (オプションですが推奨)Firefoxブラウザーを開き、データダンプ(デスクトップ上のbtsnoop_hci.btsnoop)を//btcodecs.valdikss.org.ru/にアップロードします

音楽フォルダ内の他の音楽を聴くことも、独自の音楽をアップロードすることもできます。

ヘッドフォンにパチパチ音がしたり、音声が途切れたり、その他の音が歪んだりしないようにしてください。 高品質のサウンドが聞こえる場合、それはヘッドホンが485 kbpsのビットレートのオーディオをサポートしていることを意味します。

Androidデバイスでテストする方法

Androidスマートフォンまたはタブレットからテストするには、修正されたBluetoothスタックを使用する必要があります。これにはルート権限が必要です。

AndroidでBluetoothデータダンプをキャプチャする方法

  1. Bluetoothをオフにします。
  2. 開発者設定で、「Bluetooth HCIスヌープログを有効にする」スイッチを有効にします。
  3. Bluetoothをオンにし、Bluetoothメニューを使用してヘッドセットに接続します(これは重要です!自動接続を許可しないでください!);
  4. 短い音声サンプルを再生します。
  5. 開発者設定を開き、「Bluetooth HCIスヌープログを有効にする」スイッチを無効にします。
  6. /storage/emulated/0/btsnoop_hci.logまたは/data/misc/bluetooth/logs/btsnoop_hci.logが作成されているはずです。 見つからない場合は、/ etc / bluetooth / bt_stack.confをテキストエディターで開き、BtSnoopFileNameオプションのパスを確認します。

ヘッドフォンにパチパチ音がしたり、音声が途切れたり、その他の音が歪んだりしないようにしてください。 パッチが適用されたライブラリで高品質のサウンドが聞こえる場合、ヘッドフォンは512 kbpsのビットレートのオーディオをサポートしています。

上記のアルゴリズムに注意深く従ってください。 特に、ヘッドフォンの電源を切ったり、ペアリング後に切断したりする場合は、Bluetooth設定から手動でヘッドフォンに接続することが重要です。自動接続を許可しないでください。

少なくとも512 kbit / s SBCをサポートするデバイス

  • 1Mb iBFree
  • JBLエベレスト310
  • JBLエベレスト700
  • Skullcandy HESH 3
  • ソニーWI-C400
  • ソニーMDR-1ABT
  • ソニーMDR-ZX770BT
  • ソニーMDR-XB650BT
  • ソニーMDR-XB950B1
  • ソニーSBH50
  • Bluedio T4s(ビットプール最大39。応答はデュアルチャネルをサポートしませんが、強制された場合は動作します。462kbit /s。A2DP仕様に準拠していません。)
  • Bluedio T5(デュアルチャネルをサポートしないことに応答しますが、強制された場合は動作します。A2DP仕様に準拠していません。)
  • Bluedio T6(デュアルチャネルをサポートしないことに対応しますが、強制された場合は動作します。A2DP仕様に準拠していません。Max97220チップを採用します。)
  • Marshall Major II Bluetooth
  • オーバードライブRealForce D1
  • エディファイアーW830BT
  • DEXP BT-250
  • Logitech BTアダプター
  • Noname自動車用ヘッドユニット(CSR8645チップ)
  • Sony DSX-A400BT自動車用ヘッドユニット

512 kbit / sを超えるSBCをサポートするデバイス

  • JBL Everest 310(617-660 kbit / s)
  • Sony WI-C400(576 kbit / s)
  • ソニーMDR-ZX770BT(617-660 kbit / s)
  • Marshall Major II Bluetooth(617-660 kbit / s)
  • オーバードライブRealForce D1(730 kbit / s、デュアルチャンネル、4サブバンド)

高ビットレートまたはデュアルチャネルで動作しないデバイス

  1. Harper HB-202(クラックリング; Beken BK3256チップ)
  2. Sony Ericsson MW600(高周波歪み、パチパチ音、2009年以降のデバイス)

これが重要な理由:SBC 328kおよび485k対aptX

aptXの音質に対する一般的な信念に反して、場合によっては、標準の328kビットレートのSBCよりも音質が低下することがあります。

SBCは、周波数帯域に量子化ビットを動的に割り当て、「下から上」に基づいて動作します。 ビットレート全体が低周波数と中周波数に使用された場合、高周波数は「カットオフ」(無音)されます。

aptXは、同じビット数で周波数帯域を常に量子化します。これにより、44.1 kHzで352 kbps、48 kHzで384 kbpsの固定ビットレートコーデックになります。 それは、それらで最も必要とされる周波数に「ビットを転送」できません。 SBCとは異なり、aptXは周波数を「カット」しませんが、量子化ノイズを追加し、オーディオのダイナミックレンジを縮小し、時々クラックル音を発生させます。 反対に、SBCは「細部を食べる」–最も静かなエリアを破棄します。

平均して、SBC 328kと比較して、aptXは広い周波数範囲の音楽の歪みを抑えますが、狭い周波数範囲と広いダイナミックレンジの音楽ではSBC 328kが勝つことがあります。

特別なケース、ピアノの録音について考えてみましょう。 スペクトログラムは次のとおりです。

ほとんどのエネルギーは0〜4 kHzの周波数にあり、10 kHzまで持続します。

ファイルaptXファイルのスペクトログラムは次のようになります。

SBC 328kは次のとおりです。

SBC 328kは16 kHzを超える範囲を定期的に完全に遮断し、この値未満の範囲で利用可能なすべてのビットレートを使用していることがわかります。 ただし、aptXは、人間の耳で聞こえる周波数スペクトルにより多くの歪みを導入しました。これは、aptXスペクトログラムから減算された元のスペクトログラムで見ることができます(明るく、歪みが大きい)。

SBC 328kは0〜10 kHzの範囲の信号の歪みを抑えていますが、残りはカットされています。

SBCの485kのビットレートは、帯域を遮断することなく、周波数範囲全体を保存するのに十分でした。

このオーディオサンプルのSBC 485kは、0〜15 kHzの範囲でaptXよりもはるかに優れており、15〜22 kHz(より暗く、歪みが少ない)の小さいながらも顕著な違いがあります。

高ビットレートのSBCに切り替えると、ほとんどの場合、どのヘッドフォンでもaptXよりも優れたサウンドが得られます。

  • original_and_aptx.zip
  • sbc.zip

Android 5〜7でBluetoothスタックを変更する方法

これらの変更は、標準のAndroid BluetoothスタックBluedroid(Android 5)およびFluoride(Android 6-7)に適用する必要があります。 Qualcommで変更されたスタックはサポートされていません。

標準のSBC構成でジョイントステレオをデュアルチャネルに置き換えます

android / platform / external / bluetooth / bluedroid / btif / co / bta_av_co.c:99

コード:

 CONST tA2D_SBC_CIE btif_av_sbc_default_config = {BTIF_AV_SBC_DEFAULT_SAMP_FREQ、/ * samp_freq * / A2D_SBC_IE_CH_MD_JOINT、/ * ch_mode * / A2D_SBC_IE_BLOCKS_16、/ * block_len * / A2D_SBC_IE_SUBBAND_8、/ * num_subbands * / A2D_SBC_IE_ALLOC_MD_L、/ * alloc_mthd * / BTA_AV_CO_SBC_MAX_BITPOOL、/ * max_bitpool * / A2D_SBC_IE_MIN_BITPOOL / * min_bitpool * /}; 

A2D_SBC_IE_CH_MD_JOINTをA2D_SBC_IE_CH_MD_DUALに置き換えます。

デュアルチャネルの優先度を上げる

android / platform / external / bluetooth / bluedroid / btif / co / bta_av_co.c:4

コード:

 if(src_cap.ch_mode&A2D_SBC_IE_CH_MD_JOINT)pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT; else if(src_cap.ch_mode&A2D_SBC_IE_CH_MD_STEREO)pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO; else if(src_cap.ch_mode&A2D_SBC_IE_CH_MD_DUAL)pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL; else if(src_cap.ch_mode&A2D_SBC_IE_CH_MD_MONO)pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO; A2D_SBC_IE_CH_MD_DUALでifを一番上に移動します。 
  1. ビットレート制限を無効にするか増やす

Android Bluetoothスタックには、ビットプールの制限だけでなく、ビットレートの制限、328 kbit / sもあります。 たとえば、ヘッドフォンが48 kHzのビットプール53をサポートしている場合、Androidはビットプールを328 kbit / sの制限に合うように減らします。 これは、エンコードステージでのコーデックネゴシエーションの後に発生し、Bluetooth SetCapabilitiesパケットのビットプール値を考慮しません。

android / platform / external / bluetooth / bluedroid / btif / src / btif_media_task.c:172

コード:

 #define DEFAULT_SBC_BITRATE 328 

512に置き換えます。

  1. (実験のみ)MTU制限を無効にします。

これは、〜580 kbit / sを超えるビットレートに必要です。

btif / src / btif_media_task.c:174

コード:

 / * 679バイトの2DH5ペイロードサイズ-(4バイトL2CAPヘッダー+ 12バイトAVDTPヘッダー)* / #define MAX_2MBPS_AVDTP_MTU 663 

Android 8〜9でBluetoothスタックを変更する方法

これらの変更はテストされていませんが、機能するはずです。

デュアルチャネルサポートをA2DP SBCソースに追加

/platform/system/bt/stack/a2dp/a2dp_sbc.cc:55

コード:

 / * SBC SRCコーデック機能* / static const tA2DP_SBC_CIE a2dp_sbc_caps = A2DP_SBC_IE_SAMP_FREQ_44、/ * samp_freq * /(A2DP_SBC_IE_CH_MD_MONO; 

ch_modeでA2DP_SBC_IE_CH_MD_DUALを追加します。

デフォルト設定でジョイントステレオをデュアルチャネルに置き換え

/platform/system/bt/stack/a2dp/a2dp_sbc.cc:82

コード:

 / *デフォルトSBCコーデック設定* / constのtA2DP_SBC_CIE a2dp_sbc_default_config = {A2DP_SBC_IE_SAMP_FREQ_44、/ * samp_freq * / A2DP_SBC_IE_CH_MD_JOINT、/ * ch_mode * / A2DP_SBC_IE_BLOCKS_16、/ * block_len * / A2DP_SBC_IE_SUBBAND_8、/ * num_subbands * / A2DP_SBC_IE_ALLOC_MD_L、/ * alloc_method * / A2DP_SBC_IE_MIN_BITPOOL、 / * min_bitpool * / A2DP_SBC_MAX_BITPOOL、/ * max_bitpool * / BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16 / * bits_per_sample * /}; 

A2DP_SBC_IE_CH_MD_JOINTをA2DP_SBC_IE_CH_MD_DUALに置き換えます。

デュアルチャネルの優先度を上げる

/platform/system/bt/stack/a2dp/a2dp_sbc.cc:1155

コード:

 static bool select_best_channel_mode(uint8_t ch_mode、tA2DP_SBC_CIE * p_result、btav_a2dp_codec_config_t * p_codec_config){if(ch_mode&A2DP_SBC_IE_CH_MD_JOINT){p_result-> ch_mode = A2DP_MD_BC_MD_BC p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; trueを返します。 } if(ch_mode&A2DP_SBC_IE_CH_MD_STEREO){p_result-> ch_mode = A2DP_SBC_IE_CH_MD_STEREO; p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; trueを返します。 } if(ch_mode&A2DP_SBC_IE_CH_MD_DUAL){p_result-> ch_mode = A2DP_SBC_IE_CH_MD_DUAL; p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; trueを返します。 } if(ch_mode&A2DP_SBC_IE_CH_MD_MONO){p_result-> ch_mode = A2DP_SBC_IE_CH_MD_MONO; p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_MONO; trueを返します。 } falseを返します。 } 

A2DP_SBC_IE_CH_MD_DUALでifを一番上に移動します。

ビットレート制限を増やす

/platform/system/bt/stack/a2dp/a2dp_sbc_encoder.cc:42

コード:

 #define A2DP_SBC_DEFAULT_BITRATE 328 

512に置き換えます。

  1. (実験のみ)MTU制限を無効にする

これは、〜580 kbit / sを超えるビットレートに必要です。

/platform/system/bt/stack/a2dp/a2dp_sbc_encoder.cc:47

コード:

 #define MAX_2MBPS_AVDTP_MTU 663 

パッチを適用したBluetoothスタック(フラッシュ可能)

  • Le Max 2 Oreo Patched.zip
  • LeEcoクールチェンジャーS1 EUI_5.8.19S.zip
  • Leeco LE2(EUI 5.9.26s、Android 6).zip
  • Xiaomi Mi Note(Miui 9 Miui.su usnkreal v8.4.12、Android 6.0.1).zip
  • Xiaomi mi note 3(MIUI 9、Android 7).zip
  • Xiaomi Mi4c(Android 7.0 NRD90M、MIUI-9.5 9.5.1.0(NXKCNFA))。zip
  • Xiaomi MI5s(MIUI Global 9.6.1.0、Android 7).zip
  • Xiaomi Redmi 3s(Android 6.01、mmb29m、miui global 9.6.1.0).zip
  • Xiaomi Redmi 4(MiuiPro 10 8.8.2、Android 6.0.1、MMB29M).zip
  • Xiaomi Redmi 4 Prime.zip
  • Xiaomi Redmi 4 pro(MIUI 9、miuipro 8.4.26).zip
  • Xiaomi Redmi Note 3(Resurrection Remix Android 7.1.2_r36).zip
  • Redmi Note 4x(Masik Premium、Android 7.0).zip
  • Asus Zoom(Android 5、2.26.40.108_20160520).zip
  • Le Max 2 Oreo Patched.zip
  • Huawei P9(Android 7).zip
  • Samsung Galaxy S4 LTE GT-I9505(Android 7.1.2; LineageOS 14.1-20180615-NIGHTLY-jfltexx).zip
  • zip
  • Le Max 2 Oreo Patched.zip

興味深い記事