这次公司app要加上语音功能,在上家曾经做过一个播放器,但是已经很久没有接触音频了,所以我把这个模块揽了下来。
包含的功能
录音
1.因为需要对外提供倒计时时间和录音时长,所以我就用了一个NSTimer定时器来每秒调用代理更新时间,并在完成录音后提供录音时长。
//添加定时器
- (void)addTimer
{
_countDown = self.maxRecordTime;
_timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countDown) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
}
- (void)countDown
{
_countDown--;
if (_countDown <= 0) {
[[[UIAlertView alloc] initWithTitle:nil
message:[NSString stringWithFormat:@"说话时间超长"]
delegate:nil
cancelButtonTitle:@"确定"
otherButtonTitles:nil] show];
[self completeRecord];
return;
}
if (self.fDelegate && [self.fDelegate respondsToSelector:@selector(audioRecorderLastTime:)]) {
[self.fDelegate audioRecorderLastTime:_countDown];
}
}
2.要注意的是在录音中已经存储本地,如果最后取消录音的话要注意删除本地缓存。
播放
1.因为需要在播放完成后继续自动播放下一个音频,所以我建了一个model。
@interface AudioPlayerModel : NSObject
@property (nonatomic, assign) NSUInteger strType; //字符串类型:0本地地址 1网络地址
@property (nonatomic, strong) NSString *audioStr;
@property (nonatomic, assign) NSInteger index; //音频位置
@property (nonatomic, assign) NSUInteger audioTime; //音频时间
@end
类型用来判断是网络音频还是本地音频,index是为了可能在TableView中有多个cell中有音频,可以用来记录cell的位置。
在调用开始播放音频前,先设置好音频数组audioArray,每一项为AudioPlayerModel,这样就可以按照audioArray的顺序播放。
2.播放前先判断,如果是本地类型就直接播放,如果是网络类型也先根据音频文件名判断本地是否有下载缓存(文件名用时间戳保证唯一),有下载缓存就直接播放,没有就先下载,完成后播放。
红点
1.这个红点因为和后台商量后只是本地做,所以在NSUserDefault中存储一个字典,在录音完成和播放的时候以音频文件名作为key存在字典中,通过这个字典来判断是否需要显示红点。
2.还有一种情况是用户换手机后就没这些数据了,需求要求之前的不显示红点,我就在判断到没有这个字典的时候记录下当前时间(没有字典说明第一次安装登录),这样如果是这个时间之前的音频就不作判断一律不显示红点。