Pozbądź się opóźnienia 0,5s podczas odtwarzania dźwięku przez Bluetooth z A2DP

49

Jak opisano w tytule, występuję pół sekundy opóźnienia podczas odtwarzania dźwięku przez Bluetooth z A2DP.
To uniemożliwia oglądanie filmów, ponieważ dźwięk nie jest zsynchronizowany z wideo.

Nie jestem pewien, czy opóźnienie jest spowodowane standardem Bluetooth, protokołem A2PD, implementacją A2DP w Ubuntu 12.04, czy odbiornikiem Bluetooth Belkin Z73.

W każdym razie, czy to normalne opóźnienie? Czy istnieje sposób odtwarzania dźwięku przez Bluetooth bez zauważalnego opóźnienia?

brillout
źródło
9
Nie jest to prawdziwe rozwiązanie problemu, ale obejście: Jeśli chodzi tylko o odtwarzanie filmów, możesz dostosować przesunięcie audio / wideo, co również opóźni wideo. Używając mplayer, robisz to naciskając klawisze +i -. W VLC nie wiem, jak ustawić opóźnienie, ale byłbym zaskoczony, jeśli VLC nie ma takiej opcji.
leemes
Myślałem o tym, ale brakuje mi rozwiązania dla YouTube. Gdy wideo jest odtwarzane w HTML5, rozwiązaniem może być zainstalowanie rozszerzenia przeglądarki, które ustawia przesunięcie wideo. Ale w przypadku, gdy wideo jest odtwarzane z lampą błyskową, nie jestem pewien, jak to osiągnąć.
brillout
Nawiasem mówiąc, opcja VLC jest w Tools->Track Synchronisationlub gra z tą --audio-desyncopcją. Obawiam się, że nie jestem pewien, jakie są jednostki i jaki kierunek jest pozytywny, a pomoc nie nadchodzi w tej sprawie, ale tam właśnie chcesz spojrzeć.
Darael
Czy znalazłeś trwałe rozwiązanie tego problemu? Obecnie używam rozwiązania do przełączania między A2DP / HSP / A2DP, ale nie jest praktyczne pozostawanie przy każdym problemie z synchronizacją.
Fred Wuerges,

Odpowiedzi:

37

Nie, to nie jest normalne, ale czasami miałem podobny problem z moimi głośnikami Altec Lansing iMT525 Bluetooth. Coś podobnego w koncepcji do odpowiedzi Sri prawie zawsze działa dla mnie i muszę to zrobić tylko raz dla każdego połączenia.

Automatyczne przełączanie profili Bluetooth w celu ponownego zainicjowania PulseAudio

Jeśli szukasz winowajcy, przyjrzałbym się systemowi dźwiękowemu Ubuntu, najpierw PulseAudio, a następnie odbiornikowi bluetooth. Spróbuj tego:

  • Najpierw usuń i ponownie sparuj urządzenie Bluetooth.

  • Następnie skopiuj i wklej poniżej do .shpliku w katalogu domowym, powiedz /home/brillout/pabluezswitch.sh:

    #! / bin / bash
    BLUEZCARD = `krótkie karty listy pactl | egrep -o bluez. * [[: space:]] ` pactl set-card-profile $ BLUEZCARD a2dp pactl set-card-profile $ BLUEZCARD hsp pactl set-card-profile $ BLUEZCARD a2dp
  • Ustaw plik jako wykonywalny, otwierając terminal i pisząc chmod +x ~/pabluezswitch.sh

  • Przejdź do Ustawienia ... Klawiatura ... Skróty i utwórz własny skrót; nadaj mu dowolną nazwę, używając polecenia as /home/brillout/pabluezswitch.sh(zastąp odpowiednią nazwę użytkownika na ścieżce!). Kliknij Zastosuj , a następnie kliknij po prawej stronie, gdzie jest napisane Wyłączony, aby skonfigurować skrót klawiaturowy do wykonania skryptu.

Zmusza to system PulseAudio do ponownej synchronizacji dźwięku przesyłanego do zestawu słuchawkowego / głośników poprzez przełączanie profilów ad2p -> hsp -> a2dp, co ma nadzieję na pozbycie się wszelkich opóźnień.


Za każdym razem, gdy połączysz się i zauważysz opóźnienie, naciśnij wybrany wyżej skrót klawiaturowy, aby spróbować naprawić opóźnienie - mam nadzieję, że to zadziała!

