搜索
您的当前位置:首页正文

iOS类似微信语音(包括录音、显示、播放)

来源:二三娱乐

这次公司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.还有一种情况是用户换手机后就没这些数据了,需求要求之前的不显示红点,我就在判断到没有这个字典的时候记录下当前时间(没有字典说明第一次安装登录),这样如果是这个时间之前的音频就不作判断一律不显示红点。

Top