zoukankan      html  css  js  c++  java
  • 使用AVAudioRecorder 录音

    自己项目中用到了录音部分,本来想做一个关于录音的开源项目的,想想还是写博客好点。

    录音回话设置

    复制代码
    1  NSError *error = nil;
    2     AVAudioSession * audioSession = [AVAudioSession sharedInstance]; //得到AVAudioSession单例对象
    3     [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: &error];//设置类别,表示该应用同时支持播放和录音
    4     [audioSession setActive:YES error: &error];//启动音频会话管理,此时会阻断后台音乐的播放.
    5     
    6     // 设置成扬声器播放
    7     UInt32 doChangeDefault = 1;
    8     AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefault), &doChangeDefault);
    复制代码

    1-4主要设置程序启动录音状态,7-8设置的是默认为采用扬声器状态播放,如果你插入耳机,自动改变为耳机状态。

    录音之前需要,先关闭播放音乐,如果不关闭,就开始录音,就会出现红色提示框,造成整个view抖动。不过不影响使用。所以在使用上面的代码之前先调用代码关闭音乐播放。

    复制代码
    1  NSMutableDictionary *recordSetting = [NSMutableDictionary dictionary];
    2     [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
    3     [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
    4     [recordSetting setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];
    5     [recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
    6     [recordSetting setValue:[NSNumber numberWithBool:YES] forKey:AVLinearPCMIsBigEndianKey];
    7     [recordSetting setValue:[NSNumber numberWithBool:YES] forKey:AVLinearPCMIsFloatKey];
    复制代码

    我录音的格式是ma4格式,采用这种格式的主要目的是,此格式录音一分钟生成的大小小于1M,刚好满足苹果官方的审核。这里单声道和双声道大小还是有有一点区别的,但不太多。我非专业人士,听不出来好坏。你也可以录制完毕转换成mp3格式。github上有一个开源的项目 https://github.com/rpplusplus/iOSMp3Recorder 录制的各个参数我就不再分析。

    接下来就是初始化,

    1  NSError *error = nil;
    2  AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:_recordFileURL settings:recordSettings error:&error];
    _recordFileURL 是NSURL的文件路径。
    recordSettings 是上面的音频格式设置。

    设置录音时间。得到输入大小。完成委托。

    1 [_recorder recordForDuration:(NSTimeInterval) 30.0 * 60.0];
    2  _recorder.meteringEnabled = YES;
    3 [_recorder setDelegate:self];

    1设置最长的录音时间。2得到输入大小,最大为60,最小为-60 。3设置设置委托,委托里面有两个方法,一个当录音完成调用,一个当出现中断调用。

    1 if ([_recorder prepareToRecord] == YES){
    2         [_recorder record];
    3 }

    当准备好了就开始录音,千万不要只调用 prepareToRecord 方法,也许你第一次能调用成功,第二次不能调用成功。

    然后就是设置动态显示的东西,如动态的录音时间,_recorder.currentTime;

    得到波形图。

    1 - (void)updateMeters; /* call to refresh meter values */
    2 
    3 - (float)peakPowerForChannel:(NSUInteger)channelNumber; /* returns peak power in decibels for a given channel */
    4 - (float)averagePowerForChannel:(NSUInteger)channelNumber; /* returns average power in decibels for a given channel */

    使用上面的方法得到每个声道的输入大小。每次都必须调用 updateMeters来更新为最新数据。

    录音部分,就完成了,当然你可以对应的使用AVAudioPlayer来播放录制的声音。

    1  AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    2  NSError *err = nil;
    3  [audioSession setCategory :AVAudioSessionCategoryPlayback error:&err];

    录制完毕后调用上面切换成播放模式

  • 相关阅读:
    X5webview完美去掉分享功能和缓存功能(2)
    bintray 在android3.2上传遇到的问题
    x5webview 自定义全屏界面
    X5webview去掉分享功能和缓存功能
    buglly热更新集成遇到的那些坑
    腾讯x5webview集成实战
    动态权限<三>华为小米特殊机制
    android 判断应用是否在前台显示
    动态权限<二>之淘宝、京东、网易新闻 权限申请交互设计对比分析
    android 图片二维码识别和保存(二)
  • 原文地址:https://www.cnblogs.com/chinaxxren/p/2863483.html
Copyright © 2011-2022 走看看