iOS AVAudioRecorder简介

news/2024/7/20 22:22:21 标签: ios, AVAudioRecorder

AVAudioRecorder_0">1. AVAudioRecorder应用

AVAudioRecorder的主要属性

// 是否在录制中
@property(readonly, getter=isRecording) BOOL recording;
// 录音本地文件地址
@property(readonly) NSURL *url;
// 录音文件配置
@property(readonly) NSDictionary<NSString *, id> *settings;

// 录音文件当前时间,只有在录音时有效
@property(readonly) NSTimeInterval currentTime;
// 设备当前时间
@property(readonly) NSTimeInterval deviceCurrentTime;

// AVAudioRecorder回调
@property(weak, nullable) id<AVAudioRecorderDelegate> delegate;

// 是否启用音频测量, 默认是NO
@property(getter=isMeteringEnabled) BOOL meteringEnabled;

AVAudioRecorder的主要方法

// 初始化方法
- (nullable instancetype)initWithURL:(NSURL *)url settings:(NSDictionary<NSString *, id> *)settings error:(NSError **)outError;
// 准备开始录音
- (BOOL)prepareToRecord;
// 立即开始录音
- (BOOL)record;
// 在一段时间之后开始录音,time与deviceCurrentTime相比较
- (BOOL)recordAtTime:(NSTimeInterval)time;
// 开始录音,并只录制一段时间
- (BOOL)recordForDuration:(NSTimeInterval) duration;
// 在一段时间之后开始录音,并只录制一段时间
- (BOOL)recordAtTime:(NSTimeInterval)time forDuration:(NSTimeInterval) duration;

// 暂停录音
- (void)pause;
// 停止录音,关闭录音文件
- (void)stop;
// 删除录音文件,需在stop方法后
- (BOOL)deleteRecording;

// 更新音频测量值,meteringEnabled为YES时才可以获得音频分贝等信息
- (void)updateMeters;
// 获得指定声道的分贝峰值,在此之前调用updateMeters方法
- (float)peakPowerForChannel:(NSUInteger)channelNumber;
// 获得指定声道的分贝平均值,在此之前调用updateMeters方法
- (float)averagePowerForChannel:(NSUInteger)channelNumber;

AVAudioRecorder录制后将音频保存到本地文件中

- (void)startRecord:(NSString *)filePath {
    NSDictionary *setting = @{
        AVFormatIDKey: @(kAudioFormatMPEG4AAC), // 音频格式
        AVSampleRateKey : @(44100), // 采样率
        AVNumberOfChannelsKey : @(1) // 声道数
    };

    NSError *error;
    self.audioRecorder = [[AVAudioRecorder alloc] initWithURL:[NSURL fileURLWithPath:filePath] settings:setting error:&error];
    if (!error) {
        self.audioRecorder.delegate = self;
        self.audioRecorder.meteringEnabled = YES;

        [self.audioRecorder prepareToRecord];
        [self.audioRecorder record];
    }
}

- (void)stopRecord {
    [self.audioRecorder pause];
    [self.audioRecorder stop];
}

AVAudioRecorderDelegate_81">2. AVAudioRecorderDelegate代理

AVAudioRecorderDelegate主要有两个方法

- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag {
    // 录音结束
    
}

- (void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError * __nullable)error {
    // 录音错误

}

3. 获取音频功率

获取音频功率,meteringEnabled需要设置为YES

- (void)updateMeter { 
    // 获取计量之前调用
    [self.audioRecorder updateMeters];

    CGFloat averagePower = [self.audioRecorder averagePowerForChannel:0];
    CGFloat peakPower = [self.audioRecorder peakPowerForChannel:0];

    // 网上给出的转换公式,转换后结果是 0 到 120 的幅度范围内
    CGFloat power = pow(10.0, peakPower / 20.0) * 120;
}

4. 合并录音文件

录音结束后,有时需要合并录音文件

