我加载视图时,按照以下方式设置AVAudioRecorder实例:
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
audioSession.delegate = self;
[audioSession setActive:YES error:nil];
[audioSession setCategory:AVAudioSessionCategoryRecord error:nil];
NSString *tempDir = NSTemporaryDirectory();
NSString *soundFilePath = [tempDir stringByAppendingPathComponent:@"sound.m4a"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
NSLog(@"%@", soundFileURL);
NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey,
[NSNumber numberWithInt:AVAudioQualityMin], AVEncoderAudioQualityKey,
[NSNumber numberWithInt:16], AVEncoderBitRateKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
[NSNumber numberWithFloat:8000.0], AVSampleRateKey,
[NSNumber numberWithInt:8], AVLinearPCMBitDepthKey,
nil];
NSError *error = nil;
self.recorder = [[AVAudioRecorder alloc]
initWithURL:soundFileURL
settings:recordSettings
error:&error];
self.recorder.delegate = self;
if (error) {
NSLog(@"error: %@", [error localizedDescription]);
} else {
[self.recorder prepareToRecord];
}
然后,当用户按下录制按钮时,我执行:
- (IBAction)record:(id)sender {
if (!self.isRecording) {
self.isRecording = YES;
[self.recorder record];
self.recordButton.enabled = NO;
}
}
然后停止录制/播放:
- (IBAction)stop:(id)sender {
if (self.isRecording) {
[self.recorder stop];
self.recordButton.enabled = YES;
self.isRecording = NO;
}
if (self.isPlaying) {
[self.player stop];
self.isPlaying = NO;
self.playButton.enabled = YES;
}
}
之后,我希望能够播放录制的内容,因此我执行以下操作:
- (IBAction)play:(id)sender {
NSError *error = nil;
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:self.recorder.url error:&error];
self.player.delegate = self;
if (error) {
NSLog(@"%@", error.localizedDescription);
} else {
self.isPlaying = YES;
[self.player play];
self.playButton.enabled = NO;
}
}
但是当我去播放文件时,找不到 OSStatus错误-43 文件。
这一切都在设备btw上运行,在模拟器上尝试实例化录音机或播放器时出错,而且我已经看到它是模拟器问题。
编辑1:我解决了OSStatus错误-43部分它与编码格式有关,我注释掉格式并记录并正确播放文件,但我需要记录以压缩格式。有谁知道这个的设置?
编辑2:我设法找到适用于压缩AAC音频的设置。一个2分钟的音频文件出现了256KB,我更新了我的代码以反映当前的状态。感谢所有为您提供帮助的人。
答案 0 :(得分:7)
我会采取狂野的方式,因为没有其他人回答(编辑:现在有)(我对iOS中的音频没有多少经验)但是......
尝试更改
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil];
到
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
答案 1 :(得分:2)
AVEncoderBitRateKey
无法使用AAC
格式编码。请尝试使用此代码。
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
NSLog(@"%@", soundFileURL);
NSDictionary *recordSettings = [NSDictionary
dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:kAudioFormatMPEG4AAC],
AVFormatIDKey,
[NSNumber numberWithInt: AVAudioQualityMax],
AVEncoderAudioQualityKey,
[NSNumber numberWithInt: 1],
AVNumberOfChannelsKey,
[NSNumber numberWithFloat:44100.0],
AVSampleRateKey,
nil];
NSError *error = nil;
self.recorder = [[AVAudioRecorder alloc]
initWithURL:soundFileURL
settings:recordSettings
error:&error];
self.recorder.delegate = self;
if (error) {
NSLog(@"error: %@", [error localizedDescription]);
NSLog(@"error: %@", [error description]);
} else {
[self.recorder prepareToRecord];
}
编辑1:
未找到OSStatus错误-43文件不是模拟器问题。它是一个错误日志,显示您的recording settings are not correct
和必填encoding format is not supported for the settings you have selected
。
当您收到此错误时,您将以您给出的格式创建文件。但它会not initialize your audio recorder to start recording
。如果您有任何疑问,请选择您在第一个问题和记录中使用的相同设置并尝试播放。由于设置不受支持,它不会录制和播放。
因此,对于compressed encoding format
,您可以使用我在上面的代码中给出的设置。您可以为此设置设置.aac
格式。它将采用164KB per 10 seconds to record in aac
格式。对于其他格式,您必须尝试找出。
答案 2 :(得分:0)
您可能需要将AVAudioSession类别设置回播放模式:
NSError *_error = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&_error];
if (_error) {
// handle error here
}
这也应该避免在打开静音开关时无法播放音频的问题。
答案 3 :(得分:0)
好的,试试这个:
为您的班级设置NSURL *soundFileURL
全局,以便您可以在班级的任何位置访问它,并以与现在相同的方式设置(除了soundFileURL = [NSURL fileURLWithPath:soundFilePath];
而不是NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
。
然后改变这个
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:self.recorder.url error:&error];
到这个
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:&error];