ish
źródło
Używam tego od kilku dni i działa świetnie. - 14.04
dpb
7
Zauważ, że pactl ma straszne komunikaty o błędach i że wiele urządzeń audio nie ma ich ad2pi hsp. Mój Bose ma tylko ad2p_sink, a nie pozostałych dwóch.
odinho
1
Myślę, że potrzebujesz cytatów wokół tego wzorca egrep
naught101
1
Nie sądzę, że istnieje sposób na monitorowanie opóźnienia i automatyczne uruchamianie tego skryptu, gdy przekroczy on pewien próg powyżej wartości odniesienia? pacmd info | grep "current latency"i pacmd statwydają się podawać te same liczby opóźnień / rozmiar bufora, bez względu na to, jak duże rzeczywiste opóźnienie rośnie (np. przy wyjmowaniu zestawu słuchawkowego z zasięgu i przywracaniu go z powrotem), więc może za opóźnienie odpowiada inna część stosu?
Ponkadoodle,
2
@ odinho-Velmont przełącza między ad2p_sinki offdziała dla mnie. Niedawno dodałem to do mojego skryptu Pulse Audio / Volume Control, który może być komuś pomocny
Sam Mason
21
  • Zainstaluj pavucontrol: sudo apt install pavucontrol
  • Uruchom pavucontrolz menu
  • Idź do Urządzenia wyjściowe
  • Przejdź do urządzenia Bluetooth
  • Przejdź do Advanced
  • Tam możesz ustawić przesunięcie opóźnienia na wartość w milisekundach (plus lub minus). Aby upewnić się o wartości, musisz zacząć od dowolnej wartości, np. 250,00 mi.
  • Zagraj w dowolny „test synchronizacji dźwięku” z YouTube i ustaw prędkość odtwarzania na 0,25 (spowolnij), a następnie możesz zacząć zauważać, czy wartość jest poprawna, czy też należy ją zwiększyć lub zmniejszyć.
Roelf Renkema
źródło
2
Usunięto niepotrzebne sass z odpowiedzi - nie trzeba być niegrzecznym. Wygląda na to, że powinno to działać, ale wydaje mi się, że w rzeczywistości nic dla mnie nie robi ...
naught101
Dla mnie to działało w przypadku odtwarzania youtube z głośnikami bluetooth. Dzięki. Kiedy po raz pierwszy otworzyłem pavucontrol, zaawansowana opcja była ukryta. Musiałem pionowo rozwinąć okno.
user75505
11

Od czasu do czasu mam podobny problem, niezależnie od użytego odtwarzacza. Mój to stereofoniczne słuchawki Bluetooth Nokia BH-503 z laptopem MSI CR400 i Ubuntu 11.10. Zdarzyło mi się obejście, które możesz wypróbować.

  • Rozpocznij odtwarzanie wideo.
  • Wybierz Ustawienia dźwięku> Sprzęt.
  • Wybierz urządzenie Bluetooth.
  • Następnie w menu rozwijanym Ustawienia wybranego urządzenia przełącz się na profil Telefoniczny dupleks (HSP / HFP), a następnie przełącz z powrotem na odtwarzanie wysokiej jakości (A2DP).
Sri
źródło
7

Najlepsza odpowiedź tutaj działa, ale nie dla każdego urządzenia audio Bluetooth. Niektóre urządzenia mają inne nazwy profili niż te, które ma ten plakat w głośnikach bluetooth. Na przykład w poniższym kodzie, który pierwotnie został opublikowany przez tę osobę, najwyraźniej ma ona profile o nazwach a2dpi hsp. Żadne z nich nie jest dostępne na przykład z moimi tonami LG, ale są one dostępne z innymi urządzeniami, takimi jak zestaw słuchawkowy Sony.

#!/bin/bash

BLUEZCARD=`pactl list cards short | egrep -o bluez.*[[:space:]]`
pactl set-card-profile $BLUEZCARD a2dp
pactl set-card-profile $BLUEZCARD hsp
pactl set-card-profile $BLUEZCARD a2dp

Wygląda na to, że ten kod będzie działał na większości urządzeń Bluetooth, ale aby działał poprawnie na tych urządzeniach, które nie mają profilu A2DP lub HSP, wpisz:

