Android
 Computer >> コンピューター >  >> トラブルシューティング >> Android

大幅に強化されたBluetoothオーディオ品質のためにAndroidでBluetoothスタックを変更する方法

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

BluetoothヘッドセットとBluetoothオーディオが非常に人気になっているという事実にもかかわらず、Bluetoothストリーミングを介してオーディオ情報と周波数の一部が空中で失われるため、Bluetoothはオーディオ品質を低下させることが証明されているため、オーディオファンにとっては少し問題です。

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

SBC Bluetoothコーデックの音質が低いのは、現在のすべてのBluetoothスタックとヘッドフォンの構成が人為的に制限されているためです。この制限は、既存のデバイスでは回避できます。

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

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

このガイドの最後に、多くの人気のあるAndroidデバイス用に事前にパッチが適用されたBluetoothスタックのリストがあります。これらは、他のフラッシュ可能な.zipと同じように、リカバリでフラッシュできます。どのデバイスも自分のものではない場合は、次のようになります。 AndroidでBluetoothスタックを変更するためのガイドに従います。

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

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

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

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

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

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

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

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

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

これらの固定ビットプールおよびビットレート値は、高品質オーディオの推奨値に基づいています。ただし、推奨事項は、プロファイルをこれらの値に制限する言い訳にはなりません。

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

SNKのデコーダーは、最大ビットレートを超えない可能性のあるすべてのビットプール値をサポートする必要があります。このプロファイルは、使用可能な最大ビットレートをモノラルの場合は320kb / s、2チャンネルモードの場合は512kb/sに制限します。

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

何らかの理由で、現在テストされているすべての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スタックを使用してUbuntuイメージを準備しました。これは、仮想マシンのように実行できます(Bluetoothアダプターを仮想マシン内のUSBデバイスとして接続することで、ラップトップに組み込まれているアダプターでも機能します)。 USBフラッシュドライブ。この画像は次のプロファイルを使用しています:デュアルチャネル、8バンド、16ブロック、ラウドネス、ビットプール2..41、44.1 kHz、485kbpsビットレートを提供します。

VMでの実行

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

PCで実行

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

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

テストの実行

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

ミュージックフォルダで他の音楽を聴いたり、自分の音楽をアップロードしたりできます。

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

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

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

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

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

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

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

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

  • 1MORE iBFree
  • JBLエベレスト310
  • JBLエベレスト700
  • Skullcandy HESH 3
  • ソニーWI-C400
  • Sony MDR-1ABT
  • Sony MDR-ZX770BT
  • Sony MDR-XB650BT
  • Sony MDR-XB950B1
  • ソニーSBH50
  • Bluedio T4s(ビットプール最大39。デュアルチャネルをサポートしないように応答しますが、強制された場合は動作します、462 kbit / s。A2DP仕様に準拠していません。)
  • Bluedio T5(デュアルチャネルをサポートしないように応答しますが、強制された場合は機能します。A2DP仕様に準拠していません。)
  • Bluedio T6(デュアルチャネルをサポートしないように応答しますが、強制的に機能します。A2DP仕様に準拠していません。Max97220チップを採用してください。)
  • マーシャルメジャーIIBluetooth
  • RealForceD1をオーバードライブ
  • Edifier W830BT
  • DEXP BT-250
  • LogitechBTアダプター
  • ノーネームの自動車用ヘッドユニット(CSR8645チップ)
  • SonyDSX-A400BT自動車用ヘッドユニット

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

  • JBL Everest 310(617-660 kbit / s)
  • Sony WI-C400(576 kbit / s)
  • Sony 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年のデバイス)

これが重要な理由:SBC328kおよび485kとaptX

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

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

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

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

特別な場合、ピアノの録音を考えてみましょう。スペクトログラムは次のとおりです:

