กำจัดเวลาแฝง 0.5s เมื่อเล่นเสียงผ่าน Bluetooth ด้วย A2DP


49

ตามที่อธิบายไว้ในชื่อเรื่องฉันพบความล่าช้าครึ่งวินาทีเมื่อเล่นเสียงผ่านบลูทู ธ ด้วย A2DP
ทำให้การชมภาพยนตร์เป็นไปไม่ได้เนื่องจากไม่มีการซิงโครไนซ์เสียงกับวิดีโอ

ฉันไม่แน่ใจว่าการหน่วงเวลานั้นเกิดจากมาตรฐานบลูทู ธ โปรโตคอล A2PD การใช้งาน A2DP บน Ubuntu 12.04 หรือตัวรับบลูทู ธ Belkin Z73

อย่างไรก็ตามนี่เป็นความล่าช้าปกติหรือไม่ มีวิธีการเล่นเสียงผ่านบลูทู ธ โดยไม่แฝงเร้นหรือไม่?


8
ไม่ใช่วิธีการแก้ปัญหาที่แท้จริงของคุณ แต่เป็นวิธีแก้ปัญหา: หากเป็นเพียงเรื่องเกี่ยวกับการเล่นภาพยนตร์คุณสามารถปรับการชดเชยเสียง / วิดีโอซึ่งจะทำให้วิดีโอล่าช้าได้เช่นกัน ใช้mplayerคุณทำได้โดยการกดปุ่ม+และ-ปุ่ม ใน VLC ฉันไม่รู้วิธีตั้งค่าความล่าช้า แต่ฉันต้องแปลกใจถ้า VLC ไม่มีตัวเลือกดังกล่าว
leemes

ฉันคิดถึงเรื่องนั้น แต่ฉันไม่มีวิธีแก้ปัญหาสำหรับ YouTube เมื่อเล่นวิดีโอด้วย HTML5 วิธีแก้ไขอาจเป็นการติดตั้งส่วนขยายของเบราว์เซอร์ที่ตั้งค่าการชดเชยวิดีโอ แต่สำหรับกรณีที่วิดีโอเล่นด้วยแฟลชฉันไม่แน่ใจว่าจะทำเช่นนั้นได้อย่างไร
brillout

อนึ่งตัวเลือก VLC อยู่ที่Tools->Track Synchronisationหรือเล่นกับ--audio-desyncตัวเลือก ฉันกลัวว่าฉันไม่แน่ใจว่าหน่วยคืออะไรและทิศทางใดเป็นบวกและความช่วยเหลือไม่ได้เกิดขึ้นในเรื่องนี้ แต่นั่นคือสิ่งที่คุณต้องการมองหา
Darael


คุณพบวิธีแก้ไขปัญหานี้อย่างถาวรหรือไม่? ขณะนี้ฉันใช้โซลูชันเพื่อสลับระหว่าง A2DP / HSP / A2DP แต่ในทางปฏิบัติไม่ได้ที่จะทำเช่นนั้นทุกครั้งที่มีปัญหาการซิงค์
Fred Wuerges

คำตอบ:


37

ไม่นี่ไม่ใช่เรื่องปกติ แต่ฉันมีปัญหาคล้ายกันในบางครั้งกับ Altec Lansing iMT525 Bluetooth Speakers ของฉัน สิ่งที่คล้ายกันในแนวคิดของคำตอบของศรีเกือบจะได้ผลกับฉันเสมอและฉันต้องทำเพียงครั้งเดียวต่อการเชื่อมต่อ

การสลับโปรไฟล์ Bluetooth อัตโนมัติเพื่อเริ่มต้น PulseAudio อีกครั้ง

