即时通讯收发语音,兼容安卓wav和amr格式互转

本文介绍了在即时通讯应用中处理语音收发时,遇到的安卓与iOS平台音频格式兼容问题。通过使用AVFoundation的AVAudioRecorder录制wav格式语音,并借助VoiceConverter库进行wav到amr的转换,实现了跨平台的语音交流。在转换和播放过程中,还解决了噪声问题,确保了语音质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天公司做了一个即时通讯的简单聊天软件,要求可以收发文子、图片、语音。由于公司缺乏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和安卓终于可以听到对方的声音了。

操,这几天被代码操死了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值