1 puan yazan GN⁺ 2023-11-25 | 1 yorum | WhatsApp'ta paylaş
  • Standart SBC codec’inin düşük ses kalitesi yalnızca codec sınırlarından değil, Bluetooth yığını ve kulaklık ayarlarındaki muhafazakâr kısıtlamalardan kaynaklanır; mevcut cihazlar da yazılım değişiklikleriyle iyileştirilebilir
  • Genel Bluetooth yığınları 44.1kHz stereo için genelde 328kbps üzerinde anlaşır, ancak Dual Channel zorlanırsa aynı bitpool 53 ile yaklaşık 617kbps’ye çıkılabilir
  • Android 8.1 ve 9 yamaları, Bluetooth cihaz ayarlarına SBC Dual Channel seçeneğini HD Audio seçeneği gibi ekler ve EDR 3Mb/s cihazlarda 551kbps, EDR 2Mb/s cihazlarda 452kbps kullanır
  • 551kbps ve 452kbps değerleri, Bluetooth 5-slot iletim verimliliği dikkate alınarak seçilmiştir; bitpool daha da yükseltilirse çerçeve paketleme sayısı azalır ve kötü kablosuz ortamlarda kesilme olasılığı artar
  • LineageOS, Resurrection Remix ve crDroid kullanıcıları, ayarlardaki bir onay kutusuyla yüksek bitrate SBC’yi açabilir; Linux kullanıcıları ise PulseAudio yamasıyla daha yüksek SBC bitrate’i ve aptX ailesi desteği elde edebilir

SBC ses kalitesi neden düşük geliyor?

  • Bazı kablosuz kulaklık kullanıcıları, tüm Bluetooth ses cihazlarının desteklediği SBC codec’inde ses kalitesi düşüşü ve tiz eksikliği yaşar
  • aptX veya LDAC destekli cihaz ve kulaklık satın almak bir çözüm olabilir, ancak bu codec’ler lisans maliyeti gerektirdiğinden cihaz fiyatını artırabilir
  • Düşük SBC kalitesinin temel nedeni, mevcut Bluetooth yığını ve kulaklık ayarlarındaki yapay kısıtlamalardır; mevcut cihazlarda da bunlar yazılım değişiklikleriyle aşılabilir

SBC parametreleri ve bitrate

  • SBC, bağlantı kurulumu aşamasında çeşitli parametreler üzerinde anlaşır
    • Ses kanalı türü ve sayısı: Joint Stereo, Stereo, Dual Channel, Mono
    • Frekans bandı sayısı: 4 veya 8
    • Paket içindeki ses blok sayısı: 4, 8, 12, 16
    • Niceleme bit atama yöntemi: Loudness, SNR
    • Niceleme için kullanılan minimum ve maksimum bitpool: genelde 2..53
  • Decoder bu parametre kombinasyonlarının tümünü desteklemek zorundadır, ancak encoder yalnızca bir kısmını uygulayabilir
  • Mevcut Bluetooth yığınları genelde Joint Stereo, 8 bands, 16 blocks, Loudness, bitpool 2..53 kombinasyonu üzerinde anlaşır; bu durumda 44.1kHz stereo ses 328kbps ile kodlanır
  • bitpool, kodlama bitrate’ini değiştiren değerdir; değer yükseldikçe bitrate ve kalite artar
    • Bitpool değeri ile bitrate arasındaki tam ilişki yalnızca belirli bir profil içinde geçerlidir
    • Kanal türü, frekans bandı sayısı ve ses blok sayısı da bitrate üzerinde büyük etkiye sahiptir
  • Dual Channel, Stereo veya Joint Stereo’dan farklı olarak her kanalı ayrı kodlar ve her kanal için ayrı bitpool kullanır
    • Joint Stereo yerine Dual Channel zorlanırsa, aynı bitpool 53 ile bitrate yaklaşık 617kbps’ye çıkar ve neredeyse iki katına ulaşır

