Receive audio via Bluetooth in Android
I want to create an Android application that is capable of receiving an audio stream. I thought of using the A2DP profile, but is seems as if Android doesn’t support A2DP sink. Looks like there are a lot of people that’s searching for a solution for this problem. But what about receiving an ordinary bit stream, and then convert the data into audio in the application? I was thinking of receiving an PCM or Mp3 data stream via the RFCOMM (SPP Bluetooth profile), and then play it using AudioTrack. First, how do I receive a bit stream on my Android phone via the RFCOMM? And is it possible to receive a bit stream via RFCOMM as a PCM or Mp3 stream? Second, if it isn’t possible to receive a bit stream via RFCOMM as a PCM or Mp3 stream, how do I convert the received bit stream into audio? Third, how do I convert the received data into audio AND play the audio simultaneously, in «real time»? Can I just use onDataReceived? To be clear, I’m not interested of using the A2DP profile! I want to stream the data via the RFCOMM (SPP Bluetooth profile). The received data stream will be in PCM or Mp3. I thought of writing my own app, but if anyone knows of an app to solve this I’d be glad to hear about it! I’m using Android 2.3 Gingerbread. /Johnny
5 Answers 5
No. Trying to write an Android application that handles this will not be the solution. At least if you want to use A2DP Sink role.
The fact is that Android, as you mentioned it, does not implement the API calls to BlueZ (the bluetooth stack Android uses till Jelly Bean 4.1) regarding A2DP sink capabilities. You have to implement them yourself. I will try to guide you, as I was also interested in doing this my self in the near past.
Your bluetooth-enabled Android device is advertising itself as an A2DP source device by default. You have to change this first, so nearby devices may recognize your device as a sink. To do this, you must modify the audio.conf file (usally located in /etc/bluetooth/) and make sure the Enable key exists and the value Source is attached to this key, so you will get something like :
Reboot, nearby devices should now recognize your device as an A2DP sink .
Now you will have to interact with BlueZ to react appropriately when an A2DP source device will start to stream audio to your phone.
Android and BlueZ are talking to each other via D-BUS . In fact, Android connects to the DBUS_SYSTEM channel and listens to every BlueZ advertisement, such as events, file descriptors .
I remember having successfully bound my self using a native application to this d-bus channel and got access to the various events BlueZ was posting. This is relatively easy to achieve using as reference, the BlueZ API available here. If you go this way, you will have to build a native application (C/C++) and compile it for your platform. You must be able to do this using the Android NDK .
If you find it difficult to use D-BUS , you can try this Java library I just found that handles the communication to D-BUS for you : http://jbluez.sourceforge.net/. I have never used it but it is worth a try in my opinion.
What you really have to do is find out when an A2DP source device is paired to your phone and when he starts to stream music. You can retrieve these events through D-BUS. Once somebody will try to stream music, you need to tell BlueZ that your native application is going to handle it. There is a pretty good document that explains the flow of events that you should handle to do this. This document is accessible here. The part you’re interested in comes on page 7. The sink application in the given example is PulseAudio but it could be your application as well.
BlueZ will forward you a UNIX socket when you will call the org.bluez.MediaTransport.Acquire method. Reading on this socket will give you the data that are currently streamed by the remote device. But I remember having been told by a guy working on the BlueZ stack that the data read on this socket are not PCM pure audio, but encoded audio content instead. The data are generally encoded in a format called SBC (Low Complexity Subband Coding).
Decoding SBC is not very difficult, you can find a decoder right here.
The ultimate step would be to forward the PCM audio to your speakers.
To prevent you from getting stuck and in order to test your application in an easier manner, you can use the d-bus binary that should be available on your Android system. He is located in /system/bin.
Quick tests you can make before doing anything of the above might be :
Get Devices list :
dbus-send —system —dest=org.bluez —print-reply / org.bluez.Manager.GetProperties
This returns an array of adapters with their paths. Once you have these path(s) you can retrieve the list of all the bluetooth devices paired with your adapter(s).
Get paired devices :
dbus-send —system —print-reply —dest=org.bluez /org/bluez//hci0 org.bluez.Adapter.GetProperties
This gives you the list of paired devices whithin the Devices array field.
Once you have the list of devices paired to your Bluetooth Adapter, you can know if it is connected to the AudioSource interface.
Get the devices connected to the AudioSource interface :
dbus-send —system —print-reply —dest=org.bluez /org/bluez//hci0/dev_XX_XX_XX_XX_XX_XX org.bluez.AudioSource.GetProperties org.bluez.Manager.GetProperties
Как изменить аудиокодек Bluetooth на Android
Хотите улучшить качество звука в беспроводных наушниках, подключенных к смартфону на базе Android? Чуть ниже мы расскажем, что делать.
Бесспорно, Bluetooth-наушники невероятно удобные, однако они не могут сравниться с проводными аналогами в плане качества звука. Поэтому покупателям всегда приходится выбирать между удобством и звучанием.
К счастью, звук на беспроводных наушниках можно настроить за счет изменения аудиокодека на используемом девайсе. Чуть ниже мы расскажем о различных аудиокодеках, доступных на устройствах на базе Android, а также о том, как их изменить.
Почему стоит изменить аудиокодек Bluetooth
Используемый кодек зависит от того, что именно вы прослушиваете на своих беспроводных наушниках:
- Если вы хотите слушать музыку Hi-Fi, то нужно установить кодек, обеспечивающий превосходное качество звука.
- Для звонков нужен кодек, выдающий стабильное звучание. Это касается и фильмов, поскольку при просмотре аудио и видео должны идеально синхронизироваться, что требует кодека с малой задержкой.
Беспроводные наушники – явление достаточно новое (если сравнивать с проводными аналогами), из-за чего не существует идеального кодека, который всегда обеспечивал бы высокое качество звука и минимальную задержку.
Именно поэтому стоит подумать об изменении дефолтного аудиокодека Bluetooth в соответствии с типом прослушиваемой музыки и мощностью сигнала.
Изменение кодека поможет выжать из Bluetooth-наушников максимум, но не стоит забывать, что кодек будет работать только в том случае, если наушники совместимы с ним.
Самые популярные кодеки
Прежде чем узнать, как изменить стандартный кодек на смартфоне, важно разобраться, какие типы кодеков существуют, а также с тем, какой из них лучше всего подходит для той или иной цели.
SBC
SBC (аббревиатура от Low Complexity Sub-band Coding) – наиболее распространенный кодек. Он установлен на всех аудиоустройствах на базе Android, поддерживающих A2DP (Advanced Audio Distribution Profile) — расширенный профиль передачи аудио.
SBC – это что-то вроде базовой версии всех аудиокодеков. Он предлагает довольно-таки посредственное качество звука и потребляет гораздо меньше энергии.
Он не способен выдавать высококлассный звук и имеет более высокую задержку по сравнению с другими кодеками нашего списка.
Кодек подойдет для обычных пользователей, не сильно заботящихся о высоком качестве звука. Но для игр или просмотра фильмов нужно выбрать что-то другое, поскольку у SBC довольно-таки высокая задержка.
aptX
Qualcomm aptX — это целое семейство кодеков, в которое входят 7 различных версий.
aptX использует адаптивную дифференциальную импульсно-кодовую модуляцию (ADPCM), которая выдает гораздо лучшее качество звука, чем SBC.
На Android-устройствах чаще всего встречаются 3 вариации aptX:
- aptX: лучшая альтернатива SBC, но всё еще не подойдет тем, кому нужен звук с минимальными потерями.
- aptX HD: значительное улучшение по сравнению с оригинальной версией, так как качество звука намного лучше, а звук воспроизводится с минимальной задержкой. aptX HD отлично подойдет для прослушивания Hi-Fi аудио и просмотра фильмов.
- aptX Adaptive: динамически меняет битрейт для более стабильного соединения. Кодек отлично подходит практически для всего: от игр до звонков и просмотра видео. Но среди всех трех опций именно aptX HD выдает лучшее качество звука.
AAC
AAC, сокращенно от Advanced Audio Codec, очень похож на SBC. Он потребляет больше энергии, несмотря на то что воспроизводит звук с потерями. AAC обычно используется в устройствах от компании Apple, поскольку iOS оптимизирована для использования именно этого кодека.
Если же говорить об Android, AAC – последний вариант, который стоит использовать только в том случае, если все другие кодеки несовместимы с вашими наушниками.
AAC не подходит для игр и высококлассного аудио, но для обычного прослушивания музыки кодека более чем достаточно.
LDAC
LDAC, разработанный южнокорейской компанией Sony, похож на aptX Adaptive. Главное отличие заключается в том, что второй автоматически настраивается в зависимости от уровня сигнала, а первый – переключается между тремя предустановленными битрейтами.
LDAC – высококлассный аудиокодек для настоящих ценителей звука, у которого есть лишь один недостаток – очень слабое качество соединения.
Среди плюсов же стоит выделить низкую задержку, благодаря которой кодек отлично подходят для игр и просмотра видео.
LHDC
LHDC, сокращенно от Low-Latency and High-Definition Audio Codec (букв. перевод – кодек высокого разрешения с низкими задержками), был разработан в сотрудничестве Hi-Res Wireless Audio (HWA) и Savitech.
Кодек предназначен для настоящих аудиофилов, поскольку выдает высочайшее качество звука и минимизирует задержку, благодаря чему LHDC отлично подходит для прослушивания Hi-Fi музыки, просмотра видео и игр.
Как изменить аудиокодек Bluetooth на Android
После того, как вы определились, какой кодек хотите использовать, и какой из них совместим с наушниками и поддерживается смартфоном, можно приступить к его изменению.
Отметим, что на телефоне должна быть установлена версия Android 8.0 или новее.
- Откройте меню «Настройки» на смартфоне.
- Перейдите к разделу «Система», а затем «Для разработчиков».
- Нажмите на пункт «Аудиокодек Bluetooth».
- Выберите подходящую опцию.
Помимо кодеков из списка, вы можете установить на свое устройство новые. Чтобы включить или отключить их, нужно нажать на «Включить/выключить опциональные кодеки».
За хорошее качество звука нужно бороться
Несмотря на то, что беспроводная технология еще не достигла своего апогея и пока не способна на равных конкурировать с проводным аналогом, вы все равно можете улучшить качество звука и уменьшить задержку за счет изменения стандартного аудиокодека Bluetooth.
Каждый кодек имеет свои преимущества и недостатки, но среди всех вариантов aptX Adaptive и LDAC наиболее близки к идеалу.