iOS录音功能实现指南
录音功能概述
iOS平台提供了多种实现录音功能的技术方案,其中最常用的是AVFoundation框架中的AVAudioRecorder类。该类允许开发者以多种格式进行录音操作。
| 属性 | 说明 |
|---|---|
| @property(readonly, getter=isRecording) BOOL recording | 录音状态标记 |
| @property(readonly) NSURL *url | 录音文件URL路径 |
| @property(readonly) NSDictionary *settings | 录音配置参数集合 |
| @property(readonly) NSTimeInterval currentTime | 当前录音时长 |
| @property(readonly) NSTimeInterval deviceCurrentTime | 设备输入时间 |
| @property(getter=isMeteringEnabled) BOOL meteringEnabled | 录音音量测量开关 |
| @property(nonatomic, copy) NSArray *channelAssignments | 录音声道配置 |
| 方法 | 说明 |
|---|---|
| initWithURL:settings:error: | 录音对象初始化方法 |
| prepareToRecord | 录音准备方法 |
| record | 开始录音 |
| recordAtTime: | 定时录音 |
| recordForDuration: | 按时间限制录音 |
| pause | 暂停录音 |
| stop | 停止录音 |
| deleteRecording | 删除录音文件 |
| updateMeters | 更新音量测量数据 |
| peakPowerForChannel: | 获取声道峰值 |
| averagePowerForChannel: | 获取声道平均值 |
| 代理方法 | 说明 |
|---|---|
| audioRecorderDidFinishRecording: | 录音完成通知 |
| audioRecorderEncodeErrorDidOccur: | 录音错误处理 |
AVAudioRecorder与AVAudioPlayer在功能上有很多相似之处。以下是一个完整的录音控制实现示例,包括录音、暂停、恢复、停止功能,并支持音量实时显示。录音完成后会自动播放录音内容。
实现步骤如下:
- 配置音频会话类型为AVAudioSessionCategoryPlayAndRecord
- 创建录音文件存储路径并设置录音属性
- 实现录音音量测量功能(需启用测量功能)
- 构建音频播放器用于播放录音文件
- 设置定时器监控录音音量变化
- 实现录音控制操作(开始、暂停、恢复、停止)
#import "AudioRecorderViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface AudioRecorderViewController () <AVAudioRecorderDelegate>
@property (nonatomic, strong) AVAudioRecorder *audioRecorder;
@property (nonatomic, strong) AVAudioPlayer *audioPlayer;
@property (nonatomic, strong) NSTimer *recordingTimer;
@property (weak, nonatomic) IBOutlet UIButton *startButton;
@property (weak, nonatomic) IBOutlet UIButton *pauseButton;
@property (weak, nonatomic) IBOutlet UIButton *resumeButton;
@property (weak, nonatomic) IBOutlet UIButton *stopButton;
@property (weak, nonatomic) IBOutlet UIProgressView *volumeIndicator;
@end
@implementation AudioRecorderViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self setupAudioSession];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
#pragma mark - 音频会话配置
- (void)setupAudioSession {
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *error = nil;
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[session setActive:YES error:&error];
}
#pragma mark - 录音功能实现
- (IBAction)startRecording:(UIButton *)sender {
if (![self.audioRecorder isRecording]) {
[self.audioRecorder record];
[self.recordingTimer fire];
}
}
- (IBAction)suspendRecording:(UIButton *)sender {
if ([self.audioRecorder isRecording]) {
[self.audioRecorder pause];
[self.recordingTimer invalidate];
}
}
- (IBAction)continueRecording:(UIButton *)sender {
[self startRecording:sender];
}
- (IBAction)endRecording:(UIButton *)sender {
[self.audioRecorder stop];
[self.recordingTimer invalidate];
self.volumeIndicator.progress = 0.0;
}
#pragma mark - 音量监控
- (void)updateVolumeLevel {
[self.audioRecorder updateMeters];
float averagePower = [self.audioRecorder averagePowerForChannel:0];
CGFloat progress = (1.0f / 160.0f) * (averagePower + 100.0f);
self.volumeIndicator.progress = progress;
}
#pragma mark - 录音完成处理
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag {
if (!flag) {
NSLog(@"录音失败");
return;
}
[self.audioPlayer play];
NSLog(@"录音成功");
}
@end
网络音频播放解决方案
AVFoundation框架虽然功能强大,但不支持流媒体播放。对于需要在线音频播放的应用,可以使用AudioToolbox框架中的音频队列服务(Audio Queue Services)。
FreeStreamer是一个优秀的第三方音频播放框架,支持:
- 本地音频播放
- 网络流媒体播放
- 播放列表管理
- 音频中断处理
- 音量控制
- 播放完成通知
使用FreeStreamer实现网络音频播放的步骤:
- 将FreeStreamer相关文件添加到项目中
- 配置项目依赖库(CFNetwork.framework、AudioToolbox.framework等)
- 设置预编译头文件路径
#import "AudioPlayerViewController.h"
#import "FSAudioStream.h"
@interface AudioPlayerViewController ()
@property (nonatomic, strong) FSAudioStream *audioStream;
@end
@implementation AudioPlayerViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.audioStream play];
}
- (NSURL *)getRemoteAudioUrl {
return [NSURL URLWithString:@"http://example.com/audio.mp3"];
}
- (FSAudioStream *)audioStream {
if (!_audioStream) {
NSURL *url = [self getRemoteAudioUrl];
_audioStream = [[FSAudioStream alloc] initWithURL:url];
_audioStream.onFailure = ^(FSAudioStreamError error, NSString *description) {
NSLog(@"播放失败: %@", description);
};
_audioStream.onCompletion = ^() {
NSLog(@"播放完成");
};
_audioStream.volume = 0.5f;
}
return _audioStream;
}
@end
FreeStreamer框架提供了丰富的功能扩展,建议访问官方网站获取完整文档和示例代码。