ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用AVAudioRecorder录制音频

2020-04-27 23:54:20  阅读:238  来源: 互联网

标签:kAudioFormatMPEG4AAC 音频格式 音频 录制 录音 AVAudioRecorder BOOL error


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

音频格式设置

  • AVFormatIDKey

    格式标识符。取值为 AudioFormatID 类型

  • AVSampleRateKey

    用于定义录音的采样率。数值越小,录音质量越差,对应的录音文件越小。数值越大,录音质量越好,对应的录音文件越大。比如8000(AM广播类型的录制效果),16000,22050或者44100(CD质量的采样率)

  • AVNumberOfChannelsKey

    用于设置录音时的通道数。设置默认值1为单声道录制,设置为2意味着使用立体声录制。除非使用外设进行录制,否则应设置为1。

编码设置

  • AVEncoderAudioQualityKey

    编码质量,值为AVAudioQuality

  • AVEncoderBitRateKey

    编码比特率,值为整数

  • AVEncoderBitRatePerChannelKey

    标识每个通道的编码比特率。

注意:AVEncoderBitRateKeyAVEncoderBitRatePerChannelKey只需要设置一个

  • AVEncoderBitRateStrategyKey

    编码比特率的策略 取值为AVAudioBitRateStrategy

  • AVEncoderAudioQualityForVBRKey

    动态比特率,只和AVAudioBitRateStrategy_Variable有关 值为 AVAudioQuality

  • AVEncoderBitDepthHintKey

    编码位数(位深度)。值为8~32。这个数值越大,解析度就越高,录制和回放的声音就越真实

线性PCM音频格式设置

  • AVLinearPCMBitDepthKey

    一个NSNumber整数,指示线性PCM音频格式的位深度,值为8、16、24或32之一。

  • AVLinearPCMIsBigEndianKey

    一个布尔值,指示音频格式是大端(YES)还是小端(NO)。

  • AVLinearPCMIsFloatKey

    一个布尔值,指示音频格式是浮点(YES)还是定点(NO)。

  • AVLinearPCMIsNonInterleaved

    一个布尔值,指示音频格式是非交错(YES)还是交错(NO)。

采样率转换设置

  • AVSampleRateConverterAudioQualityKey

    音频采用率质量(录音采样质量)值为 AVAudioQuality

  • AVSampleRateConverterAlgorithmKey

    采样率转化算法, 值为 AVSampleRateConverterAlgorithm字符串

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有