หากคุณกำลังมองหาผู้ร้ายฉันจะดูระบบเสียง PulseAudio ของ Ubuntu ก่อนแล้วจึงรับบลูทู ธ ของคุณ ลองสิ่งนี้:

  • ก่อนอื่นให้ลบและจับคู่อุปกรณ์บลูทู ธ ของคุณอีกครั้ง

  • จากนั้นคัดลอกและวางด้านล่างลงใน.shไฟล์ในโฮมไดเร็กตอรี่ของคุณพูดว่า/home/brillout/pabluezswitch.sh:

    #! / bin / ทุบตี
    BLUEZCARD = `pactl แสดงบัตรสั้น | egrep -o bluez. * [[: space:]] ` pactl set-card-profile $ BLUEZCARD a2dp pactl set-card-profile $ BLUEZCARD hsp pactl set-card-profile $ BLUEZCARD a2dp
  • ทำให้ไฟล์นั้นทำงานได้โดยเปิดเทอร์มินัลแล้วพิมพ์ chmod +x ~/pabluezswitch.sh

  • ไปที่การตั้งค่า ... แป้นพิมพ์ ... ทางลัดและสร้างทางลัดที่กำหนดเอง ตั้งชื่อสิ่งที่คุณต้องการโดยใช้คำสั่งเป็น/home/brillout/pabluezswitch.sh(แทนที่ชื่อผู้ใช้ที่เหมาะสมในเส้นทาง!) คลิกนำไปใช้จากนั้นคลิกที่ด้านขวาที่แจ้งว่าปิดใช้งานเพื่อตั้งค่าแป้นพิมพ์ลัดเพื่อเรียกใช้สคริปต์

สิ่งนี้จะบังคับให้ระบบ PulseAudio ซิงโครไนซ์เสียงที่ส่งไปยังชุดหูฟัง / ลำโพงของคุณอีกครั้งโดยการเปลี่ยนโปรไฟล์จากad2p -> hsp -> a2dpหวังว่าจะได้รับการขจัดความล่าช้าใด ๆ


เมื่อใดก็ตามที่คุณเชื่อมต่อและสังเกตเห็นความล่าช้าคุณควรกดแป้นพิมพ์ลัดที่เลือกไว้ด้านบนเพื่อพยายามแก้ไขเวลาในการตอบสนอง - หวังว่ามันจะทำงานให้คุณ!


ฉันใช้มันมาสองสามวันแล้วและมันใช้งานได้ดี - 14.04
dpb

7
หมายเหตุ pactl ที่มีข้อความผิดพลาดที่น่ากลัวและอุปกรณ์เครื่องเสียงจำนวนมากไม่ได้เหล่านี้และad2p hspMy Bose มีad2p_sinkแต่ไม่ใช่อีกสองคนนี้
odinho - Velmont

1
ฉันคิดว่าคุณต้องการอัญประกาศรอบรูปแบบ egrep
naught101

1
ฉันไม่คิดว่าจะมีวิธีในการตรวจสอบเวลาแฝงและทริกเกอร์สคริปต์นี้โดยอัตโนมัติเมื่อมีค่าเกินเกณฑ์ที่ระบุข้างต้นหรือไม่ pacmd info | grep "current latency"และpacmd statดูเหมือนว่าจะให้ตัวเลขเวลาแฝง / ขนาดบัฟเฟอร์เท่ากันไม่ว่าเวลาแฝงที่แท้จริงจะเพิ่มขึ้นเท่าใด (เช่นเมื่อถอดชุดหูฟังออกจากระยะไกลและนำกลับมา) ดังนั้นอาจเป็นส่วนที่แตกต่างกันของสแต็ค
Ponkadoodle

2
@ odinho-Velmont สลับระหว่างad2p_sinkและใช้offงานได้สำหรับฉัน เมื่อเร็ว ๆ นี้ฉันได้ประกาศสิ่งนี้กับสคริปต์การควบคุมเสียง / ระดับเสียง Pulseของฉันที่อาจเป็นประโยชน์กับใครบางคน
Sam Mason

