Tại sao pulseaudio xử lý kết nối chất lượng âm thanh với thiết bị BT?


11

Tôi mới dùng Linux và cũng mới với kịch bản Bluetooth. Những gì tôi đã phát hiện ra cho đến nay là như sau:

  1. Bluez là ngăn xếp BT mặc định.
  2. BluezTools là một bộ tiện ích bạn có thể sử dụng để dễ dàng tương tác hơn với Bluez
  3. DBus là giao diện mà Bluez kết nối trong khi tương tác trực tiếp với phần cứng.
  4. PulseAudio là hệ thống con chịu trách nhiệm sản xuất âm thanh trên hệ thống.

Điều này thật ý nghĩa. Vì vậy, giả sử tôi có một bộ tai nghe BlueTooth, điều tôi mong đợi là (tất cả sau khi ghép nối và tin tưởng), để có thể đưa ra lệnh có thể kết nối trực tiếp với một cấu hình nhất định trên tai nghe BT.

Con đường kỹ thuật tôi có trong đầu sẽ là một cái gì đó như:

  1. Bật tai nghe.
  2. Phát hành lệnh BluezTools - chẳng hạn như bt-audio -c
  3. Đợi thiết bị kết nối với dịch vụ tôi đang theo dõi
  4. PulseAudio bây giờ sẽ nhận một thiết bị đầu ra mới
  5. Đưa ra một lệnh khác để thay đổi âm thanh từ âm thanh thành âm thanh đầu ra mới (tai nghe BT).
  6. Tận hưởng trải nghiệm nghe liền mạch.

Tất cả điều này có vẻ hợp lý, nhưng việc triển khai thực tế không như thế này và tôi đang tìm kiếm TẠI SAO, vì vậy tôi có thể hiểu rõ hơn vấn đề và thử và khắc phục nó.

Đây là những gì thực sự xảy ra:

  1. Bật tai nghe.
  2. Phát hành lệnh BluezTools - chẳng hạn như bt-audio -c
  3. Đợi thiết bị kết nối với dịch vụ tôi đang theo dõi
  4. PulseAudio bây giờ sẽ nhận một thiết bị đầu ra mới
  5. Ban hành lệnh PulseAudio để thay đổi cấu hình âm thanh từ chất lượng điện thoại sang độ trung thực cao.

Hãy để tôi mở rộng về điều này một chút. Tai nghe bluetooth cung cấp 2 chế độ chất lượng (điện thoại và độ trung thực cao). Chỉ có 1 là thực sự phù hợp để nghe nhạc.

Tôi hy vọng rằng tai nghe BT hiển thị từng chế độ chất lượng như một dịch vụ, điều này có đúng không? Giả định này có thể sai, nhưng tôi sẽ mong đợi một cái gì đó như

bt-audio -c highFidelityProfile

hoặc là

bt-audio -changeProfile highFidelityProfile

Thay vào đó, có vẻ như Bluez chỉ xử lý kết nối RAW với thiết bị và từ đó bạn cần phát hành: pacmd set-card-profile $ INDEX a2dp

Điều này về cơ bản là sai. Tại sao kiểm soát chất lượng trong hệ thống con âm thanh, do đó yêu cầu triển khai khác cho xung hoặc alsa hoặc bất kỳ hệ thống phụ âm thanh nào khác ngoài đó?

Tôi đang thiếu gì? Tại sao không thể kết nối trực tiếp với một cấu hình nhất định bằng Bluez / BluezTools, v.v.?

Câu trả lời:


2

Kết nối bluetooth có độ trễ đáng kể so với tai nghe hoặc loa có dây đơn giản. Hơn nữa, độ trễ kết nối có thể khác nhau, tùy thuộc vào thuộc tính của bộ thu bluetooth và thậm chí có thể cường độ tín hiệu radio khi người dùng di chuyển xung quanh.

Giao diện giữa một ứng dụng và PulseAudio có thể đơn giản như "đây là một số dữ liệu âm thanh PCM; phát cái này." Nhưng nó cũng có thể phức tạp hơn; đại loại như "Đây là một số dữ liệu âm thanh PCM, hãy phát dữ liệu này và cho tôi biết cứ sau 50 ms bạn đã đi được bao xa, để tôi có thể bảo bạn bỏ qua phía trước nếu có vẻ như bạn không đồng bộ với luồng video Tôi đang chơi. Ồ, và bạn cũng sẽ cần phải lấy mẫu lại, vì dữ liệu có tốc độ mẫu mà phần cứng của bạn sẽ không hỗ trợ trực tiếp. " Trong trường hợp sau, PulseAudio cần có khả năng cung cấp cho ứng dụng một số phản hồi từ thiết bị âm thanh để xác định chính xác khoảng cách dữ liệu âm thanh thực sự được phát tại bất kỳ thời điểm nào.

