- Kualitas suara rendah pada codec SBC standar bukan hanya berasal dari keterbatasan codec, tetapi juga dari pembatasan konservatif pada stack Bluetooth dan pengaturan headphone, sehingga perangkat lama pun masih punya ruang untuk ditingkatkan lewat modifikasi perangkat lunak
- Stack Bluetooth umum biasanya menegosiasikan stereo 44.1kHz pada 328kbps, tetapi jika Dual Channel dipaksa, dengan bitpool 53 yang sama nilainya bisa naik hingga sekitar 617kbps
- Patch Android 8.1·9 menambahkan SBC Dual Channel ke pengaturan perangkat Bluetooth seperti opsi HD Audio, dan menggunakan 551kbps untuk perangkat EDR 3Mb/s serta 452kbps untuk perangkat EDR 2Mb/s
- 551kbps dan 452kbps adalah nilai yang mempertimbangkan efisiensi transmisi Bluetooth 5-slot; jika bitpool dinaikkan lebih jauh, jumlah frame yang bisa digabung berkurang sehingga kemungkinan putus di kondisi nirkabel buruk meningkat
- Pengguna LineageOS, Resurrection Remix, dan crDroid bisa mengaktifkan SBC bitrate tinggi lewat kotak centang di pengaturan, sementara pengguna Linux bisa mendapatkan bitrate SBC lebih tinggi dan dukungan keluarga aptX lewat patch PulseAudio
Mengapa kualitas suara SBC terdengar rendah
- Sebagian pengguna headphone nirkabel mengalami penurunan kualitas suara dan kurangnya frekuensi tinggi pada codec SBC yang didukung semua perangkat audio Bluetooth
- Membeli perangkat dan headphone yang mendukung aptX atau LDAC adalah salah satu cara, tetapi codec tersebut memerlukan biaya lisensi sehingga dapat menaikkan harga perangkat
- Penyebab utama rendahnya kualitas SBC adalah pembatasan buatan pada stack Bluetooth dan pengaturan headphone saat ini, dan perangkat yang sudah ada pun bisa melewatinya lewat modifikasi perangkat lunak
Parameter SBC dan bitrate
- SBC menegosiasikan beberapa parameter pada tahap pengaturan koneksi
- Tipe dan jumlah kanal audio: Joint Stereo, Stereo, Dual Channel, Mono
- Jumlah band frekuensi: 4 atau 8
- Jumlah blok audio per paket: 4, 8, 12, 16
- Metode alokasi bit kuantisasi: Loudness, SNR
- bitpool minimum·maksimum yang dipakai untuk kuantisasi: biasanya 2..53
- Decoder harus mendukung semua kombinasi parameter ini, tetapi encoder bisa saja hanya mengimplementasikan sebagian
- Stack Bluetooth lama biasanya menegosiasikan kombinasi Joint Stereo, 8 bands, 16 blocks, Loudness, bitpool 2..53, dan pada saat itu audio stereo 44.1kHz dikodekan pada 328kbps
- bitpool adalah nilai yang mengubah bitrate encoding; makin tinggi nilainya, makin tinggi bitrate dan kualitasnya
- Kesesuaian antara nilai bitpool yang tepat dan bitrate hanya berlaku dalam profil tertentu
- Tipe kanal, jumlah band frekuensi, dan jumlah blok audio juga sangat memengaruhi bitrate
- Dual Channel, tidak seperti Stereo atau Joint Stereo, mengodekan tiap kanal secara terpisah dan memakai bitpool terpisah untuk tiap kanal
- Jika Dual Channel dipaksa menggantikan Joint Stereo, pada bitpool 53 yang sama bitrate menjadi sekitar 617kbps, hampir dua kali lipat
Spesifikasi A2DP dan batas stack saat ini
- A2DP specification v1.2 yang berlaku dari 2007 hingga 2015 mewajibkan decoder mendukung semua nilai bitpool yang tidak melebihi bitrate maksimum
- Profil ini membatasi bitrate maksimum pada 320kb/s untuk mono dan 512kb/s untuk mode 2 kanal
- Spesifikasi baru tidak lagi secara eksplisit menyebutkan batas bitrate
- Headphone modern dengan dukungan EDR yang dirilis setelah 2015 diasumsikan dapat mendukung hingga 730kbps
- Semua stack Bluetooth yang diuji, yaitu Linux PulseAudio, Android, Blackberry, dan macOS, sama-sama menerapkan batas buatan pada parameter bitpool maksimum
- Hampir semua headphone juga membatasi nilai bitpool maksimum pada 53
- Pada stack Bluetooth yang dimodifikasi, sebagian besar perangkat bekerja di 551kbps tanpa putus atau noise, tetapi stack Bluetooth bawaan biasanya tidak menegosiasikan bitrate ini dalam kondisi umum
Patch stack Bluetooth Android
- Semua stack Bluetooth yang kompatibel dengan A2DP wajib mendukung mode Dual Channel, tetapi pengguna biasa tidak punya cara untuk memaksakan mode ini
- Patch untuk Android 8.1 dan Android 9 menambahkan Dual Channel ke stack dan menu pengembang, serta memperlakukannya sebagai opsi codec HD Audio di pengaturan perangkat Bluetooth seperti aptX, AAC, dan LDAC
- Tautan patch
- Kotak centang ini mengalihkan mode Dual Channel, dan memakai bitrate berikut menurut jenis perangkat
- Perangkat EDR 3Mb/s: 551kbps
- Perangkat EDR 2Mb/s: 452kbps
- Patchset ini telah digabungkan ke firmware alternatif berikut
- LineageOS 15.1: sejak 31 Maret 2019
- LineageOS 16.0: sejak 13 Mei 2019
- Resurrection Remix: sejak 14 Mei 2019
- crDroid: sejak 13 Mei 2019
Mengapa memilih 551kbps dan 452kbps
- Transmisi time-division Bluetooth dirancang agar efisien mengirim paket berukuran tetap yang besar
- Jumlah slot maksimum yang bisa dikirim dalam satu transmisi adalah 5, dan meskipun ada mode transmisi 1-slot dan 3-slot, tidak ada mode 2-slot maupun 4-slot
- Jumlah data yang bisa dikirim pada transmisi 5-slot adalah sebagai berikut
- Koneksi 2Mbps: maksimum 679 bytes
- Koneksi 3Mbps: maksimum 1021 bytes
- Jumlah data maksimum pada transmisi 3-slot adalah sebagai berikut
- Koneksi 2Mbps: 367 bytes
- Koneksi 3Mbps: 552 bytes
- Jika mengirim data yang lebih besar dari 367 atau 552 bytes tetapi lebih kecil dari 679 atau 1021 bytes, tetap dibutuhkan 5-slot sehingga efisiensi transmisi menurun
- Jika audio 44.1kHz dikodekan sebagai SBC Dual Channel, bitpool 38, 16 blocks, 8 frequency bands, hasilnya adalah frame audio 164-byte dan bitrate 452kbps
- Payload audio harus dibungkus oleh protokol transmisi L2CAP dan AVDTP, dan dalam proses ini ada overhead 16 bytes yang mengurangi payload audio
- Pada EDR 2Mb/s DH5, satu transmisi audio 5-slot dapat memuat 4 frame audio
679 - 4(L2CAP) - 12(AVDTP/RTP) - 1(SBC header) - (164*4) = 6
- Paket masih menyisakan 6 bytes
- Satu paket dapat memuat maksimum 11.7ms data audio dan dikirim dalam 3.75ms
- Jika bitpool dinaikkan sedikit saja, 4 frame audio tidak lagi muat dalam satu transmisi dan harus dikirim 3 frame per kali
- Efisiensi transmisi menurun
- Jumlah audio dalam satu paket berkurang
- Peluang audio putus di lingkungan nirkabel yang buruk meningkat
- Nilai 551kbps untuk EDR 3Mb/s dipilih dengan prinsip yang sama
- Pada bitpool 47, 16 blocks per frame, 8 frequency bands, ukuran frame adalah 200 bytes
- Dalam satu transmisi, maksimum 5 frame bisa digabung, yaitu musik selama 14.6ms
- Perhitungan parameter SBC cukup rumit sehingga mudah salah jika dihitung manual, dan tersedia alat web untuk menghitungnya
Perbedaan kualitas suara aptX dan SBC
- Berlawanan dengan anggapan umum bahwa aptX selalu lebih baik daripada SBC, dalam beberapa kasus aptX bisa menghasilkan kualitas suara yang lebih rendah daripada SBC 328kbps standar
- SBC mengalokasikan bit kuantisasi ke band frekuensi secara dinamis, membaginya dari bawah ke atas
- Jika seluruh bitrate dipakai pada frekuensi rendah dan menengah, frekuensi tinggi akan dipotong atau dibuat senyap
- aptX adalah codec bitrate tetap yang selalu menguantisasi band frekuensi dengan jumlah bit yang sama
- 352kbps pada 44.1kHz
- 384kbps pada 48kHz
- aptX tidak bisa memindahkan bit ke frekuensi yang lebih dibutuhkan, dan meski tidak memotong frekuensi, ia menambahkan noise kuantisasi yang mengurangi rentang dinamis audio serta kadang menimbulkan noise
- Sebaliknya, SBC membuang area yang sunyi; dibandingkan SBC 328kbps, aptX rata-rata menghasilkan distorsi lebih kecil pada musik dengan rentang frekuensi lebar
- Pada musik dengan rentang frekuensi sempit dan rentang dinamis lebar, SBC 328kbps kadang bisa lebih baik daripada aptX
- Dalam contoh rekaman piano, sebagian besar energi berada di 0~4kHz dan berlanjut hingga 10kHz
- SBC 328kbps secara berkala memotong seluruh rentang di atas 16kHz
- aptX memasukkan lebih banyak distorsi ke spektrum frekuensi yang bisa didengar manusia
- SBC 328kbps menghasilkan distorsi lebih kecil pada rentang 0~10kHz dan memotong frekuensi sisanya
- SBC 485kbps sudah cukup untuk mempertahankan seluruh rentang frekuensi tanpa memotongnya
- Disediakan juga arsip audio asli dan file hasil encoding SBC/aptX
- Dengan SBC bitrate tinggi, dalam kebanyakan kasus kualitas suara bisa lebih baik daripada aptX, dan pada headphone yang mendukung EDR 3Mb/s, SBC 551kbps menghasilkan suara yang sangat mendekati aptX HD
Opsi bitrate yang lebih tinggi
- Patchset Android juga memiliki opsi tambahan untuk menaikkan bitrate perangkat EDR 2Mb/s lebih tinggi lagi
- Jika nilai
persist.bluetooth.sbc_hd_higher_bitrate diatur ke 1, bitrate dapat dinaikkan dari 452kbps menjadi 595kbps
- Opsi ini dapat menurunkan stabilitas transmisi di lingkungan nirkabel yang padat
# setprop persist.bluetooth.sbc_hd_higher_bitrate 1
- Patch bitrate ekstrem saat ini hanya digabungkan ke LineageOS 15.1, dan belum digabungkan ke LineageOS 16.0
Perangkat yang kompatibel dan alat perbandingan
- SBC Dual Channel didukung oleh hampir semua headphone, speaker, dan head unit mobil
- Karena standar mewajibkan semua perangkat decoding mendukung mode ini, mode tersebut bekerja di sebagian besar perangkat
- Ada sedikit perangkat yang bermasalah dalam mode ini, tetapi kasusnya sangat jarang
- Informasi perangkat yang kompatibel bisa dilihat di komunitas berikut
- Tersedia juga layanan web yang mengodekan audio secara real-time di browser ke SBC, aptX, dan aptX HD
- btcodecs.valdikss.org.ru/sbc-encoder
- Bahkan tanpa transmisi Bluetooth nyata, pengguna bisa membandingkan suara berbagai profil SBC dan codec lain di headphone atau speaker berkabel
- Parameter encoding bisa diubah langsung bahkan saat audio sedang diputar
Upaya masuk ke AOSP dan cara menggunakannya
- Pengembang stack Bluetooth Google telah dihubungi agar memasukkan patch ini ke cabang utama Android, yaitu AOSP, tetapi tidak ada jawaban yang diterima
- Patch yang diunggah ke Gerrit code review system for Android juga tidak mendapat komentar dari pihak terkait pengembangan Android
- Patchset Gerrit adalah salah satu revisi awal yang sudah lama, dan bisa diperbarui jika ada pengembang yang tertarik
- Pengguna LineageOS, Resurrection Remix, dan crDroid bisa meningkatkan kualitas audio Bluetooth dengan menyalakan kotak centang di pengaturan perangkat Bluetooth
- Pengguna Linux dapat memasang patch PulseAudio dari Pali Rohár untuk menggunakan bitrate SBC yang lebih tinggi
- Patch ini juga menambahkan dukungan codec aptX, aptX HD, dan FastStream
1 komentar
Komentar di Hacker News
Ini bagus sekali: SBC didukung luas, dan terlihat seperti perluasan alami dari standar yang sudah ada.
Secara pribadi, masalahnya menurut saya bukan SBC vs LDAC/AAC, melainkan HFP yang buruk sekali. Begitu mikrofon aktif, rasanya seperti kembali ke era 90-an, dan kalau audio Bluetooth dua arah bisa dibuat dengan benar, itu akan sangat menggembirakan.
Atau mungkin AVRCP, tetapi apa pun itu, suaranya mengerikan.
Tulisan ini bukan tentang Bluetooth secara umum, melainkan penggalian mendalam atas bug yang tersembunyi di dalam stack Bluetooth Android.
Hal yang sama sekali tidak diakui penulisnya adalah bahwa perangkat keras dasarnya sangat beragam. Android berjalan di atas banyak sekali chipset Bluetooth, jadi hanya karena patch terlihat bekerja di perangkat kerasnya sendiri, tidak ada jaminan itu juga berlaku di ponsel Android lain.
Selain itu, apa yang sedang dilakukan perangkat pada saat itu juga berpengaruh. Jika audio dikirim ke headphone sambil streaming video lewat Wi-Fi pada chipset bersama BT+Wi-Fi, perangkat harus membagi sumber daya antara penggunaan Wi-Fi dan Bluetooth. Karena itu, audio yang tersimpan lokal dan audio streaming belum tentu mendapat parameter codec yang sama.
Ada terlalu banyak faktor halus dalam topik ini yang tidak dipertimbangkan penulis, jadi berhati-hatilah dengan apa yang dibaca.
Dengan begitu, bitrate yang lebih tinggi bisa dipakai tanpa melampaui bitpool maksimum yang dipaksakan Android dan penerima Bluetooth.
Negosiasi antara source dan sink tetap terjadi, dan jika salah satu tidak mendukung SBC dual channel, koneksi akan kembali ke mode yang didukung. Semua perangkat yang saya pelihara mendukungnya, sedangkan beberapa speaker murah yang saya uji saat itu tidak mendukungnya, sehingga negosiasinya menjadi sesi joint stereo.
Di Windows, Alternative A2DP Driver menyediakan fitur ini. Driver itu memungkinkan penyesuaian parameter SBC, serta penggunaan AAC atau aptX.
Dalam pengalaman saya, ini bekerja dengan baik, dan juga membantu memakai LDAC di Sony XM4. Modelnya versi uji coba, tetapi harganya murah.
Saya pernah melihat jangkauan Bluetooth berkurang dalam mode kualitas tinggi, yang tampak seperti tanda bahwa codec, atau setidaknya sesuatu, memang berubah dan bukan sekadar plasebo.
Tidak ada hubungan apa pun dengan https://www.bluetoothgoodies.com/a2dp/.
Rentang pendengaran manusia biasanya didokumentasikan sampai 20KHz, tetapi sebagian orang muda bisa mendengar frekuensi yang sedikit lebih tinggi dari itu.
Sebagai catatan, di Linux juga bisa mengaktifkan audio SBC dengan bitrate lebih tinggi lewat metode yang disebut SBC XQ. Dengan cara serupa, audio headset yang lebih baik juga bisa dipakai lewat mSBC.
Tentu saja, itu masih sama sekali belum mendekati level SBC atau aptX.
Saya berharap pihak Google sudah menggabungkan hal-hal seperti ini. Codec audio yang lebih baik didukung oleh banyak headphone dan sejenisnya, tetapi belum universal, dan peningkatan audio dua arah khususnya masih kurang.
Saya juga ingin tahu cara memeriksa apa yang sedang dipakai headset saat ini.
Saya ingat dulu memakai PulseAudio yang dipatch agar mengekspos pengaturan yang sesuai, lalu belakangan mendengar itu “digabungkan ke arus utama”, tetapi saya tidak bisa menemukan pengaturan maupun informasi penggunaan aktualnya.
Saya berharap ada yang membuat profil audio Bluetooth yang bisa melakukan buffering lama di awal.
Misalnya, saat memutar lagu berdurasi 1 menit, seluruh lagu harus masuk ke buffer. Tentu saja kalau dijeda atau volumenya diubah, buffer harus dibuang.
Dengan buffer panjang, ponsel bisa lebih sering tidur sehingga menghemat daya, dan tetap tahan meski koneksi nirkabel buruk.
Bahkan jika hanya sekitar 1–2MB RAM, headphone harus menghabiskan baterai yang berharga untuk menjaga RAM itu tetap aktif.
Dari sedikit pengalaman saya dulu menangani aplikasi audio, dukungan aplikasinya juga sepertinya akan rumit.
Jadi ini lebih mirip fitur yang dimasukkan lewat desain oleh masing-masing produk, dan bisa dinyalakan/dimatikan pengguna dari aplikasi, daripada masalah protokol.
Saya pernah mencoba fitur ini di LineageOS dan jujur saja, ini sangat bagus. Saya bisa mengirim audio berkualitas lebih tinggi ke perangkat seperti stereo mobil yang tidak mendukung codec pihak ketiga, dan ini juga cukup membantu untuk headphone.
Pengalaman penggunanya masih perlu dipoles, tetapi fiturnya sendiri hebat.
Sebaiknya tambahkan 2019 pada judulnya. Ada ungkapan seperti “semua stack Bluetooth saat ini”, tetapi hal-hal seperti ini sudah diimplementasikan cukup lama di PulseAudio dan PipeWire.
Saya agak skeptis bahwa Dual Channel 551kbps menghasilkan kualitas yang terlihat jauh lebih baik daripada Joint Stereo 328kbps. Bisa saja itu hanya memakai lebih banyak bit untuk mengenkode informasi yang duplikatif.
Setidaknya untuk sebagian besar musik begitu, meski mungkin ada pengecualian seperti lagu yang sengaja menempatkan track rekaman berbeda di kiri dan kanan.
Pertanyaan terkait: saya penasaran apakah ada cara memperbaiki HFP Bluetooth di macOS.
Headset yang sama saya pakai di Linux dengan mSBC dan kualitasnya cukup bagus, tetapi di macOS kualitasnya benar-benar buruk dan berubah menjadi kualitas jalur telepon/mono. Saya penasaran apakah sudah ada hack untuk membuatnya bekerja dengan benar di Darwin.
Sebelum melihat tulisan ini, saya bahkan tidak tahu bahwa saya sedang memakai SBC. Lineage 18.1 tidak menampilkan kotak centang UI itu meski perangkat yang terhubung mendukung SBC. Seperti sihir -