大幅に強化されたBluetoothオーディオ品質のためにAndroidでBluetoothスタックを変更する方法
最もエネルギーが高いのは0〜4 kHzの周波数で、最大10kHzまで持続します。
ファイルaptXファイルのスペクトログラムは次のようになります。
大幅に強化されたBluetoothオーディオ品質のためにAndroidでBluetoothスタックを変更する方法

これがSBC328kです:
大幅に強化されたBluetoothオーディオ品質のためにAndroidでBluetoothスタックを変更する方法

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

大幅に強化されたBluetoothオーディオ品質のためにAndroidでBluetoothスタックを変更する方法
SBC 328kは、0〜10 kHzの範囲の信号の歪みを少なくしましたが、残りは次のようになっています:
大幅に強化されたBluetoothオーディオ品質のためにAndroidでBluetoothスタックを変更する方法

SBCのビットレート485kは、帯域を切断することなく、周波数範囲全体を保存するのに十分でした。
大幅に強化されたBluetoothオーディオ品質のためにAndroidでBluetoothスタックを変更する方法

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

大幅に強化されたBluetoothオーディオ品質のためにAndroidでBluetoothスタックを変更する方法

高ビットレートの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:41

コード:

 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の場合は上に移動します。

  1. ビットレート制限を無効にするか増やす

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

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スタックを変更する方法

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

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

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

コード:

 / * SBC SRCコーデック機能* /静的定数tA2DP_SBC_CIE a2dp_sbc_caps ={A2DP_SBC_IE_SAMP_FREQ_44、/ * samp_freq * /(A2DP_SBC_IE_CH_MD_MONO | A2DP_SBC_IE_CH_MD_JOINT)、/ * ch_mode * /(A2DP_SBC_IE_BLOCKS_16 | A2DP_SBC_IE_BLOCKS_12 | A2DP_SBC_IE_BLOCKS_8 | A2DP_SBC_IE_BLOCKS_4)、/ * * / 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 * /}; 

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_SAM_ 

A2DP_SBC_IE_CH_MD_JOINTをA2DP_SBC_IE_CH_MD_DUALに置き換えます。

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

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

コード:

静的ブールselect_best_channel_mode
(uint8_tのch_modeをtA2DP_SBC_CIE * p_result、* p_codec_config btav_a2dp_codec_config_t){IF(ch_mode&A2DP_SBC_IE_CH_MD_JOINT){p_result-> ch_mode =A2DP_SBC_IE_CH_MD_JOINT。 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を使用している場合は、一番上に移動します。

ビットレート制限を引き上げる

/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 

  1. Android で Bluetooth デバイスのバッテリー レベルを表示する方法

    技術の世界の進歩に伴い、技術デバイスもワイヤレス化されています。以前は、ワイヤを使用してオーディオに接続したり、あるデバイスから別のデバイスにファイルを転送したりしていました。しかし今では、Bluetooth デバイスを使用してオーディオを聴いたり、あるデバイスから別のデバイスにワイヤレスでファイルを転送したりと、すべてをワイヤレスで簡単に行うことができます。 近年、Bluetooth デバイスの使用が増加しています。 Bluetooth デバイスは、Android デバイスで使用する前に充電する必要があります。 Android デバイスのバージョン 8.1 以降では、Bluetooth デ

  2. Android 向けの最高の無料音声編集アプリ 18 選

    オーディオ部分の編集は、映画、ラジオ、ポッドキャストなど、あらゆるプロジェクトに不可欠です。現在のソーシャル メディアのトレンドを見ると、非常に多くの小規模なミュージシャンやコンテンツ クリエーターが、コンテンツを最高の状態でアップロードするために基本的なオーディオ エディターを必要としています。彼らの才能と創造性。携帯電話用のポータブル オーディオ エディターをお探しの場合は、作業を大幅に支援できる Android スマートフォン用の最高の無料オーディオ編集アプリのアイデアをいくつかご紹介します。音声編集アプリのリストを始める前に、これらの無料の音声編集アプリの作業プロセスについて 1 つか