音訊_錄音

weixin_34120274發表於2016-04-10

錄音

參考:AVAudioRecorder Class Reference

使用

  • 包含框架AVFoundation.framework
  • 使用AVAudioRecorder錄音機控制類

屬性


@property(readonly, getter=isRecording) BOOL recording; 是否正在錄音
@property(readonly) NSURL *url  錄音要存放的地址
@property(readonly) NSDictionary *settings  錄音檔案設定
@property(readonly) NSTimeInterval currentTime  錄音時長,僅在錄音狀態可用
@property(readonly) NSTimeInterval deviceCurrentTime    輸入設定的時間長度,此屬性一直可訪問
@property(getter=isMeteringEnabled) BOOL meteringEnabled;   是否啟用錄音測量,啟用錄音測量可以獲得錄音分貝等資料資訊
@property(nonatomic, copy) NSArray *channelAssignments  當前錄音的通道

物件方法


- (instancetype)initWithURL:(NSURL *)url settings:(NSDictionary *)settings error:(NSError **)outError
錄音機物件初始化,url必須是本地,settings是錄音格式、編碼等設定
- (BOOL)prepareToRecord 
準備錄音,用於建立緩衝區,如果不手動呼叫,在呼叫record錄音時也會自動呼叫
- (BOOL)record  
開始錄音
- (BOOL)recordAtTime:(NSTimeInterval)time
在指定的時間開始錄音,一般用於錄音暫停再恢復錄音
- (BOOL)recordForDuration:(NSTimeInterval) duration
按指定的時長開始錄音
- (BOOL)recordAtTime:(NSTimeInterval)time forDuration:(NSTimeInterval) duration 
在指定的時間開始錄音,並指定錄音時長
- (void)pause;  
暫停錄音
- (void)stop;
停止錄音
- (BOOL)deleteRecording;
刪除錄音,刪除錄音時錄音機必須處於停止狀態
- (void)updateMeters;   
更新測量資料,只有meteringEnabled為YES此方法才可用
- (float)peakPowerForChannel:(NSUInteger)channelNumber;
指定通道的測量峰值,只有呼叫完updateMeters才有值
- (float)averagePowerForChannel:(NSUInteger)channelNumber
指定通道的測量平均值,注意只有呼叫完updateMeters才有值

代理方法

- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag 完成錄音
- (void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error 錄音編碼發生錯誤

示例

  • 下面實現一個基本的的錄音,包括開始錄音、停止、播放。

    • 設定音訊會話型別為AVAudioSessionCategoryPlayAndRecord,因為程式中牽扯到錄音和播放操作。
    • 建立錄音機AVAudioRecorder,指定錄音儲存的路徑並且設定錄音屬性,注意對於一般的錄音檔案要求的取樣率、位數並不高,需要適當設定以保證錄音檔案的大小和效果。
    • 建立音訊播放器AVAudioPlayer,用於在錄音完成之後播放錄音。

程式碼:


//
//  ViewController.m
//  LTYAudioRecord
//
//  Created by Rachel on 16/4/10.
//  Copyright © 2016年 AYuan. All rights reserved.
//

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

@interface ViewController (){
    
    NSString *filePath;
    
}


@property (nonatomic, strong) AVAudioSession *session;

@property (nonatomic, strong) AVAudioRecorder *recorder;//錄音器
@property (nonatomic, strong) AVAudioPlayer *player; //播放器
@property (nonatomic, strong) NSURL *recordFileUrl; //檔案地址

@end

@implementation ViewController

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

- (IBAction)startRecord:(id)sender {
    NSLog(@"開始錄音");
    
    AVAudioSession *session =[AVAudioSession sharedInstance];
    NSError *sessionError;
    [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
    
    if (session == nil) {
        
        NSLog(@"Error creating session: %@",[sessionError description]);
        
    }else{
        [session setActive:YES error:nil];
        
    }
    
    self.session = session;
    
    //1.獲取沙盒地址
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    filePath = [path stringByAppendingString:@"/test.wav"];
    
    //2.獲取檔案路徑(這個url只能在錄音之前就確定好)
    self.recordFileUrl = [NSURL fileURLWithPath:filePath];
    
    //設定引數
    NSDictionary *recordSetting = [[NSDictionary alloc] initWithObjectsAndKeys:
                                   //取樣率  8000/11025/22050/44100/96000(影響音訊的質量)
                                   [NSNumber numberWithFloat: 8000.0],AVSampleRateKey,
                                   // 音訊格式
                                   [NSNumber numberWithInt: kAudioFormatLinearPCM],AVFormatIDKey,
                                   //取樣位數  8、16、24、32 預設為16
                                   [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
                                   // 音訊通道數 1 或 2
                                   [NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
                                   //錄音質量
                                   [NSNumber numberWithInt:AVAudioQualityHigh],AVEncoderAudioQualityKey,
                                   nil];
    
    
    _recorder = [[AVAudioRecorder alloc] initWithURL:self.recordFileUrl settings:recordSetting error:nil];
    
    if (_recorder) {
        
        _recorder.meteringEnabled = YES;
        [_recorder prepareToRecord];
        [_recorder record];
        
    }else{
        NSLog(@"音訊格式和檔案儲存格式不匹配,無法初始化Recorder");
        
    }
    
}


- (IBAction)stopRecord:(id)sender {
    
    NSLog(@"停止錄音");
    if ([self.recorder isRecording]) {
        [self.recorder stop];
    }
    
}


- (IBAction)PlayRecord:(id)sender {
    
    if ([self.player isPlaying]) return;
    
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:self.recordFileUrl error:nil];
    
    [self.session setCategory:AVAudioSessionCategoryPlayback error:nil];
    [self.player play];
    
}



@end


相關文章