Pulseaudio neden bir BT cihazına ses kalitesi bağlantısını işler?


11

Linux ve Bluetooth komut dosyalarında da yeniyim. Şimdiye kadar keşfettiğim şu:

  1. Bluez, varsayılan BT yığınıdır.
  2. BluezTools, Bluez ile daha kolay etkileşim kurmak için kullanabileceğiniz bir dizi yardımcı programdır
  3. DBus, Bluez'in doğrudan donanımla etkileşime girerken bağlandığı arabirimdir.
  4. PulseAudio, sistemde ses üretmekten sorumlu alt sistemdir.

Bu mantıklı. Diyelim ki bir dizi BlueTooth kulaklığım var, beklediğim şey (eşleştirme ve güvenme sonrasında), BT kulaklıklardaki belirli bir profile doğrudan bağlanabilen bir komut verebilmektir.

Aklımdaki teknik yol şöyle olacaktır:

  1. Kulaklıkları açın.
  2. Bt-audio -c gibi bir BluezTools komutu verin
  3. Cihazın, takip ettiğim servise bağlanmasını bekleyin
  4. PulseAudio şimdi yeni bir çıkış cihazı almalı
  5. Sesi yeni çıkış sesine (BT kulaklıklar) değiştirmek için başka bir komut verin.
  6. Kusursuz bir dinleme deneyiminin keyfini çıkarın.

Tüm bunlar mantıklı görünüyor, ancak asıl uygulama böyle değil ve NEDEN'i arıyorum, bu yüzden sorunu daha iyi anlayabilir ve düzeltebilirim.

Aslında olan budur:

  1. Kulaklıkları açın.
  2. Bt-audio -c gibi bir BluezTools komutu verin
  3. Cihazın, takip ettiğim servise bağlanmasını bekleyin
  4. PulseAudio şimdi yeni bir çıkış cihazı almalı
  5. Ses profilini telefon kalitesinden yüksek aslına uygun hale getirmek için PulseAudio komutu verin.

Biraz daha genişleyeyim. Bluetooth kulaklık 2 kalite modu sunar (telefon ve yüksek sadakat). Sadece 1 müzik dinlemek için gerçekten uygundur.

BT kulaklıkların her kalite modunu hizmet olarak göstermesini beklerdim, doğru mu? Bu varsayım yanlış olabilir, ama böyle bir şey beklerdim

bt-audio -c highFidelityProfile

veya

bt-audio -changeProfile highFidelityProfile

Bunun yerine, Bluez'in cihaza RAW bağlantısını işlediği ve oradan aşağıdakileri vermeniz gerekir: pacmd set-card-profile $ INDEX a2dp

Bu temelde yanlış görünüyor. Ses alt sistemindeki kalite kontrolü neden nabız veya alsa veya başka bir ses alt sistemi için farklı bir uygulama gerektiriyor?

Neyi kaçırıyorum? Bluez / BluezTools vb. Kullanarak belirli bir profile doğrudan bağlanmak neden mümkün değildir?

Yanıtlar:


3

Bluetooth bağlantısı, basit kablolu kulaklıklara veya hoparlörlere kıyasla önemli bir gecikmeye sahiptir. Dahası, bağlantı gecikmesi, bluetooth alıcısının özelliklerine ve hatta kullanıcı hareket ettikçe radyo sinyal gücüne bağlı olarak değişebilir.

Bir uygulama ve PulseAudio arasındaki arayüz, "işte bazı PCM ses verileri; bunu oynatın" kadar basit olabilir. Ancak daha karmaşık da olabilir; "İşte bazı PCM ses verileri; bunu oynatın ve her 50 ms'de ne kadar uzak olduğunuzu söyleyin, böylece video akışı ile dudak senkronizasyonu düşüyor gibi görünüyorsa ileri atlamanızı söyleyebilirim Oh, veri de donanımınızın doğrudan desteklemeyeceği bir örnekleme hızına sahip olduğundan, siz de yeniden örneklemeniz gerekiyor. " İkinci durumda, PulseAudio'nun, ses verilerinin herhangi bir zamanda gerçekte ne kadar çalındığını doğru bir şekilde belirlemek için uygulamaya ses cihazından bazı geri bildirimler verebilmesi gerekir.

Sonuç olarak, PulseAudio'nun Bluetooth ses işlemede oldukça derin bir şekilde yer alması mantıklıdır: ne kadar çok müdahale katmanı varsa, doğru geri beslemeyi sürdürmeden verilerin arabelleğe alınması için daha fazla olasılık, dudak senkroninin kaybolmasına neden olur.

