项目里面要做语音交流的部分,把其中遇到的问题记录下来。单拿android和iOS录音来说都没什么问题,android和iOS都有各自支持的语音格式,但是要做语音交互的时候就遇到各种蛋碎的事情了。
网上查找说有三种方案供选择
第一种方案对于服务器负荷较大,不论是安卓端亦或是IOS端都将音频传输到服务器,通过服务器进行转换再进行转发。这种做法可以不受系统限制,但是信息量较大时对服务器负荷较大,对服务器端的要求很高。据传闻,微信就是采用这种方式进行的语音IM交互
第二种方案是不论IOS端还是安卓端都统一使用相同的第三方音频库进行编解码处理,然后再进行网络传输,优点是可供选择的音频库非常多,可以根据自己不同的需求选择各种各样的音频格式,但是因为不论是IOS端还是安卓端都需要对其进行i编码解码处理,而项目初期并没有设计这方面的需求所以如果双端都进行修改修改量实在太大。同样据传闻,同为语音IM的成熟案例微米就是依靠Speex的三方开源库来完成的,这种格式体积小,能降噪,是目前比较受推崇的方式。
第三种方案就是amr格式的音频文件是安卓系统中默认的录音文件,IOS系统曾经是支持这种格式的文件,自4.3以后才取消了对amr的支持,那我们只需要在IOS端转换出安卓端可以使用的amr文件就可以语音交互了,最后只需考虑在iOS端录的wav格式与amr格式的互转即可。
其实最开始我们项目也没考虑这种转语音格式,在网上查找得知也是有两种语音格式是android/iOS都支持的,aac以及pcm格式。
AAC:压缩,数据量小
PCM:接近无损,音频数据量大
最后我们选择aac格式。
lua中
function audioRecordUtils(value)
if value == true then
if device.platform == "android" then
local args = { 2 , 3}
local sigs = "(II)I"
local luaj = require "cocos.cocos2d.luaj"
local className = "com/cocos2dx/sample/LuaJavaBridge"
local ok,ret = luaj.callStaticMethod(className,"sendLuaToJavaAudioRecordStart",args,sigs)--开始录音
if not