Android OpenSL ES+;MediaPlayer:使用语音流时跨设备的行为非常不一致

Android OpenSL ES+;MediaPlayer:使用语音流时跨设备的行为非常不一致,android,android-audiorecord,opensl,Android,Android Audiorecord,Opensl,我正在尝试创建一个使用Android的OpenSL ES实现的实时通信应用程序(类似SIP、类似Skype等) 问题是,我需要在通信中播放一些WAV音频文件(我使用Java中的MediaPlayer进行此操作) 当然,当OpenSL ES未运行时,mediaplayer工作正常。但当它出现时,所有的麻烦都被打破了:结果在不同的设备上是非常不一致的 在Nexus7(4.2.2)上:wav按其应有的方式播放 在Nexus4(4.2.2)和GalaxyS3(4.1.2)上:wav播放非常低(即使在音

我正在尝试创建一个使用Android的OpenSL ES实现的实时通信应用程序(类似SIP、类似Skype等)

问题是,我需要在通信中播放一些WAV音频文件(我使用Java中的MediaPlayer进行此操作)

当然,当OpenSL ES未运行时,mediaplayer工作正常。但当它出现时,所有的麻烦都被打破了:结果在不同的设备上是非常不一致的

  • 在Nexus7(4.2.2)上:wav按其应有的方式播放
  • 在Nexus4(4.2.2)和GalaxyS3(4.1.2)上:wav播放非常低(即使在音量设置为最大值时)
  • 在星系S4(4.2.2)上:wav播放得非常响亮且饱和(即使在音量设置为最小值时)
我创建了一个示例来演示这个问题,如果在启动发动机之前播放声音(pWeet按钮),它会工作。如果在之后播放,则取决于设备

以下是我的观察结果:

  • 在OpenSL ES中,如果只有播放机或录音机工作,则一切正常。是播放器和录像机的组合造成了这个bug(在MainActivity.java中,只需注释StartPlayer()[l.47]或StartRecorder()[l.48]就可以看到)
  • 如果我禁用播放器排队(在Audio.cpp中,comment(*playerBufferQueue)->Enqueue[l.78-80]),一切正常
  • 如果我没有将OpenSL ES设置为在语音流上播放(在Audio.cpp中,comment(*playerConfig)->SetConfiguration[l.146-187]),则一切正常
当然,上面没有什么是一个解决方案,因为我需要

  • 从OpenSL ES录制作为语音通信
  • 在语音流中从OpenSL ES播放
  • 从媒体流中的MediaPlayer播放
……所有这些都是同时发生的


最后,我应该指出,在Galaxy S4中,当我将从网络接收到的帧排队时,OpenSL ES播放的声音太大,饱和,应用程序无法使用。因此,我认为问题不在MediaPlayer Java方面。

多亏了Michael comment,我通过在_通信中设置音频模式解决了我的问题。

只是一些澄清:WAV音频是本地播放的(即不发送给另一方)?您使用的是哪种音频模式(正常、通话中、通话中)?您是否启用了扬声器模式?如果启用了扬声器模式,如果连接了有线耳机,行为是否会改变?是的,WAV音频将在本地播放。我没有启用任何音频模式。我将使用耳机进行测试并与您保持联系。好的,我已将音频模式设置为_通信,并且。。。它解决了它:)非常感谢!