21
  • ติดตั้ง pavucontrol: sudo apt install pavucontrol
  • เรียกใช้pavucontrolจากเมนู
  • ไปที่อุปกรณ์ส่งออก
  • ไปที่อุปกรณ์บลูทู ธ
  • ไปที่ขั้นสูง
  • คุณสามารถตั้งค่าเวลาแฝงเพื่อชดเชยค่าเป็นมิลลิวินาที (บวกหรือลบ) เพื่อให้แน่ใจว่ามีค่าคุณต้องเริ่มต้นด้วยค่าใด ๆ เช่น 250.00 mi
  • เล่น "การทดสอบการซิงค์เสียง" จาก YouTube และตั้งค่าความเร็วการเล่นเป็น 0.25 (ทำให้ช้าลง) จากนั้นคุณสามารถเริ่มสังเกตเห็นว่าค่านั้นถูกต้องหรือจำเป็นต้องเพิ่มขึ้นหรือลดลง

2
ลบ Sass ที่ไม่จำเป็นออกจากคำตอบ - ไม่จำเป็นต้องหยาบคาย นอกจากนี้ดูเหมือนว่ามันจะทำงานได้ แต่ดูเหมือนจะไม่ทำอะไรเลยสำหรับฉันจริง ๆ ...
naught101

สำหรับฉันมันใช้งานได้กับการเล่น youtube ด้วยลำโพงบลูทู ธ ขอบคุณ เมื่อฉันเปิด pavucontrol ครั้งแรกตัวเลือกขั้นสูงก็ถูกซ่อนไว้ ต้องขยายหน้าต่างในแนวตั้ง
user75505

11

ฉันพบปัญหาที่คล้ายกันเป็นครั้งคราวโดยไม่คำนึงถึงผู้เล่นที่ใช้ Mine เป็นหูฟังสเตอริโอบลูทู ธ Nokia BH-503 ที่มีแล็ปท็อป MSI CR400 และ Ubuntu 11.10 ฉันบังเอิญพบวิธีแก้ปัญหาที่คุณสามารถลองได้

  • เริ่มเล่นวิดีโอ
  • ไปที่การตั้งค่าเสียง> ฮาร์ดแวร์
  • เลือกอุปกรณ์บลูทู ธ
  • จากนั้นในการตั้งค่าสำหรับเมนูแบบเลื่อนลงของอุปกรณ์ที่เลือกให้สลับไปที่โปรไฟล์ Telephony Duplex (HSP / HFP) จากนั้นเปลี่ยนกลับเป็น High Fidelity Playback (A2DP)

7

คำตอบยอดนิยมที่นี่ใช้ได้ แต่ไม่ใช่สำหรับอุปกรณ์เสียงบลูทู ธ ทุกตัว อุปกรณ์บางอย่างมีชื่อโปรไฟล์ที่แตกต่างจากโปสเตอร์ที่มีลำโพงบลูทู ธ ของเขา ยกตัวอย่างเช่นในรหัสต่อไปนี้ซึ่งถูกโพสต์โดยคนคนนั้นก็เห็นได้ชัดว่ามีการตั้งชื่อโปรไฟล์และa2dp hspตัวอย่างเหล่านี้ไม่สามารถใช้งานได้กับ LG Tones ของฉันตัวอย่างเช่น แต่จะใช้กับอุปกรณ์อื่นเช่นชุดหูฟัง 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

รหัสนั้นจะใช้ได้กับอุปกรณ์บลูทู ธ ส่วนใหญ่ที่ปรากฏ แต่เพื่อให้การทำงานนี้ถูกต้องสำหรับอุปกรณ์เหล่านั้นที่ไม่มีโปรไฟล์ a2dp หรือโปรไฟล์ hsp ให้พิมพ์:

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

นี่จะส่งคืนทุกสิ่งหลังจากที่พบอุปกรณ์บลูทู ธ ตัวอย่างเช่นด้วยชุดหูฟัง LG Tone Ultra ฉันได้สิ่งนี้:

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

