这几天公司做了一个即时通讯的简单聊天软件,要求可以收发文子、图片、语音。由于公司缺乏socket相关方面的人才,考虑到开发周期,公司最后决定用http定时发送请求的方式实现消息的接受,这种方法虽然不太科学,但是勉强能用。但是实际开发中也是各种蛋疼,这节主要分享一下自己做语音部分遇到的各种蛋疼的事;
刚开始是打算向后台以二进制流的方式发送给服务器,搞了半天没发送成功,后来服务器说他们服务器的用的框架只能接受标准的json格式的数据,而json不能存放二进制流格式的数据,所以不能发送成功。没办法后来把二进制流转化为字符串格式,放在json里面传给服务器,服务器才接收到我的数据。
要实现语音聊天,首先要用AVFoundation框架下的AVAudioRecorder类录制语音,AVAudioRecorder默认的录制格式是caf的,但是安卓那边不能播放caf格式,安卓那边用的是amr格式,但是我不知道怎么把caf转为amr,后来请教朋友知道AVAudioRecorder类录制的时候把这只参数里面的AVFormatIDKey设置成kAudioFormatLinearPCM 可以录制wav格式,然后通过VoiceConverter开源类(网上很容易找到)可以把wav转为amr,然后发给后台,安卓那边就可以播放。
理论上是如此,但是实际操作过程中又遇到了好多问题,首先在网上下载VoiceConverter导入工程后,老是报错,主要是libopencore-amrnb.a这个开源框架的问题,解决办法是把Build Settings中的Enable Bitcode 设置为NO,就好了,具体原因不详。然后调用VoiceConverter.h里面的两个方法就可以实现wav和amr的相互转换。然后把我录制的wav格式转化为amr发送给安卓之后,播放后发现有很大的噪音,我开始使劲的改啊改找原因,后来发现是VoiceConverter.h类中amr转wav的方法中那个1和16对应的是AVAudioRecorder的设置中的音频通道数和线性音频的位深度这两个参数,要一致,改了之后,iOS和安卓终于可以听到对方的声音了。
操,这几天被代码操死了。