pactl list | grep -Pzo '.*bluez_card(.*\n)*'

Spowoduje to zwrócenie wszystkiego po znalezieniu urządzenia Bluetooth. Na przykład dzięki zestawowi słuchawkowemu LG Tone Ultra otrzymuję:

Name: bluez_card.B8_AD_3E_**_**_**
    Driver: module-bluez5-device.c
    Owner Module: 36
    Properties:
        device.description = "LG HBS810"
        device.string = "B8:AD:3E:**:**:**"
        device.api = "bluez"
        device.class = "sound"
        device.bus = "bluetooth"
        device.form_factor = "headset"
        bluez.path = "/org/bluez/hci0/dev_B8_AD_3E_**_**_**"
        bluez.class = "0x240404"
        bluez.alias = "LG HBS810"
        device.icon_name = "audio-headset-bluetooth"
        device.intended_roles = "phone"
    Profiles:
        a2dp_sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 10, available: yes)
        headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 20, available: yes)
        off: Off (sinks: 0, sources: 0, priority: 0, available: yes)
    Active Profile: a2dp_sink
    Ports:
        headset-output: Headset (priority: 0, latency offset: 0 usec)
            Part of profile(s): a2dp_sink, headset_head_unit
        headset-input: Headset (priority: 0, latency offset: 0 usec)
            Part of profile(s): headset_head_unit

Interesuje nas profilessekcja. W tej sekcji, widzimy trzy profile, które są a2dp_sink, headset_head_uniti off. Dwa profile, których potrzebujemy, powinny w nich mieć (zlew A2DP) i (HSP / HFP). W tym przypadku dotyczą one a2dp_sinkprofilu a2dp i headsethead_unitprofilu hsp. Zauważ, że różni się to od oryginalnego plakatu a2dpi hsp.

Teraz, z powyższym kodem, zmodyfikujemy go i umieścimy w pliku. Zadzwoniłem do pliku bluezswitch.sh.

Przejdź do katalogu, w którym chcesz umieścić plik. Może być wszędzie.

touch bluezswitch.sh

Następnie

nano bluezswitch.sh

Skopiuj i wklej kod na samym początku tego komentarza, zamień a2dpi hspna wartości, które otrzymałeś po uruchomieniu powyższego polecenia, i wklej go do tego pliku. Tak na przykład wyglądał mój plik dla moich dźwięków LG.

#!/bin/bash

BLUEZCARD=`pactl list cards short | egrep -o bluez.*[[:space:]]`
pactl set-card-profile $BLUEZCARD a2dp_sink
pactl set-card-profile $BLUEZCARD headset_head_unit
pactl set-card-profile $BLUEZCARD a2dp_sink

Teraz, ctrl-xpo czym yzapisać plik i opuścić nano, a następnie zrobić plik wykonywalny:

chmod +x bluezswitch.sh

Następnie wykonaj czynności, ustawiając skrót klawiaturowy, jak wyjaśniono.

Przejdź do Ustawienia ... Klawiatura ... Skróty i utwórz własny skrót; nazwij go, jak chcesz, za pomocą polecenia jako /home/brillout/bluezswitch.sh (podstaw odpowiednią nazwę użytkownika na ścieżce!). Kliknij Zastosuj, a następnie kliknij po prawej stronie, gdzie jest napisane Wyłączony, aby skonfigurować skrót klawiaturowy do wykonania skryptu.

To powinno być wszystko. To powinno działać dla wszystkich tych, dla których wcześniej nie działało.

Timm Simpkins
źródło
1
Dla mnie, wyłączenie a2dp_sink, off, a2dp_sinkw sekwencji działa bardzo dobrze dla mnie. Ustawienie headset_head_unitbłędu We / Wy.
Mohd Shahril,
5

Adaptacyjna różnicowa modulacja impulsowa polega na zastosowaniu algorytmu kompresji typu wybiegającego w przyszłość, w którym informacji nie można przesłać, zanim enkoder nie będzie w stanie zbadać kilku bajtów nadchodzących informacji. Dlatego dane muszą gromadzić się w koderze i istnieje nieodłączne przesunięcie czasowe między strumieniami wchodzącymi i wychodzącymi z enkodera. Dawno temu przeprowadziłem badanie opóźnień sieci danych, aby określić wykonalność telefonii VoIP (obecnie VoIP). Myślę, że doszedłem do wniosku, że kompresja / kodowanie w stylu ADPCM wprowadziłoby zbyt duże opóźnienie. Myślę, że aby rozwiązać ten problem z opóźnieniem Bluetooth, może być potrzebny koder dźwięku bez kompresji, który powinien mieć mniejsze opóźnienia.

