其他分享
首页 > 其他分享> > 使用AVAudioRecorder录制音频

使用AVAudioRecorder录制音频

作者:互联网

AVAudioRecorder 同AVAudioPlayer 类似,都是AVFoundation框架下的类

AVAudioRecorder 是一个录音器,可以调用方法来录制音频,使用还是比较简单的。

一、开启录音权限,并设置录音category

需要在info.plist文件中添加Privacy - Microphone Usage Description

//请求录音权限
[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
    //yes表示用户同意
    if (granted) {
        NSError * error = nil;
        //设置录音category
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:&error];
        if (error) {
            NSLog(@"设置录音类别失败");
        }
        [[AVAudioSession sharedInstance] setActive:YES error:&error];
        if (error) {
            NSLog(@"激活类别失败");
        }
    } else {
        NSLog(@"用户不允许录音");
    }
}];

备注:AVAudioSessionCategoryRecord 只是使用录音通道,设置了之后只能录音,不能播放音频。
也可以使用AVAudioSessionCategoryPlayAndRecord 可以一边播放一边录音,有语音唤醒的应用一般需要使用这个category

二、初始化录音器

两种初始化方法

- (nullable instancetype)initWithURL:(NSURL *)url settings:(NSDictionary<NSString *, id> *)settings error:(NSError **)outError;
- (nullable instancetype)initWithURL:(NSURL *)url format:(AVAudioFormat *)format error:(NSError **)outError;

url:指要存储音频的本地路径地址
settings/format:录制会话的设置
outError:错误描述

2.1 settings字典的所需key

音频格式设置

编码设置

注意:AVEncoderBitRateKeyAVEncoderBitRatePerChannelKey只需要设置一个

线性PCM音频格式设置

采样率转换设置

2.2 key对应的参数值

AudioFormatID音频格式,枚举类型

CF_ENUM(AudioFormatID)
{
    kAudioFormatLinearPCM               = 'lpcm',
    kAudioFormatAC3                     = 'ac-3',
    kAudioFormat60958AC3                = 'cac3',
    kAudioFormatAppleIMA4               = 'ima4',
    kAudioFormatMPEG4AAC                = 'aac ',
    kAudioFormatMPEG4CELP               = 'celp',
    kAudioFormatMPEG4HVXC               = 'hvxc',
    kAudioFormatMPEG4TwinVQ             = 'twvq',
    kAudioFormatMACE3                   = 'MAC3',
    kAudioFormatMACE6                   = 'MAC6',
    kAudioFormatULaw                    = 'ulaw',
    kAudioFormatALaw                    = 'alaw',
    kAudioFormatQDesign                 = 'QDMC',
    kAudioFormatQDesign2                = 'QDM2',
    kAudioFormatQUALCOMM                = 'Qclp',
    kAudioFormatMPEGLayer1              = '.mp1',
    kAudioFormatMPEGLayer2              = '.mp2',
    kAudioFormatMPEGLayer3              = '.mp3',
    kAudioFormatTimeCode                = 'time',
    kAudioFormatMIDIStream              = 'midi',
    kAudioFormatParameterValueStream    = 'apvs',
    kAudioFormatAppleLossless           = 'alac',
    kAudioFormatMPEG4AAC_HE             = 'aach',
    kAudioFormatMPEG4AAC_LD             = 'aacl',
    kAudioFormatMPEG4AAC_ELD            = 'aace',
    kAudioFormatMPEG4AAC_ELD_SBR        = 'aacf',
    kAudioFormatMPEG4AAC_ELD_V2         = 'aacg',
    kAudioFormatMPEG4AAC_HE_V2          = 'aacp',
    kAudioFormatMPEG4AAC_Spatial        = 'aacs',
    kAudioFormatMPEGD_USAC              = 'usac',
    kAudioFormatAMR                     = 'samr',
    kAudioFormatAMR_WB                  = 'sawb',
    kAudioFormatAudible                 = 'AUDB',
    kAudioFormatiLBC                    = 'ilbc',
    kAudioFormatDVIIntelIMA             = 0x6D730011,
    kAudioFormatMicrosoftGSM            = 0x6D730031,
    kAudioFormatAES3                    = 'aes3',
    kAudioFormatEnhancedAC3             = 'ec-3',
    kAudioFormatFLAC                    = 'flac',
    kAudioFormatOpus                    = 'opus'
};

