如何通过蓝牙从一个安卓设备流式传输音频到另一个安卓设备?

26

2
  1. 几乎所有设备都支持A2DP,A2DP和HFP(免提)配置文件是手机所需的基本配置文件。
  2. Android 4.2.1在蓝牙上有音频流问题,这是一个杂乱无章的音频,在最新版本中得到了修复。
  3. 大多数人之前尝试过bluez(开源蓝牙)堆栈,但从JB开始,bluez被Broadcomm堆栈取代。您需要在手机中实现音频接收器配置文件。使用Alljoyn可以在两个设备之间进行音频流传输,请查看[链接](https://www.alljoyn.org/about/core-services)。
- ashish
感谢你提供的链接,@ashish。我会仔细阅读并告诉你结果的。再次感谢。 - Hardik Joshi
1
音频需要通过蓝牙进行流传吗?使用WiFi-Direct呢?这样做实际上会给您带来更多的灵活性和功能。 - BigMacAttack
@BigMacAttack,感谢您的回复。但我需要通过蓝牙进行流传输。 - Hardik Joshi
@Prince:你的进展如何?它有效吗? - John
@user8264 实际上,后来我离开了这些需求,客户将其搁置了。 - Hardik Joshi
5个回答

11
可以通过蓝牙进行音频流吗?
以下的帖子说在设备之间通过蓝牙进行音频流是可能的,但对其成功率存在疑问,直到Google官方宣布:我们已经解决了N7上的a2dp流媒体卡顿问题。下一个版本应该会修复。 对于问题感到抱歉。 4.2.2下A2DP质量差的修复方法 Galaxy Nexus升级到4.2后蓝牙音质受损 Nexus 7 Flo的Android 4.3蓝牙音频质量修复 每个Android设备都支持A2DP吗?
支持兼容性在Android开发者网站上提到,它从API Level-11开始添加相应功能。但我在XDA帖子中遇到了问题,OP提到在Android 2.1中存在问题,这意味着它也支持先前的API级别,但OP仍然面临问题。
希望这能让您理解,并建议参考XDA论坛获取有关A2DP兼容性及其成功的更多信息。

1
在我看来,如果A2DP不能正常工作,我们最好移动到更低的层次,我们可以创建一个基本流,用于发送任何形式的数据。我成功地通过蓝牙在J2ME设备之间发送了字节流。
如果在两个设备中都安装应用程序是可接受的,我有示例代码可以创建蓝牙服务器和客户端以通过套接字相互通信,一旦建立套接字,您就可以发送音频流:)
以下是一些核心代码:
1)服务器设备:
// you can generate your own UUID and use it as an port to eatablish a socket
private static final UUID MY_UUID = UUID.fromString("20687DAD-B023-F19E-2F60-A135554CC3FD")

BluetoothServerSocket serverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME_INSECURE, MY_UUID);

现在您已经拥有了ServerSocket,只需像普通的ServerSocket一样使用它即可:
BluetoothSocket socket = serverSocket.accept();

然后您可以从此BluetoothSocket获取InputStreamOutputStream,并像HttpConnection一样发送音频流。

2)客户端设备:

假设您已经获得了BluetoothDevice

// you should implement the method getBlutoothDevice
BluetoothDevice device = getBluetoothDevice();
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(MY_UUID_SECURE);

需要注意的是,普通的A2DP是通过L2CAP流传输的,其有效载荷大小比RFCOMM数据包要大得多。如果通过RFCOMM进行流传输,则由于有效载荷大小较小且涉及额外的层,会导致音频质量较差。 - TwinPrimesAreEz

1
您还可以通过基本的SCO连接流式传输音频,这不依赖于任何配置文件。但是,请注意,A2DP是专门用于流式传输音乐的配置文件。因此,与A2DP相比,您自己进行的任何实现都会在质量上受到影响。除非您将音乐流式传输到不支持A2DP的设备,否则我肯定会使用A2DP。实际上,您唯一的其他选择是使用SCO链接。

-1

尝试使用以下代码片段:

    public class AudioStream extends Activity {

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  String url = "http://www.example.mp3";
  MediaPlayer mp = new MediaPlayer();
  try {
   mp.setDataSource(url);
   mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
   mp.prepare();
   mp.start();
  } catch (Exception e) {
   Log.i("Exception", "Exception in streaming = " + e);
  }
 }
}

-1

这真的很难。但我做了很多研究并找到了一种方法。存在一些延迟、连接和根本性问题,但显然还是有效的。为此,您需要在服务器上安装“AirAudio”应用程序和“AllConnect”接收器。然后您打开主屏幕上的AirAudio,再打开AllConnect,在您的设备上按下,然后选择源并选择服务器,然后选择流式传输的mp3。问题是延迟非常大,另一个缺陷是要仅传输Android服务器系统的声音,您应该在手机上获得root权限...我还尝试过使用VLC作为流接收器,延迟较小,但仍然不太舒适。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接