เรามีความสนใจในprofilesส่วน ในส่วนนี้เราจะเห็นสามโปรไฟล์ซึ่งเป็นa2dp_sink, และheadset_head_unit offสองโปรไฟล์ที่เราต้องการควรมีในพวกเขา (A2DP Sink) และ (HSP / HFP) ในกรณีนี้ใช้a2dp_sinkสำหรับโปรไฟล์ a2dp และheadsethead_unitสำหรับโปรไฟล์ hsp แจ้งให้ทราบนี้จะแตกต่างจากโปสเตอร์เดิมและa2dphsp

ตอนนี้ด้วยโค้ดข้างต้นเราจะแก้ไขและใส่ลงในไฟล์ bluezswitch.shผมเรียกว่าไฟล์

เปลี่ยนเป็นไดเร็กทอรีที่คุณต้องการวางไฟล์ มันสามารถไปได้ทุกที่

touch bluezswitch.sh

แล้วก็

nano bluezswitch.sh

คัดลอกและวางรหัสที่ด้านบนสุดของความคิดเห็นนี้และแทนที่a2dpและhspด้วยค่าที่คุณได้รับเมื่อคุณรันคำสั่งด้านบนแล้ววางลงในไฟล์นั้น เช่นนี่เป็นไฟล์ที่ฉันใช้สำหรับ LG Tones

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

ตอนนี้ctrl-xจากนั้นyให้บันทึกไฟล์และออกจาก nano จากนั้นทำไฟล์ที่ปฏิบัติการได้:

chmod +x bluezswitch.sh

จากนั้นติดตามด้วยการตั้งค่าแป้นพิมพ์ลัดตามที่อธิบายไว้

ไปที่การตั้งค่า ... แป้นพิมพ์ ... ทางลัดและสร้างทางลัดที่กำหนดเอง ตั้งชื่อสิ่งที่คุณต้องการโดยใช้คำสั่งเป็น /home/brillout/bluezswitch.sh (แทนชื่อผู้ใช้ที่เหมาะสมในเส้นทาง!) คลิกนำไปใช้จากนั้นคลิกที่ด้านขวาที่แจ้งว่าปิดใช้งานเพื่อตั้งค่าแป้นพิมพ์ลัดเพื่อเรียกใช้สคริปต์

นั่นควรเป็นทั้งหมดที่มีอยู่ สิ่งนี้ควรใช้กับคนที่ไม่ได้ทำงานมาก่อน


1
สำหรับผมปิดa2dp_sink, off, a2dp_sinkในลำดับการทำงานเป็นอย่างดีสำหรับฉัน การตั้งค่าheadset_head_unitข้อผิดพลาด I / O
Mohd Shahril

5

การปรับรหัสพัลส์ Adaptive Differential เกี่ยวข้องกับอัลกอริธึมการบีบอัดประเภท Look-ahead ซึ่งไม่สามารถส่งข้อมูลได้ก่อนที่เครื่องเข้ารหัสจะมีโอกาสตรวจสอบข้อมูลที่กำลังจะมาถึงหลายไบต์ ดังนั้นข้อมูลจะต้องสแตกในตัวเข้ารหัสและมีการเปลี่ยนเวลาโดยธรรมชาติระหว่างกระแสที่เข้าและออกจากตัวเข้ารหัส นานมาแล้วฉันได้ศึกษาความล่าช้าของเครือข่ายข้อมูลเพื่อพิจารณาความเป็นไปได้ของระบบโทรศัพท์ผ่านเสียง (ในขณะนี้ VoIP) ฉันคิดว่าฉันสรุปว่าการบีบอัด / เข้ารหัสสไตล์ ADPCM จะทำให้เกิดความล่าช้ามากเกินไป ฉันคิดว่าจะเอาชนะปัญหาความล่าช้าของบลูทู ธ ได้เราอาจต้องใช้การเข้ารหัสเสียงแบบไม่บีบอัดซึ่งควรมีความหน่วงแฝงที่ต่ำกว่า


6
ปัญหาการบีบอัดจะคิดเป็นสองสามสิบมิลลิวินาทีไม่ใช่ครึ่งวินาทีใช่ไหม
naught101

4

