
Я новичок в Linux и новичок в написании скриптов Bluetooth. Пока что я обнаружил следующее:
- Bluez — это стек BT по умолчанию.
- BluezTools — это набор утилит, которые можно использовать для более легкого взаимодействия с Bluez.
- DBus — это интерфейс, к которому подключается Bluez, взаимодействуя напрямую с оборудованием.
- PulseAudio — это подсистема, отвечающая за воспроизведение звука в системе.
Это имеет смысл. Допустим, у меня есть пара наушников BlueTooth, и я ожидаю (после сопряжения и доверия) возможности отправить команду, которая может напрямую подключиться к определенному профилю на наушниках BT.
Технический путь, который я имею в виду, будет выглядеть примерно так:
- Включите наушники.
- Выполните команду BluezTools, например:bt-audio -c
- Подождите, пока устройство подключится к нужной мне услуге.
- Теперь PulseAudio должен выбрать новое выходное устройство.
- Введите еще одну команду, чтобы изменить прежний звук на новый выходной звук (наушники BT).
- Наслаждайтесь безупречным прослушиванием.
Все это кажется логичным, но фактическая реализация не такая, и я ищу ПОЧЕМУ, чтобы лучше понять проблему и попытаться ее исправить.
Вот что происходит на самом деле:
- Включите наушники.
- Выполните команду BluezTools, например:bt-audio -c
- Подождите, пока устройство подключится к нужной мне услуге.
- Теперь PulseAudio должен выбрать новое выходное устройство.
- Введите команду PulseAudio, чтобы изменить профиль звука с телефонного качества на высококачественный.
Позвольте мне немного расширить эту тему. Гарнитура Bluetooth предлагает 2 режима качества (телефон и высокая точность). Только 1 действительно подходит для прослушивания музыки.
Я бы ожидал, что наушники BT выставляют каждый режим качества как услугу, это верно? Это предположение может быть неверным, но я бы ожидал что-то вроде
bt-audio -c highFidelityProfile
или
bt-audio -changeProfilehighFidelityProfile
Вместо этого, похоже, Bluez просто обрабатывает RAW-подключение к устройству, и оттуда вам нужно выполнить:pacmd set-card-profile $INDEX a2dp
Это просто кажется в корне неверным. Почему контроль качества находится в аудиоподсистеме, поэтому требуется другая реализация для Pulse или Alsa, или любой другой звуковой подсистемы?
Что я упускаю? Почему невозможно напрямую подключиться к определенному профилю с помощью Bluez / BluezTools и т. д.?
решение1
Bluetooth-соединение имеет значительную задержку по сравнению с простыми проводными наушниками или динамиками. Более того, задержка соединения может варьироваться в зависимости от свойств приемника Bluetooth и, возможно, даже от силы радиосигнала при перемещении пользователя.
Интерфейс между приложением и PulseAudio может быть таким же простым, как «вот аудиоданные PCM; воспроизведите это». Но он может быть и более сложным, например: «Вот аудиоданные PCM; воспроизведите это и каждые 50 мс сообщайте мне, насколько далеко вы продвинулись, чтобы я мог сказать вам, чтобы вы перешли вперед, если вам покажется, что вы рассинхронизировались с видеопотоком, который я воспроизводлю. О, и вам также нужно будет передискретизировать его, поскольку данные имеют частоту дискретизации, которую ваше оборудование не будет напрямую поддерживать». В последнем случае PulseAudio должен иметь возможность предоставить приложению некоторую обратную связь от аудиоустройства, чтобы правильно определить, насколько далеко фактически воспроизводятся аудиоданные в любой момент времени.
В результате PulseAudio имеет смысл достаточно глубоко вовлекаться в обработку звука Bluetooth: чем больше промежуточных слоев, тем больше вероятность буферизации данных без поддержания точной обратной связи, что приводит к потере синхронизации губ.
На самом деле, до появления PulseAudio существовал бэкэнд ALSA для аудио Bluetooth, но он был устарел. Я думаю, проблема была в том, что интерфейсы ALSA в то время были разработаны в основном для традиционных звуковых карт, и иметь дело с потенциально переменной задержкой звука Bluetooth было сложно.
Интерфейсы PulseAudio были разработаны с нуля для работы с различными звуковыми устройствами и даже для переключения аудиопотоков между ними во время воспроизведения потока, поэтому мне кажется, что в него встроена довольно продвинутая концепция задержки звука.
Да, это можно было бы реализовать в BlueZ, а не как модуль PulseAudio; но тогда BlueZ пришлось бы предоставить аудиоинтерфейс для приложений. И поскольку PulseAudio хочет обрабатывать "все" аудио в системе (чтобы иметь возможность передавать аудио, которое вы в данный момент воспроизводите с динамиков на Bluetooth или наоборот на лету), ему в любом случае пришлось бы как-то взаимодействовать с PulseAudio.
решение2
Думаю, я наконец-то нашел решение (проверено на двух системах Linux Mint), хотя понятия не имею, зачем мне нужно выполнять именно эти шаги:
Начальные шаги:
- Установить blueman:sudo apt-get установить blueman
- Редактировать файл Bluetooth:sudo nano /etc/bluetooth/main.confи добавьте эту строку в конец:Отключить=Гарнитура
Для каждого запуска:
- Перезапустите службу Bluetooth:sudo служба bluetooth перезапуск
- Откройте Устройства из blueman в системном трееилитипblueman-менеджерв терминале
- Поискдля вашего аудиоустройства Bluetooth
- Щелкните правой кнопкой мыши свое устройство и подключитесь какгарнитура
- Идти кзвукиз системных настроек
- Выберите свое устройство, щелкнув по нему один раз.
- Теперь снова идем кblueman-менеджер
- Щелкните правой кнопкой мыши по устройству Bluetooth и установите для параметра «Аудиопрофиль» значениеВысококачественное воспроизведение (A2DP Sink)
Если вы пропустили какой-либо из шагов, перейдите к шагу 1 и попробуйте снова. Дайте мне знать, если это сработает.
Редактировать: В Linux Mint 19 менеджер Bluetooth по умолчанию отлично работает с воспроизведением High Fidelity, настройка вообще не требуется!!
решение3
Хотя это может зависеть от вашей конфигурации, вот несколько хорошо проверенных команд.
Вам необходимо установить устройство как доверенное. Это можно сделать через графический интерфейс.
sdptool просмотрпредоставит подробную информацию о доступных протоколах и каналах на целевом устройстве.
Проще настроить аудиоприемник Bluetooth A2P при использовании одновременных аудиовыходов, для его настройки см. инструментpaprefs.
sudo apt install bluetooth
sudo apt install bluez bluez-tools
sudo apt install rfkill rfcomm
Запустите устройство, в любом случае это должно быть hci0:
sudo hciconfig hci0 up
Список удаленных устройств:
sudo rfkill list
Список сетей Bluetooth:
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