公司产品需求做一个录音功能,要求可以添加背景音乐,支持边录边播,录音试听、暂停录音、实时绘制音波图、以mp3格式上传服务端等功能。
1、使用iOS自带API:AVAudioRecorder录音wav格式音频,存储到本地,录音暂停(pause)的时候,路径下并没有生成真正的音频文件(没有任何声音),只有调用stop结束录音,才会生成完整的wav文件。
2、解决办法:暂停(pause)就是结束(stop),然后把一段段wav拼接在一起,但是碰到另一个问题,两段wav音频用音轨拼接的方式(AVMutableComposition)合并成一个新的音频中间是没有停顿的,但是由于wav是由头文件和音频文件组成,合并生成的新wav 通过lame转成mp3(只由音频文件组成),实际上是转码失败,生成的mp3只有滋滋滋的噪音。
3、然后想到先把每一段wav转mp3,然后拼接两段mp3,mp3的拼接方式是用nsdata append,这里又出现一个问题,wav转mp3包含了头文件,合并后的mp3中间会有很明显的停顿。
4、此时想到换录音api,准备用AVAudioQueue,边录制边转码,但是没找到该api实时获取音量的方法(AVAudioRecorder提供的方法是:updateMemter),因此无法绘制录音音波图,满足不了产品需求。
5、后来了解到可以直接录制源文件,而非通过pcm(没有压缩的编码方式)编码成wav,然后转码拼接,发现没有效果,跟wav一样的问题
6、通过查资料学习到 pcm和wav的头文件都是44字节,然后尝试着截取掉头文件,然后在转码mp3,拼接,但是还是没用
7、最后还是用AVAudioRecorder,边录制边转码,录制caf(一种由苹果公司开发的存储音频的格式)同时开辟子线程转码mp3。录制的caf格式音频,在暂停的时候也会生成音频文件,因此省去了拼接的步骤,需求完成。
总结:iOS多个wav文件,合成并转码mp3,会出现拼接失败或中间有明显停顿。caf则没有问题。