A2DP spesifikasyonu ve mevcut yığınların kısıtları

  • 2007’den 2015’e kadar geçerli olan A2DP specification v1.2, decoder’ın azami bitrate’i aşmayan tüm bitpool değerlerini desteklemesini şart koşuyordu
    • Bu profil, mono için 320kb/s, 2 kanallı modlar için ise azami bitrate’i 512kb/s ile sınırlar
  • Yeni spesifikasyonda bitrate sınırı açıkça belirtilmiyor
  • 2015 sonrası çıkan, EDR destekli modern kulaklıkların azami 730kbps’ye kadar destek verebildiği varsayılır
  • Test edilen Bluetooth yığınları olan Linux PulseAudio, Android, Blackberry ve macOS’un tümü, maksimum bitpool parametresine yapay sınırlama koyar
  • Neredeyse tüm kulaklıklar da maksimum bitpool değerini 53 ile sınırlar
  • Değiştirilmiş Bluetooth yığınında çoğu cihaz 551kbps’de kesilme veya parazit olmadan çalışsa da, varsayılan Bluetooth yığınları normal koşullarda bu bitrate üzerinde anlaşmaz

Android Bluetooth yığını yaması

  • Tüm A2DP uyumlu Bluetooth yığınları Dual Channel modunu desteklemek zorundadır, ancak sıradan kullanıcıların bu modu zorlamasının bir yolu yoktur
  • Android 8.1 ve Android 9 için hazırlanan yamalar, Dual Channel’ı yığına ve geliştirici menüsüne ekler; aptX, AAC ve LDAC gibi Bluetooth cihaz ayarlarındaki HD Audio codec seçeneği olarak ele alır
  • Yama bağlantıları
  • Bu onay kutusu Dual Channel modunu açıp kapatır ve cihaza göre şu bitrate’leri kullanır
    • EDR 3Mb/s cihazlar: 551kbps
    • EDR 2Mb/s cihazlar: 452kbps
  • Yama seti şu alternatif firmware’lere entegre edilmiştir
    • LineageOS 15.1: 31 Mart 2019’dan itibaren
    • LineageOS 16.0: 13 Mayıs 2019’dan itibaren
    • Resurrection Remix: 14 Mayıs 2019’dan itibaren
    • crDroid: 13 Mayıs 2019’dan itibaren

551kbps ve 452kbps neden seçildi?

  • Bluetooth zaman bölmeli iletim, büyük ve sabit boyutlu paketleri verimli şekilde göndermek üzere tasarlanmıştır
  • Tek bir iletimde gönderilebilecek azami slot sayısı 5’tir; 1-slot ve 3-slot iletim modları vardır, ancak 2-slot ve 4-slot modları yoktur
  • 5-slot iletimde gönderilebilecek veri miktarı şöyledir
    • 2Mbps bağlantı: azami 679 bytes
    • 3Mbps bağlantı: azami 1021 bytes
  • 3-slot iletimin azami veri miktarı ise şöyledir
    • 2Mbps bağlantı: 367 bytes
    • 3Mbps bağlantı: 552 bytes
  • 367 veya 552 bytes’tan büyük ama 679 veya 1021 bytes’tan küçük veriler gönderildiğinde yine 5-slot gerekir; bu da iletim verimini düşürür
  • 44.1kHz ses, SBC Dual Channel, bitpool 38, 16 blocks, 8 frequency bands ile kodlandığında 164-byte ses çerçevesi ve 452kbps bitrate elde edilir
  • Ses payload’u, L2CAP ve AVDTP iletim protokolleriyle kapsüllenmelidir; bu süreçte ses payload’undan 16 bytes’lık overhead düşer
  • EDR 2Mb/s DH5’te tek bir 5-slot ses iletimi 4 ses çerçevesi taşıyabilir
    • 679 - 4(L2CAP) - 12(AVDTP/RTP) - 1(SBC header) - (164*4) = 6
    • Pakette 6 bytes boş kalır
    • Tek paket en fazla 11.7ms ses verisi taşır ve 3.75ms’de iletilir
  • Bitpool biraz artırıldığında bile tek iletimde 4 ses çerçevesi taşınamaz ve 3’erli gönderim gerekir
    • İletim verimi düşer
    • Tek pakette taşınan ses miktarı azalır
    • Kötü kablosuz ortamda ses kesilmesi olasılığı artar
  • EDR 3Mb/s için 551kbps de aynı mantıkla seçilmiştir
    • bitpool 47, 16 blocks per frame, 8 frequency bands durumunda çerçeve boyutu 200 bytes olur
    • Tek iletimde en fazla 5 çerçeve, yani 14.6ms müzik paketlenebilir
  • SBC parametre hesaplaması karmaşıktır ve elle hesapta hata yapmak kolaydır; bu nedenle hesaplama için bir web aracı sunulur

