Beseitigen Sie die Latenz von 0,5 s bei der Wiedergabe von Audio über Bluetooth mit A2DP

49

Wie im Titel beschrieben, tritt bei der Wiedergabe von Audio über Bluetooth mit A2DP eine Verzögerung von einer halben Sekunde auf.
Dies macht das Ansehen von Filmen nicht möglich, da der Ton nicht mit dem Video synchronisiert ist.

Ich bin nicht sicher, ob die Verzögerung durch den Bluetooth-Standard, das A2PD-Protokoll, die A2DP-Implementierung unter Ubuntu 12.04 oder den Belkin Z73 Bluetooth-Empfänger verursacht wird.

Wie auch immer, ist das eine normale Verzögerung? Gibt es eine Möglichkeit, Audio über Bluetooth ohne merkliche Latenz abzuspielen?

Brillout
quelle
9
Keine echte Lösung für Ihr Problem, sondern eine Problemumgehung: Wenn es nur um das Abspielen von Filmen geht, können Sie den Audio- / Video-Offset anpassen, wodurch sich auch das Video verzögert. Verwenden mplayerSie dazu die Tasten +und -. In VLC weiß ich nicht, wie ich die Verzögerung einstellen soll, aber ich wäre überrascht, wenn VLC keine solche Option hat.
Leemes
Ich habe darüber nachgedacht, aber mir fehlt eine Lösung für YouTube. Wenn das Video mit HTML5 abgespielt wird, besteht eine Lösung darin, eine Browser-Erweiterung zu installieren, die einen Video-Offset festlegt. Aber für den Fall, dass das Video mit Flash abgespielt wird, bin ich mir nicht sicher, wie ich das erreichen soll.
Brillout
Übrigens ist die VLC-Option aktiviert Tools->Track Synchronisationoder spielt mit der --audio-desyncOption. Ich fürchte, ich bin mir nicht sicher, was die Einheiten sind und welche Richtung positiv ist, und die Hilfe wird in dieser Angelegenheit nicht angeboten, aber das ist es, wonach Sie suchen möchten.
Darael
Haben Sie eine dauerhafte Lösung für dieses Problem gefunden? Ich verwende derzeit die Lösung, um zwischen A2DP / HSP / A2DP zu wechseln, aber es ist nicht praktisch, dies bei jedem Synchronisierungsproblem zu tun.
Fred Wuerges

Antworten:

37

Nein, das ist nicht normal, aber ich hatte gelegentlich ein ähnliches Problem mit meinen Altec Lansing iMT525 Bluetooth-Lautsprechern. Etwas ähnliches Konzept wie die Antwort von Sri funktioniert für mich fast immer, und ich muss es nur einmal pro Verbindung tun.

Automatische Umschaltung der Bluetooth-Profile zur Neuinitialisierung von PulseAudio

Wenn Sie nach einem Schuldigen suchen, würde ich mir zuerst Ubuntus Soundsystem, PulseAudio und dann Ihren Bluetooth-Empfänger ansehen. Versuche dies:

  • Löschen Sie zuerst Ihr Bluetooth-Gerät und koppeln Sie es erneut.

  • Kopieren Sie dann das Folgende und fügen Sie es in eine .shDatei in Ihrem Home-Verzeichnis ein, sagen Sie /home/brillout/pabluezswitch.sh:

    #! / bin / bash
    BLUEZCARD = `Paktliste Karten kurz | egrep -o bluez. * [[: space:]] ` pactl set-card-profile $ BLUEZCARD a2dp pactl set-card-profile $ BLUEZCARD hsp pactl set-card-profile $ BLUEZCARD a2dp
  • Machen Sie die Datei ausführbar, indem Sie ein Terminal öffnen und tippen chmod +x ~/pabluezswitch.sh

  • Gehen Sie zu Einstellungen ... Tastatur ... Verknüpfungen und erstellen Sie eine benutzerdefinierte Verknüpfung. Benennen Sie es mit dem Befehl wie /home/brillout/pabluezswitch.shfolgt: (Ersetzen Sie den entsprechenden Benutzernamen im Pfad!). Klicken Sie auf Übernehmen und dann rechts auf Deaktiviert , um eine Tastenkombination zum Ausführen des Skripts einzurichten.