Aslında, PulseAudio var olmadan önce, Bluetooth sesi için bir ALSA arka ucu vardı, ancak kullanımdan kaldırıldı. Sorun, ALSA'nın o zamanki arayüzlerinin çoğunlukla geleneksel ses kartları için tasarlanmış olması ve Bluetooth'un potansiyel olarak değişken bir ses gecikmesi ile uğraşmanın zor olmasıydı.

PulseAudio'nun arayüzleri, çeşitli ses cihazlarını işlemek ve hatta akış oynatılırken aralarında ses akışlarını değiştirmek için tasarlandı, bu yüzden bana göre oldukça gelişmiş bir ses gecikmesi konsepti var.

Evet, bir PulseAudio modülü yerine BlueZ içinde uygulanabilirdi; ancak BlueZ, uygulamalar için bir ses arabirimi sunmak zorunda kalacaktı. PulseAudio, bir sistemdeki sesi "tüm" olarak işlemek istediğinden (şu anda çalmakta olduğunuz sesi hoparlörlerden Bluetooth'a aktarabilmek veya tam tersi durumda), PulseAudio ile arayüz kurması gerekir her nasılsa.


2

Sonunda bir çözüm bulduğumu düşünüyorum (iki Linux Mint sisteminde test edildi), ancak neden bu adımları izlemem gerektiğine dair hiçbir fikrim yok:

İlk Adımlar:

  1. Blueman yükleyin: sudo apt-get blueman yükleyin
  2. Bluetooth dosyasını düzenle: sudo nano /etc/bluetooth/main.conf ve bu satırı sonuna ekleyin: Disable = Headset

Her çalışma için:

  1. Bluetooth hizmetini yeniden başlat: sudo servisi bluetooth yeniden başlat
  2. Açık sistem tepsisinde blueman gelen cihazlar ya da tip blueman-yöneticisi terminali
  3. Bluetooth ses cihazınızı arayın
  4. Cihazınızı sağ tıklayın ve kulaklık olarak bağlanın
  5. Sistem ayarlarından sese git
  6. Bir kez tıklayarak cihazınızı seçin
  7. Şimdi tekrar blueman-manager'a gidin
  8. Bluetooth cihazınızı sağ tıklayın ve Ses profilini High Fidelity Playback (A2DP Sink) olarak ayarlayın

Adımlardan herhangi birini kaçırırsanız 1. adıma gidin ve tekrar deneyin. Bunun işe yarayıp yaramadığını bana bildirin.

Düzenleme : Linux Mint 19'da, varsayılan bluetooth yöneticisi High Fidelity Playback ile mükemmel şekilde çalışır, hiçbir yapılandırma gerekmez!


0

Yapılandırmanıza göre değişiklik gösterse de, burada iyi test edilmiş bazı komutlar verilmiştir.

Cihazı güvenilir olarak ayarlamanız gerekir. GUI üzerinden yapılabilir.

sdptool browse , hedef cihazdaki mevcut protokoller ve kanallar hakkında birçok ayrıntı verecektir.

Eşzamanlı ses çıkışlarını kullanırken bir bluetooth a2p ses havuzu ayarlamak daha kolaydır, ayarlamak için araç papreflerine bakın .

sudo apt install bluetooth 
sudo apt install bluez bluez-tools
sudo apt install rfkill rfcomm

Cihazı başlat, yine de hci0 olmalı:

sudo hciconfig hci0 up

Uzak aygıtları listele:

sudo rfkill list

Bluetooth ağlarını listele:

hcitool scan

Kullanılabilir protokollere göz atın:

sdptool browse 43:23:00:02:23:A7

Bir cihaz bağlayın:

sudo rfcomm connect hci0 43:23:00:02:23:A7

Bir dosya gönder:

sudo bt-obex -p 43:23:00:02:23:A7 ~/images/tof.png

Bir dosya almak:

sudo bt-obex -s /

Bir kanaldaki verileri (burada kanal 19) tarayın / bekleyin ve giriş klasörüne döküm adı verilen bir dosyaya veri yazın:

sudo apt install bluez-hcidump

hcidump -i hci0 -O 19 -w ~/dump

Alternatif: bazen eşleştirme için yararlıdır:

sudo apt install bluetoothctl

bluetoothctl
power on
connect 43:23:00:02:23:A7
trust 43:23:00:02:23:A7
info 43:23:00:02:23:A7

[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# discoverable on
[bluetooth]# pairable on
[bluetooth]# scan on
[bluetooth]# pair 43:23:00:02:23:A7
[agent]PIN code: ####
[bluetooth]# trust 43:23:00:02:23:A7
[bluetooth]# connect 43:23:00:02:23:A7
[bluetooth]# info 43:23:00:02:23:A7
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.