iOS 录音实现

作者: 英秋Rachel | 来源:发表于2016-03-01 13:57 被阅读12032次

需求

某处功能加上录音功能,时间大概60秒,上传到服务器,服务器要求文件大小控制在1M以内。

实现思路

利用系统框架AVFoundation实现录音和录音播放

实现步骤

一. 添加AVFoundation

录音1.jpg

二. 在需要的文件导入AVFoundation

#import <AVFoundation/AVFoundation.h>

三.核心代码

* 开始录音

- (IBAction)startRecord:(id)sender {
    NSLog(@"开始录音");

    countDown = 60;
    [self addTimer];
    
    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:@"/RRecord.wav"];
    
    //2.获取文件路径
    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];
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(60 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            
            [self stopRecord:nil];
        });
        
        
        
    }else{
        NSLog(@"音频格式和文件存储格式不匹配,无法初始化Recorder");
        
    }
    



}


*停止录音


- (IBAction)stopRecord:(id)sender {

   [self removeTimer];
    NSLog(@"停止录音");
    
    if ([self.recorder isRecording]) {
        [self.recorder stop];
    }
    
    
    NSFileManager *manager = [NSFileManager defaultManager];
    if ([manager fileExistsAtPath:filePath]){
        
        _noticeLabel.text = [NSString stringWithFormat:@"录了 %ld 秒,文件大小为 %.2fKb",COUNTDOWN - (long)countDown,[[manager attributesOfItemAtPath:filePath error:nil] fileSize]/1024.0];
        
    }else{
    
        _noticeLabel.text = @"最多录60秒";

    }
    


}

*播放录音

- (IBAction)PlayRecord:(id)sender {
    
    NSLog(@"播放录音");
    [self.recorder stop];
    
    if ([self.player isPlaying])return;
    
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:self.recordFileUrl error:nil];
    
    
    
    NSLog(@"%li",self.player.data.length/1024);
    
   
    
    [self.session setCategory:AVAudioSessionCategoryPlayback error:nil];
    [self.player play];
    

    
    
}

demo地址:https://github.com/Rachel829/RLAudioRecord
效果图:

效果图.gif

相关文章

  • iOS中音频的录制和播放

    实现思路 利用系统框架AVFoundation实现录音和录音播放 AudioSession简介 iOS 通过ses...

  • iOS 录音实现

    需求 某处功能加上录音功能,时间大概60秒,上传到服务器,服务器要求文件大小控制在1M以内。 实现思路 利用系统框...

  • ios -简单录音实现

    最近要用过录音功能,搜罗了些方法 ,发现只需要使用ios提供的类就可实现 录音方法: - (void)startR...

  • iOS实现录音功能

    ps:文章内容的代码部分,由于不便暴露业务逻辑,可能会有部分删减,但是主体功能基本保留 背景 这段时间应公司业务需...

  • iOS 实现录音功能

    参考资料 https://www.jianshu.com/p/fb7dfb033989 音频文件相关知识 文件格式...

  • iOS 实现录音功能

    #pragma mark ===== 录制音频初始化 -(void)saveAudio{ AVAudioSes...

  • iOS 录音-上传与播放解析

    title : iOS 录音-上传与播放解析category : IOS iOS 录音-上传与播放解析 标签(...

  • iOS 录音功能的实现

    1.初始化录音设置 2.开始录音 3.录音结束

  • iOS 录音功能的实现

    在iOS开发过程中,需要使用到录音功能,需要做的准备工作就是导入#import 框架。 首先 将系统的类定义为属性...

  • iOS录音的基本实现

    首先导入头文件 #import #import //初始化一个录音控制器AVAudioRecorder * r...

网友评论

  • 匹洛曹:后台录音可以吗?
  • JeffreyTaiT:要是加上麦克风权限和录音动态提示就好了
  • 昵称已经被人占用了:后台录音可以吗?后台录音时,被被电话拨打进来获取qq语音时候,停止电话或者qq语音,接着再录音可以吗
    匹洛曹:老铁,你要的功能实现了没
  • 2024e0e7635b:楼主知道如何将系统声音也录进去吗 比如我正在放歌曲 这个歌曲怎么录进去
  • 45f0c6e690c1:这个DEMO不错,快速验证
  • 哎呦我去叫什么呢:录制的音频文件可以删除吗?要怎么删除啊
    wokenshin:https://www.jianshu.com/p/0dbe875d7723
  • _柠:- (void)addTimer
    {
    _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(refreshLabelText) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
    }

    /**
    * 移除定时器
    */
    - (void)removeTimer
    {
    [_timer invalidate];
    _timer = nil;

    }


    -(void)refreshLabelText{

    countDown --;

    _noticeLabel.text = [NSString stringWithFormat:@"还剩 %ld 秒",(long)countDown];


    }

  • 洁简:如果不写setCategory,第一次录音总是失败....为何呢
    涂了摩丝丶:@洁简 我写了setCategory 第一遍还是录不上。 很无语
    洁简:@涂了摩丝丶 写上setCategory就行了
    涂了摩丝丶:你这个问题解决了吗?每次第一次录音总是失败这个问题。
  • _君莫笑_:这个录音之后文件有点大你怎么处理?我之后做了一个转amr 之后一分钟还是90多k 你有没有什么好的方法控制在50k 之内
  • ziyouzhe4:你好,能否讲解一下 setCategory的含义呢?设置 AVAudioSessionCategoryPlayAndRecord 等模式的用法,还有你是怎么保证音频大小的?
    _君莫笑_:这个有必要写上,就是你手机静音的情况下也可以播放的,不写静音下面播放不了
  • 红颜悴9:可否给个demo
    SkyMing一C:@英秋Rachel 好
    英秋Rachel:@Hanyunfeng 请仔细看文章 或者 command + f "demo"
  • hhgvg:没有demo呀
    porridgechen890:请仔细看文章 或者 command + f "demo"

本文标题:iOS 录音实现

本文链接:https://www.haomeiwen.com/subject/vvlwkttx.html