ad2p -> hsp -> a2dpDadurch wird das PulseAudio-System gezwungen, die Audiodaten, die an Ihr Headset / Ihre Lautsprecher gesendet werden, neu zu synchronisieren, indem das Profil von umgeschaltet wird, wodurch hoffentlich jegliche Latenz beseitigt wird.


Wann immer Sie eine Verbindung herstellen und die Verzögerung bemerken, sollten Sie die oben gewählte Tastenkombination drücken, um die Latenz zu beheben - hoffentlich funktioniert es für Sie!

ish
quelle
Ich benutze das jetzt seit ein paar Tagen und es funktioniert großartig. - 14.04
dpb
7
Beachten Sie, dass pactl schreckliche Fehlermeldungen hat und dass viele Audiogeräte diese ad2pund nicht haben hsp. Meine Bose hat nur ad2p_sink, nicht diese beiden anderen.
odinho - Velmont
1
Ich denke, Sie brauchen Anführungszeichen um dieses egrep-Muster
naught101
1
Ich vermute nicht, dass es eine Möglichkeit gibt, die Latenz zu überwachen und dieses Skript automatisch auszulösen, wenn es einen Schwellenwert über dem Referenzwert überschreitet. pacmd info | grep "current latency"und pacmd statscheinen die gleichen Latenzzahlen / Puffergröße zu liefern, egal wie groß die tatsächliche Latenz ist (z. B. wenn Sie das Headset aus der Reichweite nehmen und es zurückbringen). Ist also möglicherweise ein anderer Teil des Stapels für die Latenz verantwortlich?
Ponkadoodle
2
@ odinho-Velmont zwischen umschalten ad2p_sinkund offfunktioniert bei mir. Ich habe dies kürzlich meinem Skript zur Audio- / Lautstärkeregelung von Pulse hinzugefügt , das für jemanden hilfreich sein könnte
Sam Mason,
21
  • Installieren Sie pavucontrol: sudo apt install pavucontrol
  • Führen Sie pavucontrolaus dem Menü
  • Gehen Sie zu Ausgabegeräte
  • Gehen Sie zum Bluetooth-Gerät
  • Gehen Sie zu Erweitert
  • Dort können Sie den Latenzoffset auf den Wert in Millisekunden (plus oder minus) einstellen. Um den Wert sicherzustellen, müssen Sie einen beliebigen Wert eingeben, z. B. 250,00 mi.
  • Spielen Sie einen "Audio-Sync-Test" von YouTube und stellen Sie die Wiedergabegeschwindigkeit auf 0,25 ein (verringern Sie die Geschwindigkeit). Von dort aus können Sie feststellen, ob der Wert korrekt ist oder erhöht oder verringert werden muss.
Roelf Renkema
quelle
2
Unnötiges Problem aus der Antwort entfernt - keine Notwendigkeit, unhöflich zu sein. Auch das klingt, als sollte es funktionieren, aber es scheint eigentlich nichts für mich zu tun ...
naught101
Bei mir funktionierte dies für die YouTube-Wiedergabe mit Bluetooth-Lautsprechern. Vielen Dank. Als ich pavucontrol zum ersten Mal öffnete, war die erweiterte Option ausgeblendet. Musste das Fenster vertikal erweitern.
user75505
11

Ich bekomme gelegentlich ein ähnliches Problem, unabhängig vom verwendeten Player. Meins ist ein Nokia BH-503 Bluetooth-Stereo-Kopfhörer mit MSI CR400-Laptop und Ubuntu 11.10. Ich bin zufällig auf eine Problemumgehung gestoßen, die Sie ausprobieren können.

  • Starten Sie die Videowiedergabe.
  • Gehen Sie zu Soundeinstellungen> Hardware.
  • Wählen Sie das Bluetooth-Gerät aus.
  • Wechseln Sie dann in den Einstellungen für das ausgewählte Gerät in das Telefonie-Duplex-Profil (HSP / HFP) und dann wieder in die High-Fidelity-Wiedergabe (A2DP).