Kirk Shrewsbury
źródło
6
Z pewnością problem kompresji stanowiłby kilkadziesiąt milisekund, a nie pół sekundy?
naught101
4

Próbowałem wielu podejść do tego problemu, ale nic nie mogło go naprawić. Potem natknąłem się na set-port-latency-offset

Jeśli używasz pulseaudio:

pactl list cards short | egrep -o bluez.*[[:space:]]

To da ci interfejs bluetooth. Teraz ustaw odpowiednio opóźnienie:

pactl set-port-latency-offset <INTERFACE> speaker-output 100000

Używam 100000 mikrosekund, co działa dobrze dla mnie.

Arindam Mani Das
źródło
1
Dla każdego, kto natknie się na ten stary post, szukając odpowiedzi, odpowiedź Arindama Mani Dasa działa idealnie. Jeśli pojawi się błąd „brak takiego obiektu”, uruchom „pactl list cards” i sprawdź, które porty są dostępne dla twojego urządzenia. Musiałem zmienić „wyjście głośnikowe” na „wyjście słuchawkowe” w drugim poleceniu, ponieważ moje urządzenie nie ma portu wyjściowego głośnika.
Billy Farrington
1

Oto, co dla mnie rozwiązało: $ sudo apt-get install phonon-backend-vlcupewnij się, że jest to preferowany backend, w KDE przejdź do [Ustawienia systemu] [Multimedia] [Ustawienia audio i wideo] [Backend] i użyj przycisku [Preferuj]

dargaud
źródło
1
@dargaud Polecam rozwinięcie tego, aby wyjaśnić, jak ustawić preferowany backend.
Eliah Kagan
0

osoby, które mają ten problem Proszę przejrzeć tę stronę: http://projectzeorymer.wordpress.com/2011/09/01/ubuntu-how-to-connect-nokia-bh-503-bluetooth-headset-to-your-pc /, aby zobaczyć zdjęcie tego, co musisz pobrać.

Pobierz menedżera Bluetooth i użyj go do zmiany ustawień zestawu słuchawkowego. Ustaw ustawienia dźwięku na Odtwarzanie wysokiej jakości (A2DP), a następnie przejdź do ustawień dźwięku.

Alex Force
źródło
1
Włącz zarządzanie Bluetooth i przejdź do Profilu audio, a następnie wybierz Odtwarzanie z wysoką Fedelity .. to wszystko
Alex Force
0

W odtwarzaczu VLC Media Player przejdź do Narzędzia Synchronizacja ścieżki Karta Synchronizacja W obszarze Synchronizacja ścieżki audio / wideo użyj wartości ujemnej, takiej jak około -0,67, a opóźnienie zostanie w pełni skompensowane. Musisz to zrobić ręcznie za każdym razem, gdy otwierasz nowy plik. Chris

Lex
źródło
0

Podobnie jak w przypadku odpowiedzi Timma, nie miałem również profili akceptowanej odpowiedzi. Ustawienie HSP dało kod błędu.

Skończyło się na użyciu następującego, prawie identycznego skryptu.

#!/bin/bash
BLUEZCARD=`pactl list cards short | egrep -o bluez.*[[:space:]]`
pactl set-card-profile $BLUEZCARD a2dp_sink
pactl set-card-profile $BLUEZCARD off
pactl set-card-profile $BLUEZCARD a2dp_sink
raahlb
źródło
0

Wydaje się, że ta kwestia jest nadal aktualna po tylu latach.

Na podstawie odpowiedzi Arindama Mani Dasa i komentarza Billy'ego Farringtona stworzyłem następujący skrypt powłoki:

#!/bin/bash
export BLUEZCARD=`pactl list cards short | egrep -o bluez.*[[:space:]]`
pactl set-card-profile $BLUEZCARD a2dp_sink
pactl set-port-latency-offset $BLUEZCARD headphone-output 100000

Używam 100000 mikrosekund, jak zalecił Arindam, i działa również dobrze dla mnie.

Yakir Magriso
źródło