
我是 Linux 新手,也是藍牙腳本新手。到目前為止我發現的內容如下:
- Bluez 是預設的 BT 堆疊。
- BluezTools 是一組實用程序,您可以使用它們更輕鬆地與 Bluez 交互
- DBus 是 Bluez 在直接與硬體互動時連接的介面。
- PulseAudio 是負責在系統上產生音訊的子系統。
這是有道理的。假設我有一套藍牙耳機,我期望的是(在配對和信任之後)能夠發出可以直接連接到 BT 耳機上的某個配置文件的命令。
我想到的技術路徑是這樣的:
- 打開耳機。
- 發出 BluezTools 指令 - 例如bt 音訊 -c
- 等待設備連接到我想要的服務
- PulseAudio 現在應該會選擇一個新的輸出設備
- 發出另一個命令將音訊從原來的音訊更改為新的輸出音訊(BT 耳機)。
- 享受無縫的聆聽體驗。
這一切看起來都很合乎邏輯,但實際的實現並不是這樣的,我正在尋找為什麼,這樣我可以更好地理解問題並嘗試解決它。
這是實際發生的情況:
- 打開耳機。
- 發出 BluezTools 指令 - 例如bt 音訊 -c
- 等待設備連接到我想要的服務
- PulseAudio 現在應該會選擇一個新的輸出設備
- 發出 PulseAudio 命令將音訊設定檔從電話品質變更為高保真度。
讓我對此進行一些擴充。藍牙耳機提供 2 種音質模式(電話和高傳真)。只有1真正適合聽音樂。
我希望 BT 耳機將每種品質模式公開為一項服務,對嗎?這個假設可能是錯的,但我期望類似的事情
bt-音訊-c 高保真度設定文件
或者
bt-audio-changeProfile 高保真度設定檔
相反,Bluez 似乎只處理與設備的 RAW 連接,從那裡您需要發送:pacmd 設定卡片設定檔 $INDEX a2dp
這似乎從根本上是錯誤的。為什麼品質控制在音頻子系統中,因此需要對脈衝或 alsa 或任何其他聲音子系統進行不同的實現?
我缺什麼?為什麼無法使用 Bluez / BluezTools 等直接連接到某個設定檔?
答案1
與簡單的有線耳機或揚聲器相比,藍牙連接具有顯著的延遲。此外,連線延遲可能會有所不同,具體取決於藍牙接收器的屬性,甚至可能取決於使用者移動時的無線電訊號強度。
應用程式和 PulseAudio 之間的介面可以像「這裡有一些 PCM 音訊資料;播放它」一樣簡單。但它也可能更複雜;類似於「這裡有一些 PCM 音訊資料;播放該資料並每隔 50 毫秒告訴我您已經走了多遠,這樣如果您看起來與視訊串流媒體不同步,我可以告訴您向前跳過我正在玩。 哦,你也需要重新採樣,因為數據的採樣率是你的硬體無法直接支援的。在後一種情況下,PulseAudio 需要能夠向應用程式提供來自音訊設備的一些回饋,以正確確定音訊資料在任何給定時間實際播放的距離。
因此,PulseAudio 相當深入地參與藍牙音訊處理是有道理的:介入層越多,資料被緩衝而無法保持準確回饋的可能性就越大,從而導致口型同步丟失。
事實上,在 PulseAudio 出現之前,曾經有一個用於藍牙音訊的 ALSA 後端,但它已被棄用。我認為問題在於當時 ALSA 的介面主要是為傳統音效卡設計的,處理藍牙潛在可變的音訊延遲很困難。
PulseAudio 的介面是從頭開始設計的,可以處理各種聲音設備,甚至可以在播放串流時在它們之間切換音訊串流,所以在我看來,它也有一個非常先進的內建音訊延遲概念。
是的,它可以在 BlueZ 中實現,而不是作為 PulseAudio 模組;但是,BlueZ 必須為應用程式提供音訊介面。由於 PulseAudio 想要處理系統上的「所有」音訊(以便能夠將當前播放的音訊從揚聲器傳輸到藍牙,反之亦然),因此它必須與 PulseAudio 介面無論如何。
答案2
我想我終於找到了一個解決方案(在兩個 Linux Mint 系統上進行了測試),儘管我不知道為什麼我需要遵循這些確切的步驟:
初步步驟:
- 安裝藍人:須藤 apt-get 安裝 blueman
- 編輯藍牙檔:須藤納米 /etc/bluetooth/main.conf並在末尾添加這一行:禁用=耳機
對於每次運行:
- 重新啟動藍牙服務:sudo服務藍牙重啟
- 在系統托盤中開啟 blueman 中的設備或者類型藍人經理在終端
- 搜尋對於您的藍牙音訊設備
- 右鍵單擊您的裝置並連接為耳機
- 去聲音從系統設定
- 點擊一次選擇您的設備
- 現在再次轉到藍人經理
- 右鍵單擊您的藍牙裝置並將音訊設定檔設定為高傳真播放(A2DP接收器)
如果您錯過任何步驟,請轉到步驟 1,然後再試一次。讓我知道這是否奏效。
編輯:在 Linux Mint 19 中,預設的藍牙管理器與高傳真播放完美配合,根本不需要設定!
答案3
雖然它可能會因您的配置而異,但這裡有一些經過充分測試的命令。
您需要將設備設定為可信。可以透過 GUI 來完成。
sdp工具瀏覽將提供有關目標設備上可用協定和通道的許多詳細資訊。
使用同步音訊輸出時,設定藍牙 a2p 音訊接收器更容易,要設定它,請參閱工具帕普夫斯。
sudo apt install bluetooth
sudo apt install bluez bluez-tools
sudo apt install rfkill rfcomm
啟動設備,無論如何它應該是 hci0:
sudo hciconfig hci0 up
列出遠端設備:
sudo rfkill list
列出藍牙網路:
hcitool scan
瀏覽可用協定:
sdptool browse 43:23:00:02:23:A7
連接設備:
sudo rfcomm connect hci0 43:23:00:02:23:A7
發送文件:
sudo bt-obex -p 43:23:00:02:23:A7 ~/images/tof.png
接收文件:
sudo bt-obex -s /
掃描/等待通道(此處為通道 19)上的數據,並將數據寫入主資料夾中名為 dump 的檔案中:
sudo apt install bluez-hcidump
hcidump -i hci0 -O 19 -w ~/dump
替代方案:有時對於配對很有用:
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