Do đó, thật hợp lý khi PulseAudio tham gia khá sâu vào xử lý âm thanh Bluetooth: càng có nhiều lớp can thiệp, càng có nhiều khả năng dữ liệu được đệm mà không duy trì phản hồi chính xác, khiến mất đồng bộ môi.

Trên thực tế, trước khi PulseAudio tồn tại, đã từng có một phụ trợ ALSA cho âm thanh Bluetooth, nhưng nó không được dùng nữa. Tôi nghĩ vấn đề là các giao diện của ALSA tại thời điểm đó được thiết kế chủ yếu cho các card âm thanh truyền thống và việc xử lý độ trễ âm thanh có thể thay đổi của Bluetooth là rất khó.

Các giao diện của PulseAudio được thiết kế từ đầu để xử lý các thiết bị âm thanh khác nhau và thậm chí chuyển đổi các luồng âm thanh giữa chúng khi phát, vì vậy đối với tôi, nó có một khái niệm khá tiên tiến về độ trễ âm thanh được tích hợp.

Có, nó có thể đã được triển khai trong BlueZ chứ không phải là mô-đun PulseAudio; nhưng sau đó, BlueZ sẽ phải trình bày giao diện âm thanh cho các ứng dụng. Và vì PulseAudio muốn xử lý "tất cả" âm thanh trên một hệ thống (để có thể chuyển âm thanh bạn đang phát từ loa sang Bluetooth hoặc ngược lại khi đang di chuyển), nó sẽ phải giao tiếp với PulseAudio bằng cách nào đó


2

Tôi nghĩ rằng cuối cùng tôi đã tìm thấy một giải pháp (đã thử nghiệm trên hai hệ thống Linux Mint) mặc dù tôi không biết tại sao tôi cần phải làm theo các bước chính xác sau:

Các bước ban đầu:

  1. Cài đặt blueman: sudo apt-get cài đặt blueman
  2. Chỉnh sửa tệp Bluetooth: sudo nano /etc/bluetooth/main.conf và thêm dòng này vào cuối: Vô hiệu hóa = Tai nghe

Đối với mỗi lần chạy:

  1. Khởi động lại dịch vụ bluetooth: khởi động lại dịch vụ bluetooth
  2. Mở thiết bị từ blueman trong khay hệ thống hoặc nhập trình quản lý blueman trong thiết bị đầu cuối
  3. Tìm kiếm thiết bị âm thanh bluetooth của bạn
  4. Nhấp chuột phải vào thiết bị của bạn và kết nối dưới dạng tai nghe
  5. Chuyển đến âm thanh từ cài đặt hệ thống
  6. Chọn thiết bị của bạn bằng cách nhấp vào thiết bị một lần
  7. Bây giờ một lần nữa đi đến quản lý blueman
  8. Nhấp chuột phải vào thiết bị bluetooth của bạn và đặt cấu hình Âm thanh thành Phát lại độ trung thực cao (Chìm A2DP)

Nếu bạn bỏ lỡ bất kỳ bước nào, hãy đến bước 1 và thử lại. Hãy cho tôi biết nếu các công trình này.

Chỉnh sửa : Trong Linux Mint 19, trình quản lý bluetooth mặc định hoạt động hoàn hảo với Phát lại độ trung thực cao, không yêu cầu cấu hình nào cả !!


0

Mặc dù nó có thể thay đổi cấu hình của bạn, đây là một số lệnh được kiểm tra tốt.

Bạn cần đặt thiết bị là đáng tin cậy. Nó có thể được thực hiện thông qua gui.

trình duyệt sdptool sẽ cung cấp nhiều chi tiết về các giao thức và kênh có sẵn trên thiết bị đích.

Dễ dàng hơn để đặt bồn âm thanh bluetooth a2p khi sử dụng đầu ra âm thanh đồng thời, để thiết lập nó, hãy xem công cụ paprefs .

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

Khởi động thiết bị, dù sao cũng phải là hci0:

sudo hciconfig hci0 up

Liệt kê các thiết bị từ xa:

sudo rfkill list

Liệt kê các mạng bluetooth:

hcitool scan

Duyệt các giao thức có sẵn:

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

Kết nối thiết bị:

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

Gửi một tập tin:

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

Nhận file:

sudo bt-obex -s /

Quét / chờ dữ liệu trên một kênh (ở đây là kênh 19) và ghi dữ liệu trên một tệp có tên là dump, trong thư mục gốc:

sudo apt install bluez-hcidump

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

Thay thế: đôi khi hữu ích để ghép nối:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.