Sri
quelle
7

Die Top-Antwort hier funktioniert, aber nicht für jedes Bluetooth-Audiogerät. Einige Geräte haben andere Profilnamen als das Poster mit seinen Bluetooth-Lautsprechern. Im folgenden Code, der ursprünglich von dieser Person gepostet wurde, sind beispielsweise die Profile " a2dpund" angegeben hsp. Beides ist zum Beispiel für meine LG Tones nicht verfügbar, aber für andere Geräte wie mein Sony-Headset.

#!/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

Dieser Code funktioniert für die meisten Bluetooth-Geräte, die angezeigt werden. Wenn Sie dies jedoch für Geräte ohne a2dp- oder hsp-Profil tun möchten, geben Sie Folgendes ein:

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

Dadurch wird alles zurückgegeben, nachdem ein Bluetooth-Gerät gefunden wurde. Mit dem LG Tone Ultra-Headset erhalte ich beispielsweise Folgendes:

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

Wir sind an der profilesSektion interessiert . In diesem Abschnitt sehen wir drei Profile, die sind a2dp_sink, headset_head_unitund off. Die beiden Profile, die wir benötigen, sollten (A2DP Sink) und (HSP / HFP) enthalten. In diesem Fall gelten sie a2dp_sinkfür das a2dp-Profil und headsethead_unitfür das hsp-Profil. Beachten Sie, dass dies anders ist als der ursprüngliche Poster a2dpund hsp.

Mit dem obigen Code werden wir ihn nun ändern und in eine Datei einfügen. Ich habe die Datei angerufen bluezswitch.sh.

Wechseln Sie in das Verzeichnis, in das Sie die Datei einfügen möchten. Es kann überall sein.

touch bluezswitch.sh

Dann

nano bluezswitch.sh

Kopieren Sie den Code und fügen Sie ihn ganz oben in diesen Kommentar ein. Ersetzen Sie den Code a2dpund hspdurch die Werte, die Sie beim Ausführen des obigen Befehls erhalten haben, und fügen Sie sie in diese Datei ein. So sah zum Beispiel meine Datei für meine LG Tones aus.

#!/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

Nun, ctrl-xdann y, um die Datei zu speichern und nano zu beenden und dann die Datei ausführbar zu machen:

chmod +x bluezswitch.sh

Setzen Sie anschließend eine Tastenkombination, wie bereits erläutert.

Gehen Sie zu Einstellungen ... Tastatur ... Verknüpfungen und erstellen Sie eine benutzerdefinierte Verknüpfung. Benennen Sie es mit dem Befehl /home/brillout/bluezswitch.sh (ersetzen Sie den entsprechenden Benutzernamen im Pfad!). Klicken Sie auf Übernehmen und dann rechts auf Deaktiviert, um eine Tastenkombination zum Ausführen des Skripts einzurichten.

Das sollte alles sein, was es zu tun gibt. Dies sollte für alle funktionieren, für die es vorher nicht funktioniert hat.

Timm Simpkins
quelle
1
Für mich Ausschalten a2dp_sink, off, a2dp_sinkin Folge arbeitet sehr gut für mich. Einstellung auf headset_head_unitE / A-Fehler.
Mohd Shahril
5

Die adaptive differentielle Pulscodemodulation beinhaltet einen Komprimierungsalgorithmus vom Look-Ahead-Typ, bei dem Informationen nicht übertragen werden können, bevor der Codierer die Möglichkeit hatte, mehrere Bytes anstehender Informationen zu untersuchen. Daher müssen sich Daten im Codierer stapeln, und es gibt eine inhärente Zeitverschiebung zwischen den Strömen, die in den Codierer eintreten und diesen verlassen. Vor langer Zeit habe ich mich mit Verzögerungen im Datennetz befasst, um die Machbarkeit von Voice-over-Data-Telefonie (was jetzt VoIP ist) zu ermitteln. Ich denke, ich bin zu dem Schluss gekommen, dass die ADPCM-artige Komprimierung / Codierung zu viel Verzögerung mit sich bringen würde. Ich denke, um dieses Problem der Bluetooth-Verzögerung zu überwinden, ist möglicherweise eine nicht komprimierende Audiocodierung erforderlich, die eine geringere Latenz aufweisen sollte.

