当前位置: 首页 > 知识库问答 >
问题:

在Android中通过蓝牙接收音频

席安康
2023-03-14

我想创建一个能够接收音频流的Android应用程序。我曾想过使用A2DP配置文件,但似乎Android不支持A2DP接收器。看起来有很多人在寻找这个问题的解决方案。但是,如果接收一个普通的位流,然后在应用程序中将数据转换成音频呢?我想通过RFCOMM(SPP蓝牙模式)接收PCM或Mp3数据流,然后使用AudioTrack播放。

首先,我如何通过RFCOMM在我的Android手机上接收比特流?是否可以通过RFCOMM接收位流作为PCM或Mp3流?

其次,如果无法通过RFCOMM接收比特流作为PCM或Mp3流,如何将接收到的比特流转换为音频?

第三,如何将接收到的数据转换为音频,并“实时”同时播放音频?我可以用onDataReceived吗?

明确地说,我对使用A2DP配置文件不感兴趣!我想通过RFCOMM(SPP蓝牙配置文件)流式传输数据。接收到的数据流将在PCM或Mp3中。我想写我自己的应用程序,但如果有人知道解决这个问题的应用程序,我很高兴听到它!我正在使用Android 2.3姜饼。

/约翰尼

共有3个答案

洪浩波
2023-03-14

[不相关但有效]该黑客仅通过WIFI热点提供mp3流媒体服务(我在只有AUX输入的车上使用):

  1. 安装应用程序AirSong,
  2. 打开wifi热点,
  3. 将其他设备连接到该热点,
  4. 从设备的浏览器访问192.168.43.1:8088,您就打开了。

(不知道为什么只有“192.168.43.1”?因为这是任何连接到Android Hotspot的设备的默认网关)

应和悦
2023-03-14

另一个解决方法是使用免提模式

在Android系统中,蓝牙耳机(BluetoothHeadset)正致力于此。等待状态更改为BluetoothHeadset。STATE\u AUDIO\u已连接。

