iOS移动开发社区iOS 重修笔记

重修笔记之多媒体AVAudioRecorder录制音频

2018-03-16  本文已影响19人  iOS_July
随着社交应用的推广,录音功能的使用频率愈来愈高。
K歌、语音消息、录音笔等。

针对这个需求,iOS专门提供了AVAudioRecorder类。
AVAudioRecorder类是专用录制音频的接口,包含在AVFoundation框架里。
可以录制任意时长音频、能控制录音过程[暂停、继续]控制音量

属性声明 功能描述
@property(readonly, getter=isRecording) BOOL recording; 获取录音器是否正在录音
@property(assign, nullable) id<AVAudioRecorderDelegate> delegate; 设置录音器的代理对象
@property(readonly) NSTimeInterval currentTime; 获取当前已录取音频时间
@property(readonly) NSTimeInterval deviceCurrentTime NS_AVAILABLE_IOS(6_0); 获取录音设备已运行的时间
方法声明 功能描述
- (nullable instancetype)initWithURL:(NSURL *)url settings:(NSDictionary<NSString *, id> *)settings error:(NSError **)outError; 创建录音器
- (BOOL)record; 开始录音
- (void)pause; 暂停录音
- (void)stop; 停止录音
- (BOOL)deleteRecording; 删除录音文件

一、示例

#import <AVFoundation/AVFoundation.h>
//创建录音器
    AVAudioRecorder *recorder = [[AVAudioRecorder alloc]initWithURL:url settings:setting error:nil];
3个参数:url、setting、outError
url代表录音文件将要保存的位置,一般为沙盒中:

//准备存储录音文件的URL
    NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];    
//将录音文件的名字连接都存储路径上
    filePath = [filePath stringByAppendingPathComponent:@"test.caf"];
    NSURL *url = [NSURL fileURLWithPath:filePath];
setting录制音频时设置的参数,字典类型:

//创建一个LPCM格式的音频文件,并封装在.caf文件中。
    NSDictionary *setting = @{
                              AVFormatIDKey:[NSNumber numberWithInt:kAudioFormatLinearPCM],
                              AVSampleRateKey:[NSNumber numberWithFloat:44100.0],
                              AVNumberOfChannelsKey:[NSNumber numberWithInt:2]
                              };
outError记录了可能存在的错误,是NSError类型的参数
//准备录音
            [self.recorder prepareToRecord];
            //开始录音
            [self.recorder record];
//暂停录音-先判断是否正在录音
            if (self.recorder.isRecording) {
                [self.recorder pause];
            }
//继续录音
            if (self.recorder !=nil && !self.recorder.isRecording) {
                [self.recorder record];
            }
//结束录音-系统会自动将录音文件保存在创建录音器时传入的URL中
           [self.recorder stop];
           NSLog(@"结束录音");

二、笔者的完整示例

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

@interface ViewController ()
/** recorder录音对象 */
@property(nonatomic, strong) AVAudioRecorder *recorder;
/** 开始录音Button */
@property(nonatomic, weak) UIButton *startBtn;
/** 暂停录音Button */
@property(nonatomic, weak) UIButton *pauseBtn;
/** 继续录音Button */
@property(nonatomic, weak) UIButton *recordBtn;
/** 结束录音Button */
@property(nonatomic, weak) UIButton *endBtn;
/** 按钮数据源*/
@property (nonatomic, strong) NSArray *listArr;
@end

@implementation ViewController

- (NSArray *)listArr{
    if (!_listArr) {
        _listArr = @[@"startBtn",@"pauseBtn",@"recordBtn",@"endBtn"];
    }
    return _listArr;
}


- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupStartBtn:self.startBtn aTag:0];
    [self setupStartBtn:self.pauseBtn aTag:1];
    [self setupStartBtn:self.recordBtn aTag:2];
    [self setupStartBtn:self.endBtn aTag:3];
    [self setupRecorder];
}
- (void)setupStartBtn:(UIButton *)button aTag:(NSInteger)I{
    CGFloat btnW = 100;
    CGFloat btnX = 50;
    CGFloat btnH = 40;
    CGFloat btnY = 50;
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.tag = I;
    [btn setBackgroundColor:[UIColor clearColor]];
    [btn setTitle:self.listArr[i] forState:UIControlStateNormal];
    btn.titleLabel.textColor = [UIColor greenColor];
    btn.layer.borderColor = [UIColor orangeColor].CGColor;
    btn.layer.borderWidth = 2;
    btn.frame = CGRectMake(btnX, btnY+btnH*i, btnW, btnH);
    [btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
    self.startBtn = btn;
}



- (void)clickBtn:(UIButton *)btn{
    switch (btn.tag) {
        case 0:
            //准备录音
            [self.recorder prepareToRecord];
            //开始录音
            [self.recorder record];
            NSLog(@"开始录音");
            break;
        case 1:
            //暂停录音
            if (self.recorder.isRecording) {
                [self.recorder pause];
            }
            NSLog(@"暂停录音");
            break;
        case 2:
            //继续录音
            if (self.recorder !=nil && !self.recorder.isRecording) {
                [self.recorder record];
            }
            NSLog(@"继续录音");
            break;
        case 3:
            NSLog(@"已录制%f",self.recorder.currentTime);
            //结束录音
            [self.recorder stop];
            NSLog(@"结束录音");
            break;
        default:
            break;
    }
}
- (void)setupRecorder{
    
    //准备存储录音文件的URL
    NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    
    //将录音文件的名字连接都存储路径上
    filePath = [filePath stringByAppendingPathComponent:@"test.caf"];
    NSURL *url = [NSURL fileURLWithPath:filePath];
    
    
    //创建一个LPCM格式的音频文件,并封装在.caf文件中。
    NSDictionary *setting = @{
                              AVFormatIDKey:[NSNumber numberWithInt:kAudioFormatLinearPCM],
                              AVSampleRateKey:[NSNumber numberWithFloat:44100.0],
                              AVNumberOfChannelsKey:[NSNumber numberWithInt:2]
                              };
    
    //创建录音器
    AVAudioRecorder *recorder = [[AVAudioRecorder alloc]initWithURL:url settings:setting error:nil];
    self.recorder = recorder;

}

三、检测

Window -> Devices and Simulator-> 选中你的手机,选中你的项目 
-> 点击底下那个齿轮 -> Download Container 
-> 选择下载后的路径 -> 下载后的文件显示包内容 
-> AppData -> Documents ->这里有刚才录制的音频文件。
windows.png 包.png 音频文件.png
代码很丑,求放过.......
上一篇下一篇

猜你喜欢

热点阅读