Android上录制AAC格式音频

Feb 22, 2016


最近在重新设计游戏内的聊天系统,要求支持文字/语音聊天和多频道聊天,其中重点是支持语音聊天。所以这几天的时间都是在做模块设计和技术预研。对于支持语音聊天,涉及到Android和iOS两大平台,所以就先研究这两大平台上通用的音频交互格式。

聊天IM对于语音聊天要求是实时的(至少要保证在3s~5s内能将内容下载到用户设备上),由于语音聊天基本的实现方式:

当玩家使用语音聊天时,利用玩家设备的MIC录制玩家的说话内容,然后将这个说话内容的音频文件上发到服务器,再由服务器将这个音频文件中转到其他玩家的设备上。

这里涉及到音频文件在Android和iOS设备上的交换,由于Android与iOS对于音频格式的支持不尽一样,所以需要一种尽量两个平台都支持,文件大小较小便于网络传输,录音质量在可接受范围内的音频文件格式。

  • WAV格式:这种格式比较常见,很多游戏的特效就是WAV格式。WAV格式的音频文件录音质量很高,文件很大,30s差不多在3.5MB~4.0MB左右,不太利于网络传输。
  • MP3格式:这大概在Android和iOS上算得上略通用的音频格式,相对来说熟悉度高一点,但MP3格式的音频文件还是比较大,不太利于网络传输。
  • AMR格式:比较少见的音频格式,压缩比高,文件大小符合需求,但录制的音频质量较差,亲测了一下,SN3录制完成之后播放由明显的杂音。而且iOS在4.x之后不再明确支持AMR格式,在iOS平台上需要使用第三方库进行转换。
  • PCM格式:严格来说,PCM并不算音频格式,应该叫:音频数据文件。它是不能直接播放的,需要写代码实现音频数据编解码以及压缩。
  • AAC格式:这个是Apple大力推行的音频格式,相对于MP3,AAC格式的音质更佳,文件更小;有损压缩;iOS平台原生支持,Android SDK4.1.2(API 16)及以上版本支持播放。

虽然Android在SDK 4.1.2 版本之后支持AAC格式,但对其格式的支持并不完美,需要使用第三方库实现,好在有现成的第三方库可用,在中高端Android设备测试过,21s左右的音频AAC文件大小大概在30~50kb左右,播放也比较稳定,清晰无明显杂音,在可接受范围内。

对于Android上录制AAC音频文件,使用了VoAAC库,它是AOSP 2.3项目libstagefright内的AAC编码器,相比FAAC库效率更高,录制时CPU占用更低。

这两者我都进行过测试,没发现在效率上有多大的差别,CPU占比倒是有点,不过对于我们游戏的语音聊天需求,这些均在可接受范围内:

  • libAacEncoder.so:源自FAAC库。
  • libVoAACEncoder.so:源自AOSP 2.3 libstagefright内的AAC编码器。

其中使用范例和库文件在这里