录音的实现

//

//  RecordViewController.m

//  SunshineMusic

//

//  Created by dllo on 16/1/14.

//  Copyright © 2016 G.Group. All rights reserved.

//


#import "RecordViewController.h"

#import <AVFoundation/AVFoundation.h>

#import "BaseButton.h"

#import "BaseImageView.h"

#import <Masonry.h>

#import "MusicTool.h"

#define kRecordAudioFile @"myRecord.caf"

@interface RecordViewController () <AVAudioRecorderDelegate>

@property (nonatomic, retain) AVAudioRecorder *audioRecorder;

@property (nonatomic, retain) NSTimer *timer;

@property (nonatomic, retain) AVAudioPlayer *audioPlayer;

@property (retain, nonatomic) BaseButton *start;

@property (retain, nonatomic)   BaseButton *pause;

@property (retain, nonatomicBaseButton *resume;

@property (retain, nonatomic)   BaseButton *stop;

@property (retain, nonatomicUIProgressView *progress;

@property (nonatomic, retain) BaseImageView *imageV;



@end


@implementation RecordViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view from its nib.

    [self createSubViews];

    [self setAudioSession];

}

- (void)createSubViews

{

    self.view.backgroundColor = [UIColor whiteColor];

        [self imageV];

    [self createButtons];

    [self progress];


}

- (BaseImageView *)imageV

{

    if (!_imageV) {

        _imageV = [BaseImageView new];

        _imageV.image = [UIImage imageNamed:@"formdetailback"];

        [self.view addSubview:_imageV];

        [_imageV mas_makeConstraints:^(MASConstraintMaker *make) {

        

            make.edges.equalTo(self.view);

            

        }];

        

    }

    return _imageV;

}


- (void)createButtons

{

    self.start = [BaseButton new];

    self.start.layer.masksToBounds = YES;

    [self.start setTitle:@"开始" forState:UIControlStateNormal];

    self.start.layer.cornerRadius = 25;

    [self.start addTarget:self action:@selector(start:) forControlEvents:UIControlEventTouchUpInside];

    self.start.backgroundColor = [UIColor redColor];

    [self.view addSubview:self.start];

    self.pause = [BaseButton new];

     [self.pause setTitle:@"暂停" forState:UIControlStateNormal];

    self.pause.layer.masksToBounds = YES;

    self.pause.layer.cornerRadius = 25;

    [self.pause addTarget:self action:@selector(pause:) forControlEvents:UIControlEventTouchUpInside];

        self.pause.backgroundColor = [UIColor redColor];

    [self.view addSubview:self.pause];


    self.resume = [BaseButton new];

         [self.resume setTitle:@"重新" forState:UIControlStateNormal];

    self.resume.layer.masksToBounds = YES;

    self.resume.layer.cornerRadius = 25;

//    [self.resume addTarget:self action:@selector(resume:) forControlEvents:UIControlEventTouchUpInside];

        self.resume.backgroundColor = [UIColor redColor];

    [self.view addSubview:self.resume];

    self.stop = [BaseButton new];

     [self.stop setTitle:@"结束" forState:UIControlStateNormal];

    self.stop.layer.masksToBounds = YES;

    self.stop.layer.cornerRadius = 25;

    [self.stop addTarget:self action:@selector(stop:) forControlEvents:UIControlEventTouchUpInside];

        self.stop.backgroundColor = [UIColor redColor];

    [self.view addSubview:self.stop];

    [self.start mas_makeConstraints:^(MASConstraintMaker *make) {

        

        make.centerX.equalTo(self.view.mas_centerY).offset(-160);

        make.centerY.equalTo(self.view.mas_bottom).offset(-150);

        make.height.width.equalTo(@50);

        

    }];

    [self.pause mas_makeConstraints:^(MASConstraintMaker *make) {

        

        make.centerX.equalTo(self.start).offset(-100);

        make.centerY.equalTo(self.start);

        make.width.height.equalTo(self.start);

    }];

    

    [self.resume mas_makeConstraints:^(MASConstraintMaker *make) {

        make.centerX.equalTo(self.start).offset(100);

        make.centerY.equalTo(self.start);

        make.width.height.equalTo(self.start);

        

    }];

    

    [self.stop mas_makeConstraints:^(MASConstraintMaker *make) {

        make.centerX.equalTo(self.resume).offset(100);

        make.centerY.equalTo(self.start);

        make.width.height.equalTo(self.start);

        

    }];

}

- (UIProgressView *)progress

{

    if (!_progress) {

        _progress = [UIProgressView new];

        [self.view addSubview:_progress];

        [_progress mas_makeConstraints:^(MASConstraintMaker *make) {

            

            make.centerY.equalTo(self.view).offset(-30);

            make.centerX.equalTo(self.view);

            make.width.mas_equalTo(300);

            make.height.mas_equalTo(5);

        }];

    }

    return _progress;

}

- (void)setAudioSession

{

    AVAudioSession *session = [AVAudioSession sharedInstance];

    [session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

    [session setActive:YES error:nil];

}

- (NSURL *)getSavePath

{

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

    urlStr  = [urlStr stringByAppendingPathComponent:kRecordAudioFile];

  

    NSURL *url = [NSURL fileURLWithPath:urlStr];

    NSLog(@"%@", url);

    return url;

}

- (NSDictionary *)getAudioSetting

{

    NSMutableDictionary *dicM = [NSMutableDictionary dictionary];

    //设置录音格式

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

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

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

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

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

    //每个采样点位数, 分为8, 16, 24, 32

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

    //是否使用浮点数采样

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

    return dicM;

}

- (AVAudioRecorder *)audioRecorder

{

    if (!_audioRecorder) {

        NSURL *url = [self getSavePath];

        //创建录音格式设置

        NSDictionary *setting = [self getAudioSetting];

        //创建录音机

        NSError *error = nil;

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

        _audioRecorder.delegate = self;

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

        if (error) {

            NSLog(@"创建录音机发生错误");

        }

        

    }

    return _audioRecorder;

}

//创建播放器

- (AVAudioPlayer *)audioPlayer

{

    if (!_audioPlayer) {

        NSURL *url=[self getSavePath];

        NSError *error=nil;

      NSString *s =  [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

        NSLog(@"______%@", s);

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

        _audioPlayer.numberOfLoops = 0;

        [_audioPlayer prepareToPlay];

        if (error) {

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

            return nil;

        }

    }

    return _audioPlayer;

}

- (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 progress = (1.0 / 160) * (power + 160.0);

    [self.progress setProgress:progress];

}

//点击录音按钮

- (void)start:(id)sender {

    if (![self.audioRecorder isRecording]) {

        NSLog(@"录音开始");

        [self.audioRecorder record];

        self.timer.fireDate = [NSDate distantPast];

    }

}

- (void)pause:(id)sender {

    if ([self.audioRecorder isRecording]) {

        [self.audioRecorder pause];

        self.timer.fireDate = [NSDate distantFuture];

    }

}

//- (void)resume:(id)sender {

//    [self start:sender];

//}

- (void)stop:(id)sender {

    [self.audioRecorder stop];

    self.timer.fireDate = [NSDate distantFuture];

    self.progress.progress = 0.0;

}

- (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.

}


/*

#pragma mark - Navigation


// In a storyboard-based application, you will often want to do a little preparation before navigation

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    // Get the new view controller using [segue destinationViewController].

    // Pass the selected object to the new view controller.

}

*/


- (void)dealloc {

    [_start release];

    [_pause release];

    [_resume release];

    [_stop release];


    [_progress release];

    [super dealloc];

}

@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值