使用腾讯语音聊天SDK没有3D音效问题
问题现象:
手机和手机间使用腾讯语音聊天SDK demo进行语音会话测试,分别调整两台手机DEMO 应用界面上的X值,对方听到的声音3D音效功能正常
手机和Alien一体机使用腾讯语音聊天SDK demo进行语音会话测试,分别调整Alien和手机的demo应用界面上的X值,Alien一体机听到的声音没有3D音效,手机中听到的声音有3D音效
手机和Alien pro一体机使用腾讯语音聊天SDK demo进行语音会话测试,分别调整Alien pro和手机的demo应用界面上的X值,Alien pro一体机听到的声音有3D音效,手机中听到的声音有3D音效
问题分析:
3D音效实现原理是声音在两个声道上差异虚拟出来的结果,一般的手机SPEAKER都是单声道的,耳机通路是双声道的。单声道Speaker通路无法实现3D音效,因此一般3D 音效sdk算法都会根据当前声音播放通路进行选择是否输出3D效果
根据sdk中的log打印以及以往处理三方聊天问题经验,应该是不同设备在audio 通路上的不同导致现象不同,Alien一体机的声音播放设备是接到了speaker上,APP层通过API拿到的结果都是speaker audio route,不会是headset 或headphone audio route; Alien pro一体机的声音播放设备外接到了line上,App层通过APP拿到的结果会是headphone audio route,因此从理论上可以解释Alien pro与Alien设备现象
由于腾讯SDK代码是不开放的,SDK肯定是通过Android的API获取的当前播放通路信息,通过在Android audio API上加log信息进行debug.比如:AudioManager中public boolean isWiredHeadsetOn() 和public int getDevicesForStream(int streamType) 。 经过验证,腾讯SDK是使用 isWiredHeadsetOn() 接口进行audio route 状态判断,经过修改API的返回状态,Alien 设备上腾讯SDK可以进行正常工作,现象和手机相同
解决方案:
public boolean isWiredHeadsetOn() {
if (AudioSystem.getDeviceConnectionState(DEVICE_OUT_WIRED_HEADSET,"")
== AudioSystem.DEVICE_STATE_UNAVAILABLE &&
AudioSystem.getDeviceConnectionState(DEVICE_OUT_WIRED_HEADPHONE,"")
== AudioSystem.DEVICE_STATE_UNAVAILABLE) {
//return false;
//Alien has no speaker
return true;
} else {
return true;
}
}