初めてBluetoothヘッドホンを買いました。今になって思うと下調べが足りなかった気もする。
まあともかく、高音が足りない、いや全体的にこもってる感じ?いやビットレートが低い感じ??等々思い出して調べ始めたわけです。
A2DPで最低限サポートする必要があるコーデックはSBCで、その他にAACとかあります。iPhoneとかだとAACに対応してます。まあ詳しくは別途ググっていただくとして。
調べかた
ネゴシエーションを行う際にSink側でサポートするコーデックを問い合わせているので、それを覗きます。ググってみるとroot取ったAndroidでの情報が見つかりました。
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を導入しました。