aptX ve SBC arasındaki ses kalitesi farkı

  • aptX’in her zaman SBC’den daha iyi olduğu yönündeki yaygın kanının aksine, bazı durumlarda aptX standart SBC 328kbps’den daha düşük kalite verebilir
  • SBC, niceleme bitlerini frekans bantlarına dinamik olarak dağıtır ve bitleri alttan üste doğru paylaştırır
    • Toplam bitrate düşük ve orta frekanslara harcanırsa, yüksek frekanslar kesilebilir veya tamamen susturulabilir
  • aptX ise frekans bantlarını her zaman aynı bit sayısıyla niceleyen sabit bitrate’li bir codec’tir
    • 44.1kHz’de 352kbps
    • 48kHz’de 384kbps
  • aptX, bitleri ihtiyaç duyulan frekanslara kaydıramaz; frekansları kesmez ama niceleme gürültüsü ekleyerek sesin dinamik aralığını azaltır ve bazen parazit oluşturabilir
  • SBC ise tersine sessiz bölgeleri atar; 328kbps SBC ile kıyaslandığında aptX, geniş frekans aralıklı müzikte ortalama olarak daha az bozulma üretir
  • Dar frekans aralığı ve geniş dinamik aralığı olan müzikte ise SBC 328kbps bazen aptX’ten daha iyi olabilir
  • Piyano kaydı örneğinde enerjinin çoğu 0~4kHz aralığındadır ve 10kHz’e kadar uzanır
    • SBC 328kbps, 16kHz üstünü periyodik olarak tamamen kesmiştir
    • aptX, insanın duyabildiği frekans spektrumuna daha fazla bozulma eklemiştir
    • SBC 328kbps, 0~10kHz aralığında daha az bozulma üretmiş ve kalan frekansları kesmiştir
    • SBC 485kbps, tüm frekans aralığını kesmeden korumaya yetecek düzeydedir
  • Orijinal ses ve SBC/aptX kodlu dosya arşivi sunulmuştur
  • Yüksek bitrate’li SBC kullanıldığında çoğu durumda aptX’ten daha iyi ses elde edilebilir ve EDR 3Mb/s destekli kulaklıklarda 551kbps SBC, aptX HD’ye çok yakın bir ses verir

Daha yüksek bitrate seçenekleri

  • Android yama setinde, EDR 2Mb/s cihazların bitrate’ini daha da yükselten ek bir seçenek bulunur
  • persist.bluetooth.sbc_hd_higher_bitrate değeri 1 yapılırsa bitrate 452kbps’den 595kbps’ye çıkarılabilir
  • Bu seçenek, yoğun kablosuz ortamlarda iletim kararlılığını düşürebilir
# setprop persist.bluetooth.sbc_hd_higher_bitrate 1
  • Aşırı bitrate yaması şu anda yalnızca LineageOS 15.1’e entegre edilmiştir; LineageOS 16.0’a entegre edilmemiştir