ฉันลองวิธีการมากมายในการแก้ไขปัญหานี้ แต่ไม่มีอะไรสามารถแก้ไขได้ จากนั้นฉันก็สะดุดกับset-port-latency-offset

หากคุณใช้ pulseaudio ให้ทำ:

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

นี่จะทำให้คุณได้รับส่วนต่อประสานบลูทู ธ ตอนนี้ตั้งค่าเวลาในการตอบสนอง:

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

ฉันใช้ 100000 microseconds ซึ่งใช้งานได้ดีสำหรับฉัน


1
สำหรับคนอื่นที่สะดุดในโพสต์เก่านี้เพื่อค้นหาคำตอบคำตอบของ Arindam Mani Das ก็ทำงานได้อย่างสมบูรณ์แบบ หากคุณได้รับข้อผิดพลาด "ไม่มีเอนทิตีดังกล่าว" ให้เรียกใช้ 'pactl list cards' และตรวจสอบว่าพอร์ตใดพร้อมใช้งานสำหรับอุปกรณ์ของคุณ ฉันต้องเปลี่ยน "ลำโพงเอาต์พุต" เป็น "ชุดหูฟัง - เอาต์พุต" ในคำสั่งที่สองเนื่องจากอุปกรณ์ของฉันไม่มีพอร์ตลำโพง - เอาต์พุต
Billy Farrington

1

นี่คือสิ่งที่แก้ไขได้สำหรับฉัน: $ sudo apt-get install phonon-backend-vlcและตรวจสอบให้แน่ใจว่าเป็นแบ็กเอนด์ที่ต้องการใน KDE ไปที่ [การตั้งค่าระบบ] [มัลติมีเดีย] [การตั้งค่าเสียงและวิดีโอ] [แบ็กเอนด์] และใช้ [ปุ่มชอบ]


1
@dargaud ฉันขอแนะนำให้ขยายสิ่งนี้เพื่ออธิบายวิธีทำให้เป็นแบ็กเอนด์ที่ต้องการ
Eliah Kagan

0

บุคคลที่มีปัญหานี้โปรดดูเว็บไซต์นี้: http://projectzeorymer.wordpress.com/2011/09/01/ubuntu-how-to-connect-nokia-bh-503-bluetooth-headset-to-your-pc /เพื่อดูรูปของสิ่งที่คุณต้องดาวน์โหลด

ดาวน์โหลดตัวจัดการบลูทู ธ และใช้เพื่อจัดการการตั้งค่าของชุดหูฟัง ตั้งค่าเสียงเป็น High Fidelity Playback (A2DP) แล้วไปที่การตั้งค่าเสียง


1
ใช้บลูทู ธ จัดการและไปที่โปรไฟล์เสียงจากนั้นเลือก High Fedelity Playback .. thats it
Alex Force

0

บนเครื่องเล่นสื่อ VLC ไปที่เครื่องมือติดตามการซิงโครไนซ์แท็บซิงโครไนซ์ภายใต้แทร็กเสียง / วิดีโอซิงโครไนซ์ให้ใช้ค่าลบเช่นประมาณ -0.67 และความล่าช้าจะได้รับการชดเชยอย่างเต็มที่ คุณต้องทำสิ่งนี้ด้วยตนเองทุกครั้งที่คุณเปิดไฟล์ใหม่ คริส


0

เช่นเดียวกันกับคำตอบของ Timm ฉันไม่ได้มีโปรไฟล์ของคำตอบที่ยอมรับเช่นกัน การตั้งค่า HSP ให้รหัสข้อผิดพลาด

ฉันใช้สคริปต์ต่อไปนี้เกือบเหมือนกัน

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

0

ดูเหมือนว่าปัญหานี้ยังคงเกี่ยวข้องหลังจากปีที่ผ่านมาทั้งหมด

จากคำตอบของArindam Mani Dasและความคิดเห็นของBilly Farringtonฉันได้สร้างเชลล์สคริปต์ต่อไปนี้:

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

ฉันใช้ 100000 microseconds ตามที่ Arindam แนะนำและใช้งานได้ดีสำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.