- (void)mergeAudio:(NSArray *)filePathArray outputFile:(NSString *)outputFilePath {
    // 创建音频轨道,并获取多个音频素材的轨道
    AVMutableComposition *composition = [AVMutableComposition composition];
    // 音频插入的开始时间,用于记录每次添加音频文件的开始时间
    __block CMTime beginTime = kCMTimeZero;
    [filePathArray enumerateObjectsUsingBlock:^(NSString *filePath, NSUInteger idx, BOOL * _Nonnull stop) {
        // 获取音频素材
        AVURLAsset *audioAsset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:filePath]];
        // 音频轨道
        AVMutableCompositionTrack *audioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0];
        // 获取音频素材轨道
        AVAssetTrack *audioAssetTrack = [[audioAsset tracksWithMediaType:AVMediaTypeAudio] firstObject];
        // 音频合并- 插入音轨文件
        [audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) ofTrack:audioAssetTrack atTime:beginTime error:nil];
        // 记录尾部时间
        beginTime = CMTimeAdd(beginTime, audioAsset.duration);
    }];
    AVAssetExportSession *session = [[AVAssetExportSession alloc]initWithAsset:composition presetName:AVAssetExportPresetAppleM4A];

    // 音频文件输出
    session.outputURL = [NSURL fileURLWithPath:outputFilePath];
    session.outputFileType = AVFileTypeAppleM4A; // 与上述的`present`相对应
    [session exportAsynchronouslyWithCompletionHandler:^{
        if (session.status == AVAssetExportSessionStatusCompleted) {

        } else {

        }
    }];
}

http://www.niftyadmin.cn/n/5079587.html

相关文章

虹科分享 | 想买车无忧?AR为您带来全新体验!

新能源汽车的蓬勃发展&#xff0c;推动着汽车行业加速进行数字化变革。据数据显示&#xff0c;全球新能源汽车销售额持续上升&#xff0c;预计到2025年&#xff0c;新能源汽车市场规模将达到约 4200亿美元&#xff0c;年复合增长率超过 30%。这表明消费者对清洁能源出行的需求不…

shell运行原理、权限

shell运行原理、权限 一、shell运行原理1、简介2、shell的简单定义3、外壳程序的意义4、简易示例图 二、Linux下的两种用户三、whoami命令1、功能 四、su命令1、功能2、用法3、示例 五、Linux权限管理1、文件归属2、文件权限图3、文件类型4、文件名后缀5、文件权限&#xff08;…

第二章:OSI参考模型与TCP/IP模型

OSI参考模型与TCP/IP模型 一、OSI参考模型二、TCP/IP模型2.1 四层分法&#xff08;书上&#xff09;2.2 五层分法&#xff08;实际厂商&#xff09;2.3 数据封装和解封装2.3.1 封装2.3.2 解封装2.3.3 TCP/IP分层封装2.3.4 数据封装和解封装过程 一、OSI参考模型 1.物理层 定义电…

Java:设计模式之结构型-装饰者模式(decorator pattern)

装饰者模式(decorator pattern): 动态地将责任附加到对象上 意图&#xff1a;为对象动态添加功能 类图 实现 设计不同种类的饮料&#xff0c;饮料可以添加配料&#xff0c;比如可以添加牛奶&#xff0c;并且支持动态添加新配料。每增加一种配料&#xff0c;该饮料的价格就…

阿里云ModelScope 是一个“模型即服务”(MaaS)平台

简介 项目地址&#xff1a;https://github.com/modelscope/modelscope/tree/master ModelScope 是一个“模型即服务”(MaaS)平台&#xff0c;旨在汇集来自AI社区的最先进的机器学习模型&#xff0c;并简化在实际应用中使用AI模型的流程。ModelScope库使开发人员能够通过丰富的…

持续集成交付CICD:Jenkins部署

目录 一、理论 1.CI/CD 2.Gitlab内置持续集成 3.Jenkins安装与部署 4.Gitlab服务部署 5.Jenkins服务部署 6.Tomcat服务部署 7.Jenkins–Pipeline流水线项目构建 二、实验 1.Gitlab服务部署 2.Jenkins服务部署 3.Tomcat服务部署 4.Jenkins–Pipeline流水线项目构建…

Java实现防重复提交,使用自定义注解的方式

目录 1.背景 2.思路 3.实现 创建自定义注解 编写拦截器 4.使用 5.验证 6.总结 1.背景 在进行添加操作时&#xff0c;防止恶意点击&#xff0c;后端进行请求接口的防重复提交 2.思路 通过拦截器搭配自定义注解的方式进行实现&#xff0c;拦截器拦截请求&#xff0c;使…

将 Jupyter Notebook 用于 JavaScript (使用 Node.js 或 Deno 环境)

熟悉 Python 的读者, 可能同样对 IPython 或 Jupyter 等项目 (如 Jupyter Notebook) 有所耳闻. 正如其名, IPython 项目让 Python 这门语言变得 “interactive”; 如: 交互式的 Shell 程序, 对交互式数据可视化以及 GUI 工具集的支持等等 (具体可见 IPython 项目的网站). 比如…