Uyumlu cihazlar ve karşılaştırma araçları

  • SBC Dual Channel, neredeyse tüm kulaklıklar, hoparlörler ve araç içi head unit’lerde desteklenir
  • Standart, tüm decoding cihazlarında bu mod desteğini zorunlu kıldığı için çoğu cihazda çalışır
  • Bu modda sorun yaşayan az sayıda cihaz da vardır, ancak bunlar çok nadir örneklerdir
  • Uyumlu cihaz bilgileri şu topluluklarda bulunabilir
  • Tarayıcı içinde sesi gerçek zamanlı olarak SBC, aptX ve aptX HD’ye kodlayan bir web hizmeti de sunulmaktadır
    • btcodecs.valdikss.org.ru/sbc-encoder
    • Gerçek Bluetooth iletimi olmadan bile kablolu kulaklık veya hoparlörde farklı SBC profilleri ile diğer codec’lerin sesini karşılaştırabilirsiniz
    • Ses çalarken bile kodlama parametrelerini doğrudan değiştirebilirsiniz

AOSP’ye dahil etme girişimi ve kullanım yöntemi

  • Google’ın Bluetooth yığını geliştiricileriyle, yamanın Android ana dalı olan AOSP’ye dahil edilmesi için iletişime geçildi ancak yanıt alınamadı
  • Gerrit code review system for Android üzerinde yayımlanan yama da Android geliştirme tarafındaki kişilerden yorum almadı
  • Gerrit yama seti, eski ilk revizyonlardan biridir; geliştiriciler ilgi gösterirse güncellenebilir
  • LineageOS, Resurrection Remix ve crDroid kullanıcıları, Bluetooth cihaz ayarındaki onay kutusunu açarak Bluetooth ses kalitesini artırabilir
  • Linux kullanıcıları, Pali Rohár’ın PulseAudio yamasını kurarak daha yüksek SBC bitrate’i kullanabilir
    • Bu yama ayrıca aptX, aptX HD ve FastStream codec desteği de ekler

