EDIT: Использование CADislayLink
для мониторинга AVAudioRecorder
метров - это не очень хорошая идея, если приложение работает в фоновом режиме. Он перестает запускаться, если устройство спит (в моем случае это блокировка устройства). Решение для этого используется вместо NSTimer
. Вот код, который вызывает мой вопросCADislayLink не срабатывает, если устройство заблокировано
- (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.
Все почти идеально подходит, мое приложение может записывать в то время как передний план/фон (путем регистрации фонового режима - link), но он приостанавливается/останавливается, если устройство заблокировано (пользователем или самообслуживанием).
Я искал 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];
}
}
Я был бы очень признателен, если бы вы могли предоставить мне какую-либо информацию. Спасибо, парень!
Я боюсь, что это ничего не меняет. «AVAudioSessionCategoryRecord» и «AVAudioSessionCategoryPlayAndRecord» имеют тот же результат, что и выше – nahung89
. Я не понимаю, почему это не сработает, поскольку документы говорят, что он будет работать во время блокировки экрана. – Rajat
Вы правы. Рекордер все еще работает при блокировке устройства. Проблема исходит из CADisplayLink, который я использую для мониторинга рекордера. Я уточню свой вопрос. Спасибо большое! – nahung89