我正在尝试创建一个使用 Android 的 OpenSL ES 实现的实时通信应用程序(类似 SIP、类似 Skype 等)。
问题是,我需要通过通信播放一些 WAV 音频文件(我正在使用 Java 中的 MediaPlayer 执行此操作)。
当然,当 OpenSL ES 未运行时,媒体播放器可以正常工作。但是当它发生时,一切都变得混乱:结果在设备之间存在强烈的不一致。
- 在 Nexus 7 (4.2.2) 上:wav 可以正常播放
- 在 Nexus 4 (4.2.2) 和 Galaxy S3 (4.1.2) 上:wav 播放非常低(即使音量设置为最大值)
- 在 Galaxy S4 (4.2.2) 上:wav 播放非常响亮和饱和(即使音量设置为最小值)
我创建了一个示例项目来演示该问题,如果您在启动引擎之前播放声音(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 方面。