Kirk Shrewsbury
quelle
6
Das Komprimierungsproblem würde einige zehn Millisekunden ausmachen, nicht eine halbe Sekunde, oder?
Naught101
4

Ich habe viele Ansätze für dieses Problem ausprobiert, aber nichts konnte es beheben. Dann bin ich auf Set-Port-Latenz-Offset gestoßen

Wenn Sie pulseaudio verwenden, gehen Sie wie folgt vor:

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

Dadurch erhalten Sie die Bluetooth-Schnittstelle. Stellen Sie nun die Latenz entsprechend ein:

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

Ich verwende 100000 Mikrosekunden, was für mich gut funktioniert.

Arindam Mani Das
quelle
1
Für alle anderen, die über diesen alten Beitrag stolpern und nach einer Antwort suchen, funktioniert die Antwort von Arindam Mani Das perfekt. Wenn Sie die Fehlermeldung "no such entity" erhalten, führen Sie "pactl list cards" aus und überprüfen Sie, welche Ports für Ihr Gerät verfügbar sind. Ich musste im zweiten Befehl "Lautsprecherausgang" in "Headsetausgang" ändern, da mein Gerät keinen Lautsprecherausgang hat.
Billy Farrington
1

Hier ist, was es für mich gelöst hat: $ sudo apt-get install phonon-backend-vlcund stellen Sie sicher, dass es das bevorzugte Backend ist, gehen Sie in KDE zu [Systemeinstellungen] [Multimedia] [Audio- und Videoeinstellungen] [Backend] und verwenden Sie die Schaltfläche [Bevorzugen]

dargaud
quelle
1
@dargaud Ich empfehle, dies zu erweitern, um zu erklären, wie man es zum bevorzugten Backend macht.
Eliah Kagan
0

Personen, die dieses Problem haben Bitte besuchen Sie diese Website: http://projectzeorymer.wordpress.com/2011/09/01/ubuntu-how-to-connect-nokia-bh-503-bluetooth-headset-to-your-pc / um ein Bild von dem zu sehen, was Sie herunterladen müssen.

Laden Sie den Bluetooth-Manager herunter und bearbeiten Sie damit die Einstellungen des Headsets. Stellen Sie die Toneinstellungen auf High Fidelity Playback (A2DP) und rufen Sie dann die Toneinstellungen auf.

Alex Force
quelle
1
Gehen Sie auf Bluetooth verwalten und gehen Sie zu Audio-Profil und wählen Sie dann High Fedelity Playback .. das ist es
Alex Force
0

Gehen Sie auf dem VLC Media Player zu Extras Registerkarte Synchronisieren von Spuren Verwenden Sie unter Synchronisieren von Audio- / Video-Audiospuren einen negativen Wert wie etwa -0,67, um die Verzögerung vollständig zu kompensieren. Sie müssen dies jedes Mal manuell tun, wenn Sie eine neue Datei öffnen. Chris

Lex
quelle
0

Ähnlich wie Timms Antwort hatte ich auch nicht die Profile der akzeptierten Antwort. Beim Einstellen des HSP wurde ein Fehlercode ausgegeben.

Am Ende habe ich das folgende, fast identische Skript verwendet.

#!/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
quelle
0

Nach all den Jahren scheint dieses Problem immer noch aktuell zu sein.

Basierend auf der Antwort von Arindam Mani Das und dem Kommentar von Billy Farrington habe ich das folgende Shell-Skript erstellt:

#!/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

Ich benutze 100000 Mikrosekunden, wie von Arindam empfohlen, und es funktioniert auch gut für mich.

Yakir Magriso
quelle