您的位置:首页 > 移动开发 > IOS开发

ios 浅析录音技术(后台、互斥、上传)

2016-05-25 19:23 369 查看
1.音频互斥:

音频被中断包含了多种可能性。比如:其他应用调用扬声器,短信发送提示音,播放音乐,用户接打电话都会造成音频中断。一开始的解决方案是列出全部的中断方案,比如监听电话拨打,在电话将要来之前刷新ui,保存录音,这样会造成不能考虑到全部的情况。

2.音频互斥会造成音频中断:

- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder


会调用AVAudioRecorder的代理方法,在这里操作互斥事件,结束或者暂停掉录音即可

3.音频后台问题:

用户要求录音可以后台录制,不是简单的退出到主界面,添加后台到info.plist。

而是要求退出当前界面后可以进行其他的操作,等需要结束录音时,再次进入到录音界面,此时界面需要显示录音信息,时间,以及保持住录音声音波纹动画。

4.解决思路:

一:录音本身和UI并无关联,录音是一个单例,正在录音时会不断的发送录音时间以及声音的频率给代理方法,任何一个界面遵循代理就可以捕捉到对应的数据。

二:在录音界面提供一个返回的按钮,当处于正在录音的状态时,按钮就会显示,其余状态下就会隐藏。

三:当点击返回按钮时,当前的录音界面会被销毁,因为没有和录音器单例进行关联,所以录音会继续进行。

四:再次进入界面时,判断录音器单例是否还在继续录音,如果还在继续录音,重新创建一个录音界面,因为录音器单例一直在发送时间和振幅数据,重新绘制声音波纹动画,显示时间即可。

五:这里很关键的一点就是录音状态的判断,录音器是单例,AVAudioRecorder里存在这样一个属性

@property(readonly, getter=isRecording) BOOL recording;
/* is it recording or not? */


将这个recording传出来,只要读到这个单例,就可以读取到录音器是不是处于录音状态了,解决了录音状态判断的问题。

六:录音结束后发现并没有保存成功。

七:排查原因,发现保存路径发生了变化,因为每次重新创建录音界面的时候,都会重新创建一个时间戳来保证录音的唯一性,但是如果录音界面被销毁了,再重新创建,时间戳就不是上次的了,录音文件写入的路径还是上次的,因此读取文件路径的时候就会读出来的数据是空的。

八:添加了判断,写入的路径会通过录音器返回,也只有在录音过程中才会返回路径,其他时候都是取不到数值的,如果返回了结果,说明在录音过程中,这时候将文件路径存为类变量,就保证了文件写入路径是正确的。

九:产生了新的问题:读到文件录音过程中的路径是绝对路径,但是沙盒本身是动态的,应该保存的是相对路径,但是界面来拼接路径好还是录音器来拼接路径好是个问题,因此在界面传入绝对路径和相对路径,在录音过程中,返回相对路径,就增加了可选择性,这样返回的就是可以拼接的相对路径了。

十:能够大致处理好逻辑的原因,是录音器单例和录音界面的分离,录音界面和控制器展示录音列表的分离才能做到的,如果ui 和单例混在一起,相互引用,是不能够让界面重新恢复的,就是录音器单例才能让后台录音成为实现,因为界面只是展示,只要录音器在继续运行即可。

十一:抽离录音器非常麻烦,可能需要再花一天时间才能抽出。因为涉及到文件上传,沙盒存储,以及用户信息的管理,暂时写下今天处理问题的一些心得。

Demo:

https://github.com/damonyyb/iOSAudioAndPlayManager





+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

录音后台产生了很多新的问题,源自录音上传产生的,如果不需要上传录音,可以不用理会。

1.当用户正在录音,但是后台了,如果这时候有人打电话进来,录音会停止,这时候再次进入界面,录音已经停止了,无法捕捉到录音的时间和音频振幅,因此没有产生结束界面,数据留在本地,但是并未写进数据库。

2.当用户正在录音突然断电或者强制退出app,是否需要强制保存录音数据,以及实现方案。

3.录音结束立刻上传,存在一个上传中的状态,如果需要上传的文件比较大,有可能处于上传中的状态下,app挂了,此时没有保存录音的失败状态,界面依然认为处于上传中状态,实际已经失败了,因为app进程已经没有了,需要对这种状态进行判断

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

以上问题使得之前的代码进行了重构,分离了多个单例出来做状态判断,不能三言两语写完,代码已经写好,但需要一段时间慢慢处理博客文字逻辑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: