【问题标题】:How to stream audio from one Android device to another Android device Via Bluetooth?如何通过蓝牙将音频从一台 Android 设备流式传输到另一台 Android 设备?
【发布时间】:2013-05-23 06:25:17
【问题描述】:

是否可以通过蓝牙传输音频?在我的研究中,我发现只能使用A2DP(Advanced Audio Distribution Profile)。每个安卓设备都支持A2DP吗?如果没有,是否可以使用蓝牙在两个安卓设备之间传输音频?请帮助我理解这一点。

我浏览了以下链接:

【问题讨论】:

  • 1.几乎所有设备都支持 A2DP,A2DP 和 HFP(免提)配置文件是手机需要的基本配置文件。 2. Android 4.2.1 在蓝牙上有音频流问题,这是一个断断续续的音频,在最新版本中已根据谷歌修复。 3. 之前大部分人都尝试过bluez(开源蓝牙)stack,但是从JB开始,bluez被broadcomm stack取代。您需要在手机中实现音频接收器配置文件。使用 Alljoyn 可以在 2 个设备之间进行音频流传输,请查看 link
  • 感谢@ashish 的链接。我正在经历那个。并且会让你知道会发生什么。再次感谢。
  • 音频是否需要通过蓝牙传输?使用WiFi-Direct 怎么样?这实际上会给您更多的灵活性和功能。
  • @BigMacAttack 谢谢你的回复。但我需要通过蓝牙进行流式传输。
  • @Prince:你的进展如何?有用吗?

标签: android bluetooth audio-streaming android-bluetooth a2dp


【解决方案1】:

是否可以通过蓝牙传输音频?

下面的线程说它有可能在设备之间通过蓝牙流式传输音频,但在谷歌官方宣布We have fixed the a2dp streaming stutter problem on N7. The next release should have the fix. Sorry about the problem.之前,它的成功率一直存在问号

Fix for poor A2DP quality on 4.2.2

Bluetooth sound quality suffer after upgrade to 4.2 with Galaxy Nexus

Android 4.3 Bluetooth Audio Quality Fix for Nexus 7 Flo

所有安卓设备都支持A2DP吗?

Android developers site 上提到了支持兼容性,它是从API Level-11 with appropriate features. 添加的,但我遇到了XDA tread,其中 OP 在Android 2.1 中提到了问题,这意味着它也支持以前的 api 级别,但 OP 面临问题。

希望理解起来有意义,我建议您参考XDA forum 以获取有关 A2DP 兼容性及其成功的更多信息。

【讨论】:

    【解决方案2】:

    我的看法是,如果 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 流式传输将导致音频质量差
    【解决方案3】:

    您还可以通过不依赖于任何配置文件的基本 SCO 连接流式传输音频。但是,请注意 A2DP 是专为流媒体音乐开发的配置文件。因此,与 A2DP 相比,您自己制作的任何实现在质量上都会受到影响。

    除非您将音乐流式传输到不支持 A2DP 的设备,否则我肯定会使用 A2DP。实际上,您唯一的其他选择是使用 SCO 链接。

    【讨论】:

      【解决方案4】:

      尝试使用以下代码 sn-p:

          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);
        }
       }
      }
      

      【讨论】:

        【解决方案5】:

        真的很难做到。但是我做了很多研究并找到了方法。有几个延迟、连接和根问题,但显然有效。为此,您需要在服务器上安装“AirAudio”应用程序和“AllConnect”接收器。然后您在主屏幕上打开 AirAudio,然后打开 AllConnect,按您的设备,然后按来源并选择服务器,然后选择流式 mp3。问题是延迟非常大,另一个缺陷是只传输android服务器系统的声音,你应该在手机上拥有root权限......我还尝试了流媒体的接收器是VLC,更少延迟了,但还是很不舒服。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-11
          • 1970-01-01
          • 1970-01-01
          • 2013-02-05
          • 1970-01-01
          • 2013-01-19
          • 2018-02-06
          • 1970-01-01
          相关资源
          最近更新 更多