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

时间:2013-07-29 14:10:18

标签: android android-audiorecord opensl

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

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

当然,当OpenSL ES未运行时,mediaplayer工作正常。但是当它出现时,一切都会崩溃:结果在各个设备之间存在很大的不一致。

  • On Nexus 7(4.2.2):wav按原样播放
  • On Nexus 4(4.2.2)& Galaxy S3(4.1.2):wav播放率非常低(即使音量设置达到最大值)
  • 在Galaxy S4(4.2.2):wav播放非常响亮和饱和(即使音量设置最小)

我创建了一个example project来演示这个问题,如果你在启动引擎之前播放声音(pweeet按钮),它就可以了。如果您之后播放,则取决于设备。

以下是我的观察:

  • 在OpenSL ES中,如果只有播放器或录音机工作,一切都按预期工作。这是播放器和播放器的结合。产生错误的记录器(在MainActivity.java中,只需注释StartPlayer()[l.47]或StartRecorder()[l.48]即可查看)。
  • 如果我禁用播放器入队(在Audio.cpp中,注释(* playerBufferQueue) - > Enqueue [l.78-80]),一切都按预期工作。
  • 如果我没有将OpenSL ES设置为在语音流上播放(在Audio.cpp中,评论(* playerConfig) - > SetConfiguration [l.146-187]),一切都按预期工作。

当然,上面的任何内容都不是我需要的解决方案......

  • 从OpenSL ES录制为语音通信
  • 在语音流中播放OpenSL ES
  • 在媒体流中播放MediaPlayer

......所有这些都在同一时间。

最后,我应该指出,在Galaxy S4中,当我将从网络收到的帧排队时,OpenSL ES会播放它如此响亮且饱和,以至于应用程序无法使用。所以我认为这个问题不在MediaPlayer Java方面。

1 个答案:

答案 0 :(得分:0)

感谢Michael的评论,我通过设置音频模式IN_COMMUNICATION解决了我的问题。