ios錄音小操作

//  ViewController.h
//  錄音

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
- (IBAction)clickRecordBtn:(id)sender;
- (IBAction)clickPauseBtn:(id)sender;
- (IBAction)clickResumeBtn:(id)sender;
- (IBAction)clickStopBtn:(id)sender;

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

@end


//  ViewController.m
//  錄音


#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface ViewController ()<AVAudioPlayerDelegate,AVAudioRecorderDelegate>

@property (nonatomic, strong) AVAudioPlayer *audioPlay; //音頻播放器
@property (nonatomic, strong) AVAudioRecorder *audioRecored; //音頻錄音機

@property (nonatomic, strong) NSTimer *timer;

@end

@implementation ViewController

-(NSTimer *)timer
{
    if (!_timer) {
        _timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(aduioPowerChange) userInfo:nil repeats:YES];
    }
    return _timer;
}

#pragma mark 錄音聲波的狀態監測
-(void)aduioPowerChange
{
    [self.audioRecored updateMeters];//更新測量值
    float power= [self.audioRecored averagePowerForChannel:0];//取得第一個通道的音頻,注意音頻(聲音)強度範圍時-160到0 ,0代表最大輸入
    NSLog(@".......... %f",power);
    CGFloat progress=(1.0/50.0)*(power+50.0);
    [_progressView setProgress:progress];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //設置音頻會話
    [self setAudioSession];
}

#pragma mark 設置音頻會話
-(void)setAudioSession
{
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    //設置爲播放和錄音的狀態,以便可以在錄製完成後播放
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
    [audioSession setActive:YES error:nil];
}

#pragma mark 獲得音頻的URL
-(NSURL *)getAudioUrl
{
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *audioPath = [documentPath stringByAppendingPathComponent:@"test.wav"];
    NSURL *url = [NSURL fileURLWithPath:audioPath];
    return url;
}

#pragma mark 獲得音頻播放器
-(AVAudioPlayer *)audioPlay
{
    if (!_audioPlay) {
        
        //1. 獲得url路徑
        NSURL *audioUrl = [self getAudioUrl];
        NSError *error;
        _audioPlay = [[AVAudioPlayer alloc] initWithContentsOfURL:audioUrl error:&error];
        _audioPlay.volume = 1.0;
        if (error) {
            NSLog(@"創建音頻播放器的時候出現了錯誤!%@",[error localizedDescription]);
        }
    }
    return _audioPlay;
}

#pragma mark 獲得錄音機對象
-(AVAudioRecorder *)audioRecored
{
    if (!_audioRecored)
    {
        //1. 創建錄音後的音頻的保存路徑
        NSURL *audioUrl = [self getAudioUrl];
        
        //2. 錄音機的文件設置
        NSMutableDictionary *dic = [NSMutableDictionary dictionary];
        //設置錄音的音頻格式
        [dic setObject:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey];
        //設置錄音的採樣率 電話採樣率爲8000
        [dic setObject:@(8000) forKey:AVSampleRateKey];
        //設置通道
        [dic setObject:@(1) forKey:AVNumberOfChannelsKey];
        //採樣點位數 8、16、24、32
        [dic setObject:@(8) forKey:AVLinearPCMBitDepthKey];
        //是否採用浮點數採樣
        [dic setObject:@(YES) forKey:AVLinearPCMIsFloatKey];
        //其他設置......
        
        //3. 創建錄音機
        NSError *error;
        _audioRecored = [[AVAudioRecorder alloc] initWithURL:audioUrl settings:dic error:&error];
        if (error) {
            NSLog(@"創建錄音機失敗");
        }
        _audioRecored.meteringEnabled=YES;//如果要監控聲波則必須設置爲YES
        
        _audioRecored.delegate = self;
    }
    return _audioRecored;
}

#pragma mark 點擊錄音按鈕
- (IBAction)clickRecordBtn:(id)sender {
    if (!self.audioRecored.isRecording) {
        
        [_audioPlay stop];
        
        [_audioRecored record];
        
        self.timer.fireDate = [NSDate distantPast];
    }
}

#pragma mark 點擊暫停按鈕
- (IBAction)clickPauseBtn:(id)sender {
    if (self.audioRecored.isRecording) {
        [_audioRecored pause];
        
        self.timer.fireDate = [NSDate distantFuture];
    }
}

#pragma mark 點擊恢復按鈕
- (IBAction)clickResumeBtn:(id)sender {
    [self clickRecordBtn:nil];
}

#pragma mark 點擊停止按鈕
- (IBAction)clickStopBtn:(id)sender {
    
    [_audioRecored stop];
    self.timer.fireDate = [NSDate distantFuture];
}

#pragma mark 協議中方法,錄音結束
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag
{
    NSLog(@"錄音結束");
    if (!self.audioPlay.isPlaying) {
        [_audioPlay play];
    }
    
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}


@end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章