Целый год решался сделать стриминг аудио со смартфонов/планшетов через BT непосредственно на LogitechMediaServer (squeezebox), чтобы на нем захватывать аудиопоток и раздавать на нужные мне плееры (squeezelite). К концу новогодних выходных 2020 года заморочился и, потратив 12 часов, нашел решение. Решение как оказалось уже давно найдено и при этом довольно простое -
https://forums.slimdevices.com/showthre ... t=bluealsa. Однако черт кроется в деталях)))
В общем, имею Raspberry Pi2 в качестве сервера LMS. В него воткнут донгл USB-Bluetooth V4.0 фирмы Ugreen.
1. Начну с того, что нужно взять и обновить систему до Raspbian на основе Debian Stretch или поставить систему с нуля. В этой версии нужные нам пакеты bluetooth и bluealsa (а также пакеты, идущие в зависимостях) уже доступны в сборке ОС и поэтому не надо ничего компилировать и собирать. Для Jessy, кстати, я попытался собрать bluealsa, но под этим скрывается очень много подводных камней...поэтому просто нужна свежая ОС!
2. После обновления системы нам нужно обратиться к утилите по настройке bluetooth:
И вот тут были небольшие танцы с бубном в отличие, например, от Armbian - BT контроллер по умолчанию не определен, поэтому нужно узнать его MAC-адрес и установить его по умолчанию.
2.1. Узнаем MAC-адрес BT донгла. Чтобы узнать адрес нужно ввести команду list - показывает все доступные контроллеры. Однако на Raspbian Stretch эта утилита мне ничего не показала... поэтому можно сделать выход quit и использовать другую утилиту, непосредственно работающую с шиной устройств:
Код: Выделить всё
$ hcitool dev
Devices:
hci0 00:1A:7D:DA:71:11
2.2. Устанавливаем BT контроллер по умолчанию для дальнейшей работы с ним. Для этого снова запускаем bluetoothctl и вводим команду select 00:1A:7D:DA:71:11
2.3. Включаем питание BT-контроллера, включаем обнаружение устройств, включаем агента соединений:
Код: Выделить всё
power on
discoverable on
agent on
default-agent
2.4. Если все в порядке, то включаем сканирование сети, соответственно, открываем настройки BT смартфона/планшета, чтобы они стали видимы в сети:
С тегом [NEW] будут появляться обнаруженные девайсы, например:
Код: Выделить всё
[NEW] Device DC:F7:56:DD:1D:6F Galaxy A50
[NEW] Device CC:61:E5:0E:EE:AA Lenovo P2
Скопировав себе MAC-адреса девайсов, выключаем сканирование устройств, а также дискаверинг:
2.5. Добавляем устройства в доверенные, спариваем их с контроллером BT и подключаем их к нему:
Код: Выделить всё
trust CC:61:E5:0E:EE:AA
pair CC:61:E5:0E:EE:AA //Тут на девайсе появится сообщение о необходимости спариться с вашим хостом
connect CC:61:E5:0E:EE:AA
Если у устройства статус "connect on" и он постоянен, то считаем что у нас все получилось!
3. Теперь нам нужна утилита bluealsa, позволяющая как захватывать аудиопоток (что нужно нам), так и вещать его на BT-устройство.
3.1. Прежде чем захватывать нужно чтобы bluealsa имела доступ к железу bluetooth поэтому в конфигурационном файле /etc/dbus-1/system.d/bluetooth.conf добавим разрешения. Открываем его с помощью nano для редактирования:
Код: Выделить всё
sudo nano /etc/dbus-1/system.d/bluetooth.conf
После раздела <policy user="root"> добавляем:
Код: Выделить всё
<policy user="bluealsa">
<allow send_destination="org.bluez"/>
</policy>
Сохраняем (ctrl+o) и выходим ctrl+x.
3.2. Проверяем захват аудио с устройства bluetooth в файл capture.wav с помощью пакета bluealsa (само собой смартфон/планшет должен быть подключен к настраиваемуму хосту и вещать на него музыку):
Код: Выделить всё
arecord -D bluealsa:HCI=hci0,DEV=CC:61:E5:0E:EE:AA,PROFILE=a2dp -d capture.wav
При проигрывании файла capture.wav любыми средствами (aplay, mdp, lms) должны услышать то аудио, которое передавали со смартфона)
4. Чтобы захватываемый аудиопоток вещать по сети на плееры squeezelite нужно в LMS установить плагин WaveInput и передать ему захватываемый по BT аудиопоток.
4.1. Устанавливаем плагин WaveInput - перейти в настройки LMS -> Подключаемые модули. Например, с помощью ctr+f найти слово wave и напротив плагина активировать чек-бокс. Внизу нажать кнопку применить.
4.2. А вот что делать дальше с плагином? Тут у меня был один из самых больших "подводных" камней, тем более один из плееров еще и завис, поэтому я много чего перепробовал. А оказывается все просто! Возвращаемся в основной веб-интерфейс LMS, в левом фрейме наступаем мышкой на Избранное и справа появится карандаш - нажимаем на него и проваливаемся в режим редактирования избранного. Нужно добавить новую запись: название, например, Wave Input (или название вашего смартфона/планшета) со свойством - wavein:bluealsa:HCI=hci0,DEV=CC:61:E5:0E:EE:AA,PROFILE=a2dp
- Wavin_bluealsa.jpg (31.5 КБ) 2172 просмотра
4.3. Теперь проверяем - на смартфоне/планшете запускаем трансляцию аудиопотока (я как любитель vk вещаю оттуда), выбираем нужный плеер в LMS и нажимаем play на нашей созданной в п.4.2 записи. В динамиках плеера должен появиться звук:)
- Wavin_bluealsa_Play.jpg (37.15 КБ) 2172 просмотра
Еще некоторые моменты, которые пытался реализовать, но ничего не вышло, например, создать локальную настройку alsa - sudo nano ~/.asoundrc и вписать туда:
Код: Выделить всё
defaults.bluealsa.service "org.bluealsa"
defaults.bluealsa.device "CC:61:E5:0E:EE:AA"
defaults.bluealsa.profile "a2dp"
defaults.bluealsa.delay 10000
Таким образом из CLI аудиопоток можем захватывать простой командой - arecord -D bluealsa capture.wav.
В asoundrc можно добавить и качество записи аудиопотока или просто указывать в команде, например, -f cd. Но момент в том, что плагин WaveInput не "переваривает" команду arecord -D bluealsa capture.wav. В общем, я не разобрался почему он не запускается с таким свойством...
Как итог: подключил два смартфона к своему LMS, сделав две записи в Избранном - Lenovo P2 и Samsung A50. Можно вещать с обоих смартфонов и нужный аудиопоток проигрывать на разных плеерах одновременно! А вот при попытке синхронизации плееров, при проигрывании одного и того же аудиопотока все накрывается "медным тазом", причем виснит как LMS так и плееры... приходится их перезапускать.
К слову, про LMS with mdmTerminal2: при перезапуске плееров mdmTerminal2 их теряет и не находит... нужно его тоже растартовать для сохранения плюшек такой интеграции. Написал разработчику mdmTerminal2, чтобы он поправил этот момент - интервалы подключения к LMS увеличены до 20 секунд (5 попыток = 80 секунд).