编辑:如果应用程序在后台运行,则CADislayLink
用于监控AVAudioRecorder
仪表不是一个好主意。如果设备休眠(在我的情况下是锁定设备),它将停止触发。解决方案是使用NSTimer
。这是导致我的问题的代码
- (void)startUpdatingMeter {
// Using `CADisplayLink` here is not a good choice. It stops triggering if lock the device
self.meterUpdateDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleAudioRecorderMeters)];
[self.meterUpdateDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}
解决方案:改用 NSTimer
// Set timeInterval as frame refresh interval
self.timerMonitor = [NSTimer timerWithTimeInterval:1.f/60.f target:self selector:@selector(handleAudioRecorderMeters:) userInfo:nil repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:self.timerMonitor forMode:NSDefaultRunLoopMode];
AVAudioRecorder
无论我们使用AVAudioSessionCategoryRecord
或,下面的代码都可以完美地工作AVAudioSessionCategoryPlayAndRecord
。
原始问题:到目前为止,我正在创建一个记录声音的应用程序,即使它处于后台模式。这很像iTalk。
一切都近乎完美,我的应用程序可以在前台/后台录制(通过注册后台模式 -链接),但如果设备被锁定(由用户或自身设备),它会暂停/停止。
我尝试了 iTalk,在这种情况下效果很好。我还从 iTalk 得到了一个提示:它在锁屏上有音乐控制,而我的应用程序没有。
这是我的配置代码AVAudioSession
和AVAudioRecorder
- (void)configurateAudioSession {
NSError *error = nil;
// Return success after set category
BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDuckOthers error:&error];
// Return success after set active
success = [[AVAudioSession sharedInstance] setActive:YES error:&error];
// Return success after set mode
success = [[AVAudioSession sharedInstance] setMode:AVAudioSessionModeVideoRecording error:&error];
}
- (void)configAudioRecorder {
NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath_ = [searchPaths objectAtIndex:0];
NSString *pathToSave = [documentPath_ stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]];
// Create audio recorder
NSURL *url = [NSURL fileURLWithPath:pathToSave];
NSDictionary *settings = @{ AVSampleRateKey: @44100.0,
AVFormatIDKey: @(kAudioFormatAppleLossless),
AVNumberOfChannelsKey: @1,
AVEncoderAudioQualityKey:@(AVAudioQualityMax), };
NSError *error = nil;
self.audioRecorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
if (error) {
NSLog(@"Error on create audio: %@", error);
}
else {
[self.audioRecorder prepareToRecord];
self.audioRecorder.meteringEnabled = YES;
[self.audioRecorder record];
}
}
如果您能提供任何信息,我将不胜感激。谢谢大佬!