1 yorum

 
GN⁺ 2023-11-25
Hacker News yorumları
  • Bu harika: SBC yaygın biçimde destekleniyor ve mevcut standardın doğal bir uzantısı gibi görünüyor.
    Bana göre sorun SBC mi LDAC/AAC mi olduğundan çok, HFP’nin berbat olması. Mikrofon açıldığı anda 90’lara dönmüş gibi oluyor; çift yönlü Bluetooth sesi düzgün hâle getirilebilirse gerçekten sevindirici olur.

    • Sonuçta bunun nedeni düşük gecikme ihtiyacı olabilir diye düşünüyorum. “Medya” müzik/video tarafında ses kalitesi iyi ama gecikme yüksek; videoda görüntüyü aynı miktarda geciktirerek bunu telafi edebiliyorsunuz, fakat telefon görüşmesi için bu gecikme çok fazla.
    • HFP’nin hâlâ neden endüstri standardı olduğunu anlamıyorum. MacBook / iPhone / AirPods gibi aynı ekosistem içindeki cihazlar bile ses kalitesine bakılırsa HFP kullanıyor gibi.
      Ya da AVRCP olabilir, ama her iki durumda da ses korkunç.
    • Bu özellik LE Audio / Auracast ile yavaş yavaş pazara giriyor. Ancak iyi işletim sistemi desteğinin oturması biraz zaman alacak gibi.
  • Bu yazı genel olarak Bluetooth hakkında değil, Android Bluetooth yığını içinde gömülü bir hatayı derinlemesine inceleyen bir yazı.
    Yazarın hiç kabul etmediği nokta, altta yatan donanımın çok çeşitli olması. Android sayısız Bluetooth yonga seti üzerinde çalışıyor; dolayısıyla bir yamanın kendi donanımında çalışıyor görünmesi, diğer Android telefonlarda da çalışacağı anlamına gelmez.
    Ayrıca cihazın o anda ne yaptığı da etki eder. BT+Wi‑Fi paylaşımlı bir yonga setinde Wi‑Fi üzerinden video akışı yaparken sesi kulaklığa gönderiyorsanız, cihaz kaynakları Wi‑Fi kullanımı ile Bluetooth arasında paylaştırmak zorunda kalır. Bu yüzden yerel depolamadaki ses ile akış sesinin mutlaka aynı kodek parametrelerini alması beklenemez.
    Bu konuda yazarın hesaba katmadığı çok fazla ince ayrıntı var; bu yüzden okuduklarınıza dikkatli yaklaşmak gerekir.

    • Eskiden özel ROM geliştirip valdikSS düzeltmelerini inceleyip entegre etmiş biri olarak bakınca, bu yama setinin yaptığı şey bir hata düzeltmesi değil; kaynak ve alıcı bağlantısında dual channel SBC pazarlığının mümkün olmasını sağlamak.
      Böylece Android’in ve Bluetooth alıcısının dayattığı maksimum bitpool’u aşmadan daha yüksek bitrate kullanılabiliyor.
      Kaynak ile alıcı arasında pazarlık yine gerçekleşiyor; ikisinden biri dual channel SBC desteklemiyorsa desteklenen bir yönteme geri dönülüyor. Benim bakımını yaptığım cihazların hepsi destekliyordu; o dönem test ettiğim bazı ucuz hoparlörler desteklemiyordu ve joint stereo oturumu olarak pazarlık ediliyordu.
    • Bluetooth geneliyle ilgili yazı burada: https://habr.com/en/articles/456182/
  • Windows’ta Alternative A2DP Driver bu özelliği sağlıyor. SBC parametrelerini ayarlamanıza, AAC veya aptX kullanmanıza da imkân veriyor.
    Benim deneyimimde iyi çalıştı; Sony XM4’te LDAC kullanmama da yardımcı oluyor. Deneme sürümü modeliyle geliyor ama fiyatı düşük.
    Yüksek kalite modunda Bluetooth menzilinin azaldığını gördüm; bu da gerçekten kodeğin ya da en azından bir şeylerin değiştiğine, plasebo olmadığına dair bir işaret gibi görünüyor.
    https://www.bluetoothgoodies.com/a2dp/ ile hiçbir bağlantım yok.

    • 48KHz’den 44.1KHz’e downsample ederken sözü edilen “Quality Loss”un ne olduğunu bilmiyorum. Yeniden örnekleme düzgün yapılırsa yalnızca çok yüksek frekanslar, yani 22050Hz üzeri kaybedilir.
      İnsan işitme aralığı genelde 20KHz’e kadar olarak belgelenir, ancak bazı genç insanlar bunun biraz üzerindeki frekansları da duyabilir.
  • Bu arada Linux’ta da SBC XQ denilen yöntemle daha yüksek bitrate’li SBC ses etkinleştirilebiliyor. Benzer şekilde mSBC ile daha iyi kulaklık mikrofon sesi de kullanılabiliyor.
    Elbette hâlâ SBC ya da aptX gibi seviyelere hiç yaklaşmıyor.
    Google tarafı keşke bunları çoktan birleştirmiş olsaydı. Daha iyi ses kodeklerini pek çok kulaklık vb. destekliyor ama evrensel değiller; çift yönlü ses iyileştirmeleri ise özellikle hâlâ yetersiz.

    • Bu yazı 4 yıl öncesine ait; dolayısıyla sonradan Android’e eklenen LE Audio desteği gibi değişiklikler yansıtılmadan önce yazılmış.
    • Linux’ta bunu nasıl açacağımı merak ediyorum.
      Mevcut kulaklığın ne kullandığını kontrol etmenin yolunu da bilmek isterim.
      Eskiden uygun ayarları gösteren yamalı bir PulseAudio kullandığımı hatırlıyorum; daha sonra “ana akıma birleştirildiğini” duydum ama asıl ayarı ya da fiilî kullanım bilgisini bulamadım.
    • Linux’ta AirPods’u zar zor destekletmeye çalışmak bile başlı başına çok yorucu bir mücadele.
  • Birinin önceden uzun süreli tamponlama yapabilen bir Bluetooth ses profili geliştirmesini isterdim.
    Örneğin 1 dakikalık bir şarkı çalındığında şarkının tamamı tampon belleğe alınmalı. Tabii duraklatırsanız ya da ses seviyesini değiştirirseniz tamponun atılması gerekir.
    Uzun bir tampon olursa telefon daha sık uykuya geçebilir ve güç tasarrufu sağlar; kablosuz bağlantı kötüleşse bile dayanabilir.

    • Böyle bir şey pek olası görünmüyor. Çoğu kulaklıkta bu tür bir tampon için bellek bulunacağından çok şüpheliyim.
      RAM yalnızca 1–2MB civarında olsa bile kulaklık, o RAM’i aktif tutmak için değerli bataryasını harcamak zorunda kalır.
      Eskiden ses uygulamalarıyla biraz uğraşmış biri olarak, uygulama desteğinin de zor olacağını düşünüyorum.
    • Telefon geldiğinde Led Zeppelin’in sonraki 1 dakikasını önce dinlemek yerine, tamponlanmış içeriği atlayıp gelen aramayı hemen cevaplamak isteyeceğiniz ana kadar güzel gelir.
    • Yeterli gömülü bellek varsa mümkün olabilir, ancak ses ile videoyu senkronize etmeye çalışırken sorun çıkar.
      Bu yüzden bu, protokol meselesinden çok tek tek ürünlerin tasarımına koyacağı ve uygulamada kullanıcının açıp kapatabileceği bir özellik olmaya daha yakın.
    • Ne yazık ki bu, çoğu kullanıcının sesten istediği şeyle neredeyse tam ters yönde.
  • LineageOS’ta bu özelliği denemiştim ve açıkçası gerçekten iyiydi. Üçüncü taraf kodekleri desteklemeyen araç stereosu gibi ekipmanlara daha yüksek kaliteli ses gönderebiliyordum; kulaklıklarda da epey işe yarıyordu.
    Kullanıcı deneyiminin cilalanması gerekiyor ama özelliğin kendisi harika.

    • Ne yazık ki en yeni Lineage sürümlerinde kayboldu. Şu anda fiilen unutulmuş durumda.
  • Başlığa 2019 eklemek iyi olur. “Güncel tüm Bluetooth yığınları” gibi ifadeler geçiyor ama bunlar zaten bir süredir PulseAudio ve PipeWire’da uygulanmış durumdaydı.

  • 551kbps Dual Channel’ın 328kbps Joint Stereo’dan fark edilir derecede daha iyi kalite sunduğu konusunda biraz şüpheliyim. Sadece yinelenen bilgiyi kodlamak için daha fazla bit kullanıyor olabilir.
    En azından çoğu müzikte durum böyle; sol ve sağ kanala kasıtlı olarak farklı kayıt parçaları yerleştirilmiş şarkılar gibi istisnalar olabilir.

  • İlgili bir soru olarak, macOS’ta Bluetooth HFP’yi iyileştirmenin bir yolu var mı merak ediyorum.
    Aynı kulaklığı Linux’ta mSBC ile oldukça iyi kalitede kullanıyorum; macOS’ta ise tamamen berbat ve telefon hattı/mono kalitesine düşüyor. Darwin’de düzgün çalışmasını sağlayan bir hack zaten var mı diye merak ediyorum.

  • Bu yazıyı görene kadar SBC kullandığımı bile bilmiyordum. Lineage 18.1, SBC destekli cihaz bağlansa bile o UI onay kutusunu göstermiyor. Sihir gibi -