iOS原生录音功能

//

//  ViewController.m

//  录音

//

//  Created by cjw on 16/7/11.

//  Copyright © 2016 ch. All rights reserved.

//


#import "ViewController.h"

#import <AVFoundation/AVFoundation.h>

#define kRecordAudioFile @"myRecord.caf"

@interface ViewController ()<AVAudioRecorderDelegate>

@property (nonatomic,strong)AVAudioRecorder * audioRecorder;//音频录音机

@property (nonatomic,strong)AVAudioPlayer   * audioPlayer;//音频播放器,用于播放录音

@property (nonatomic,strong)NSTimer         * timer;//录音声波监控;

@property (weak, nonatomic) IBOutlet UIButton *record;


@property (weak, nonatomic) IBOutlet UIButton *pause;

@property (weak, nonatomic) IBOutlet UIButton *resume;

@property (weak, nonatomic) IBOutlet UIButton *stop;

@property (weak, nonatomic) IBOutlet UIProgressView *audioPower;


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    [self setAudioSession];

}


#pragma mark - 私有方法

/**

 *  设置音频会话

 *

 */


-(void)setAudioSession

{

    AVAudioSession * audioSession = [AVAudioSession sharedInstance];

    //设置为播放和录制状态,以便在录制完成之后播放录音

    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

    [audioSession setActive:YES error:nil];

}


/**

 *  取得录音文件的保存路径

 *

 *  @return 录音文件的路径

 */

-(NSURL *)getSavePath

{

    NSString * urlStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES ) lastObject];

    urlStr = [urlStr stringByAppendingPathComponent:kRecordAudioFile];

    NSLog(@"file:path:%@",urlStr);

    NSURL * url = [NSURL fileURLWithPath:urlStr];

    return url;

}

/**

 *  取得录音文件的设置

 *

 *  @return 录音设置

 */

-(NSDictionary *)getAudioSettion

{

    NSMutableDictionary * dicM = [NSMutableDictionary dictionary];

    //设置录音格式

    [dicM setObject:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey];

    //设置录音采样率,8000是电话采样率,对于一般的录音已经够了

    [dicM setObject:@(8000) forKey:AVSampleRateKey];

    //设置通道,这里采用单声道

    [dicM setObject:@(1) forKey:AVNumberOfChannelsKey];

    //每个采样点位数,分为8162432

    [dicM setObject:@(8) forKey:AVLinearPCMBitDepthKey];

    //是否使用浮点数采样

    [dicM setObject:@(YES) forKey:AVLinearPCMIsFloatKey];

    //。。。。是他设置

    return dicM;

}

/**

 *  获得录音机对象

 *

 *  @return 录音机对象

 */

-(AVAudioRecorder * )audioRecorder

{

    if (!_audioRecorder) {

        //创建录音文件保存路径

        NSURL * url =[self getSavePath];

        //创建录音格式设置

        NSDictionary * setting = [self getAudioSettion];

        //创建录音机

        NSError * error = nil;

        _audioRecorder = [[AVAudioRecorder alloc]initWithURL:url settings:setting error:&error];

        _audioRecorder.delegate = self;

        _audioRecorder.meteringEnabled = YES;//如果要控制声波则必须设置为YES

        if(error)

        {

            NSLog(@"创建录音机对象发生错误,错误信息是:%@",error.localizedDescription);

            return nil;

        }

        

    }

    return _audioRecorder;

    

}

/**

 *  创建播放器

 *

 *  @return 播放器

 */

-(AVAudioPlayer *)audioPlayer

{

    if (!_audioPlayer) {

        NSURL * url = [self getSavePath];

        NSError * error = nil;

        _audioPlayer =[[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];

        _audioPlayer.numberOfLoops = 0;

        [_audioPlayer prepareToPlay];

        if (error) {

            NSLog(@"创建播放器过程出错:错误信息是:%@",error.localizedDescription);

            return nil;

        }

    }

    return _audioPlayer;

}

/**

 *  录音声波监控定时器

 *

 *  @return 定时器

 */

-(NSTimer * )timer

{

    if (!_timer) {

        _timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(audioPowerChange) userInfo:nil repeats:YES];

    }

    return _timer;

}


-(void)audioPowerChange

{

    [self.audioRecorder updateMeters];//跟新检测值

    float power = [self.audioRecorder averagePowerForChannel:0];//获取第一个通道的音频,注音音频的强度方位-1600

    CGFloat progerss = (1.0/160)*(power+160);

    [self.audioPower setProgress:progerss];

}

#pragma mark - 按钮点击事件

/**

 *  点击录音按钮

 *

 *  @param sender 录音按钮

 */

- (IBAction)recordClick:(id)sender {

    if (![self.audioRecorder isRecording]) {

        [self.audioRecorder record];

        self.timer.fireDate = [NSDate distantPast];

    }

}

/**

 *  点击暂停按钮

 *

 *  @param sender 暂停按钮

 */

- (IBAction)pauseClick:(id)sender {

    if ([self.audioRecorder isRecording]) {

        [self.audioRecorder pause];\

        self.timer.fireDate=[NSDate distantFuture];

    }

}

/**

 *  点击恢复按钮

 *  恢复录音只需要再次调用recordAVAudioSession会帮助你记录上次录音位置并追加录音

 *

 *  @param sender 恢复按钮

 */

- (IBAction)resumeClick:(id)sender {

    [self recordClick:sender];

}


/**

 *  点击停止按钮

 *

 *  @param sender 停止按钮

 */

- (IBAction)stopClick:(id)sender {

    [self.audioRecorder stop];

    self.timer.fireDate = [NSDate distantFuture];

    self.audioPower.progress = 0.0;

}

#pragma mark - 录音机代理方法

/**

 *  录音完成,录音完成后播放录音

 *

 *  @param recorder 录音机对象

 *  @param flag     是否成功

 */

-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag{

    if (![self.audioPlayer isPlaying]) {

        [self.audioPlayer play];

    }

    NSLog(@"录音完成!");

}


- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值