うならぼ

どうも。

BluetoothヘッドホンがA2DPで対応しているコーデックを調べる

初めてBluetoothヘッドホンを買いました。今になって思うと下調べが足りなかった気もする。

まあともかく、高音が足りない、いや全体的にこもってる感じ?いやビットレートが低い感じ??等々思い出して調べ始めたわけです。

A2DPで最低限サポートする必要があるコーデックはSBCで、その他にAACとかあります。iPhoneとかだとAACに対応してます。まあ詳しくは別途ググっていただくとして。

調べかた

ネゴシエーションを行う際にSink側でサポートするコーデックを問い合わせているので、それを覗きます。ググってみるとroot取ったAndroidでの情報が見つかりました。

bluetooth - How do I determine which A2DP codecs my phone supports/is currently using? - Android Enthusiasts Stack Exchange

Linux環境だとhcidumpというツールでダンプできますが、そもそもWiresharkが直接キャプチャできます。

接続の前後をキャプチャしておき、btavdtp でフィルタをかけると、 GetAllCapabilities というのが見つかります。中身はこんな感じ。

- Bluetooth AVDTP Protocol
 + Signal: GetAllCapabilities (ResponseAccept)
 - Capabilities
  + Service: Media Transport
  + Service: Media Codec - Audio SBC (16000 32000 44100 48000 | Mono DualChannel Stereo JointStereo | block: 4 8 12 16 | subbands: 4 8 | allocation: SNR Loudness | bitpool: 2..53)
  + Service: Content Protection - SCMS-T
  + Service: Delay Reporting

見事にSBCしか対応してませんね。ついでに対応するSetConfigurationも見てみましょう。

- Bluetooth AVDTP Protocol
 + Signal: SetConfiguration (Command)
 + ACP SEID [1 - Audio Sink]
 + INT SEID [1 - Audio Sink]
 - Capabilities
  + Service: Media Transport
  + Service: Media Codec - Audio SBC (44100 | JointStereo | block: 16 | subbands: 8 | allocation: Loudness | bitpool: 2..53)

はい。

あとがき

私が試した時、最初はWiresharkで直接キャプチャしようとすると Invalid argument といったエラーが出たり、hcidumpでキャプチャしてもペアリングや接続までは取れるのに Exit Sniff Mode といったメッセージを最後に途絶えてしまう、といったことがありました。直前に Encryption Change があったので試しに hcictl hci0 noencrypt とかやっていたら改善したものの、encryptに戻しても再発しないので関係ないのかも・・・?

なおきっかけとなった音質の話ですが、sbcencで上記のパラメータでエンコードし、これまで使っていた有線のヘッドホンで聞いてみたところ、特に問題は感じませんでした。bitpoolを下げてみてもまた違った劣化の仕方でしたし、結局BluetoothであることやSBCであることには関係なく、このヘッドホンの特性だったようで。

あとこのためにpulseaudioを導入しました。

参考 BluetoothのSBCって何ですか? - afnf.net