AVAudioQuality 一个枚举属性,指定采用率转化质量

typedef NS_ENUM(NSInteger, AVAudioQuality) {
	AVAudioQualityMin    = 0,
	AVAudioQualityLow    = 0x20,
	AVAudioQualityMedium = 0x40,
	AVAudioQualityHigh   = 0x60,
	AVAudioQualityMax    = 0x7F
};

AVSampleRateConverterAlgorithm 转换算法(字符串类型)

// 使用正常的编码器比特率策略
extern NSString *const AVSampleRateConverterAlgorithm_Normal;                  

// 使用主控编码器比特率策略
extern NSString *const AVSampleRateConverterAlgorithm_Mastering;             

// 使用最小相位编码器比特率策略
extern NSString *const AVSampleRateConverterAlgorithm_MinimumPhase;    

AVAudioBitRateStrategy 比特率的策略

// 常数策略
extern NSString *const AVAudioBitRateStrategy_Constant;                                
// 长期平均值策略
extern NSString *const AVAudioBitRateStrategy_LongTermAverage;                
// 受约束的变量值策略
extern NSString *const AVAudioBitRateStrategy_VariableConstrained;  
// 变量值策略
extern NSString *const AVAudioBitRateStrategy_Variable;                                  

2.3 示例

上边的值不需要全部设置,只使用需要的就可以,例如:

NSDictionary *settings = @{
    AVSampleRateKey:[NSNumber numberWithFloat: 44100.0], // 采样率
    AVFormatIDKey:[NSNumber numberWithInt: kAudioFormatMPEG4AAC], // 音频格式
    AVNumberOfChannelsKey:[NSNumber numberWithInt: 1],  // 声道数
    AVEncoderAudioQualityKey:[NSNumber numberWithInt:AVAudioQualityMin], // 录音质量
    AVSampleRateConverterAudioQualityKey:[NSNumber numberWithInt: AVAudioQualityMin] // 录音采样质量
};

NSError *error;
_audioRecorder = [[AVAudioRecorder alloc] initWithURL:_recordURL settings:settings error:&error];

if(error) {
    NSLog(@"Ups, could not create recorder %@", error);
}

三、录音

3.1常用方法如下:

// 创建一个文件,并准备开始录制。调用record方法时,如果音频还没有准备好,程序会隐式先执行该方法。
- (BOOL)prepareToRecord;   

 // 开始或恢复录制。调用该方法时,如果音频还没有准备好,程序会隐式执行prepareToRecord方法。
- (BOOL)record;

// 在指定时间点开始或恢复录制。时间是一个绝对的时间,基于并大于设备的时间
- (BOOL)recordAtTime:(NSTimeInterval)time;  

// 录制一个指定持续时间的音频,录到指定时长后会自动停止
- (BOOL)recordForDuration:(NSTimeInterval) duration; 

// 在指定时间点开始或恢复录制,并指定录制的持续时间。
- (BOOL)recordAtTime:(NSTimeInterval)time forDuration:(NSTimeInterval) duration; 

// 暂停。
- (void)pause; 

// 停止
- (void)stop; 

// 必须先调用停止之后才能调用,调用后会删掉录制的音频文件
- (BOOL)deleteRecording;   

3.2 其他方法

获取音量(分贝)

// 是否开启分贝检测,默认是关闭的
@property(getter=isMeteringEnabled) BOOL meteringEnabled; 

// 调用更新分贝值,在调用后面两个方法前,需要先调用这个方法
- (void)updateMeters; 

// 返回给定信道的峰值功率(最大分贝)
- (float)peakPowerForChannel:(NSUInteger)channelNumber; 

// 返回给定信道的平均功率(平均分贝)
- (float)averagePowerForChannel:(NSUInteger)channelNumber; 

3.3 代理

/*在录制完成或停止时调用。如果recorder由于中断而停止,则不调用此方法.*/
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag;

/* 如果在编码时发生错误,将调用这个方法告诉代理*/
- (void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError * __nullable)error;

// audio的interrupt打断代理不建议使用,建议使用avaudiosession的打断监听来处理。

标签:kAudioFormatMPEG4AAC,音频格式,音频,录制,录音,AVAudioRecorder,BOOL,error
来源: https://www.cnblogs.com/absty-guo/p/12791172.html