然后您可以从蓝牙耳机录制音频。

    mMediaRecorder = new MediaRecorder();
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    mMediaRecorder.setOutputFile(mFilename);
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    try {
        mMediaRecorder.prepare();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    mMediaRecorder.start();
童宏富
2023-03-14

不。尝试编写一个处理这个问题的Android应用程序并不是解决方案。至少如果您想使用A2DP接收器角色。

事实上,正如你所提到的,Android没有实现对BlueZ的API调用(Android在Jelly Bean 4.1之前使用的蓝牙堆栈),这与A2DP接收器的功能有关。你必须自己实现它们。我会尽力引导你们,因为我在不久的过去也对自己做这件事感兴趣。

默认情况下,支持蓝牙功能的Android设备将自己作为A2DP源设备进行宣传。您必须先更改此设置,以便附近的设备可能会将您的设备识别为接收器。为此,必须修改音频。conf文件(通常位于/etc/bluetooth/)并确保存在“启用”键,并且该键附带了值“源”,因此您将得到如下结果:

Enable=Source

重新启动后,附近的设备现在应该会将您的设备识别为A2DP接收器。

现在,当A2DP源设备开始将音频流传输到您的手机时,您必须与BlueZ进行交互,以做出适当的反应。

Android和BlueZ正在通过D-BUS相互交谈。事实上,Android连接到DBUS_SYSTEM频道并收听每个BlueZ广告,例如事件、文件描述符...

我记得我使用本机应用程序成功地将自己绑定到这个d总线通道,并访问了BlueZ发布的各种事件。作为参考,这里提供的BlueZ API相对容易实现。如果您这样做,您将不得不构建一个本机应用程序(C/C),并为您的平台编译它。您必须能够使用Android NDK实现这一点。

如果您发现难以使用D-BUS,可以尝试我刚刚找到的Java库,它为您处理与D-BUS的通信:http://jbluez.sourceforge.net/.我从未使用过它,但在我看来值得一试。

您真正要做的是找出A2DP源设备何时与您的手机配对,以及他何时开始流式传输音乐。您可以通过D-BUS检索这些事件。一旦有人尝试流式传输音乐,您需要告诉BlueZ您的本机应用程序将处理它。有一个非常好的文档解释了您应该处理的事件流。此文档可在此处访问。您感兴趣的部分位于第7页。给定示例中的接收器应用程序是PulseAudio,但它也可能是您的应用程序。

当您调用org时,BlueZ将向您转发一个UNIX套接字。布鲁兹。媒体传输。获取方法。读取此套接字将为您提供远程设备当前传输的数据。但我记得有一个在BlueZ堆栈上工作的人告诉我,在这个套接字上读取的数据不是PCM纯音频,而是编码音频内容。数据通常以称为SBC(低复杂度子带编码)的格式进行编码。

解码SBC不是很难,你可以在这里找到一个解码器。

最终的步骤是将PCM音频转发到扬声器。

为了防止您陷入困境,并以更轻松的方式测试应用程序,您可以使用Android系统上应该提供的d-bus二进制文件。他位于/system/bin。

执行上述任何操作之前,您可以进行快速测试:

获取设备列表:

dbus send—system—dest=org。bluez——打印回复/组织。布鲁兹。经理获取属性

这将返回一个适配器数组及其路径。一旦您有了这些路径,您就可以检索与您的适配器配对的所有蓝牙设备的列表。

获取配对设备:

dbus-send--system--print-reage--est=org.bluez /org/bluez/{pid}/hci0org.bluez.适配器

这将在设备阵列字段中显示配对设备的列表。

一旦您将设备列表配对到蓝牙适配器,您就可以知道它是否连接到音频源接口。

将设备连接到音频源接口:

dbus-send--system--print-reage--est=org.bluez /org/bluez/{pid}/hci0/dev_XX_XX_XX_XX_XX_XXorg.bluez.AudioSource. GetPropertiesorg.bluez.管理器. GetProperties

希望这有帮助。

 类似资料:
  • 我写了一个通过蓝牙发送/接收文件的应用程序,但我想把这个应用程序设置为默认的应用程序发送和接收文件! 移动设备向我的手机发送文件时的说明;我的应用程序获取文件,并与它一起工作之后,保存在我想要的时间和地点。

  • 我想知道我们是否可以将2个蓝牙设备连接到Android设备,并在Android中实时共享数据?i、 e我有一个传感器连接到Android设备,我想流式传输或收听或广播从传感器接收到的数据到耳机(连接到同一个Android设备)。在Android中可能吗??请提出建议。提前谢谢。 我想通过经典蓝牙收听音频流。有可能把Android设备变成接收器吗?目前,我们使用HFP模式和经典蓝牙进行通信。 场景:

  • 我正试图通过蓝牙将数据从一台设备传输到另一台设备。 我之前曾尝试在android网站上运行bluetoothChat示例代码,但没有成功。 现在,我继续研究我发现的这段代码,虽然它在我的设备上编译,但它们之间没有连接。 有人看到下面的代码有什么问题吗?如果有人知道android上蓝牙的一些好资源,如果他们能与我分享,我将不胜感激!

  • 我正在尝试从与Android设备配对的蓝牙耳机中捕获音频。 以下是相关代码: 清单要求权限: WRITE_EXTERNAL_STORAGE RECORD_AUDIO 互联网 MODIFY_AUDIO_SETTINGS BROADCAST_STICKY 蓝牙 BLUETOOTH_ADMIN 每个应用程序的典型过滤LogCat输出是: 初始化BT 启动蓝牙 BT可以从麦克风录音吗?true 一切初始化

  • Hy,我们正在通过蓝牙开发android多人游戏。这是一款多人LUDO游戏,其中4名玩家相互连接并进行游戏。 我们被困在第三和第四名球员的连接。 上面是建立连接的示例代码。但是在连接服务类中,我们有以下代码 当移动设备连接到第三个或第四个设备时,它返回myBSock==null。但是如果代码正常工作,它必须返回设备的地址,并且应该将mBtDeviceAddresses.add(设备);添加到服务器

  • 我想知道android蓝牙通信的通信方式是什么。我的代码基本上遵循这里的开发者指南:http://developer.android.com/guide/topics/connectivity/bluetooth.html如果我按照本指南从设备中读取/写入数据?通信类型是什么?我在网上搜索了一下,它看起来像是串口通信,RS 232。这是正确的吗? 非常感谢。