2015-09-10 1 views
0

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: у нее есть музыкальный контроль на экране блокировки, а у моего приложения нет.

enter image description here

Вот мой код конфиг 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]; 
    } 
} 

Я был бы очень признателен, если бы вы могли предоставить мне какую-либо информацию. Спасибо, парень!

ответ

1

Вы должны установить категорию вашего AVAudioSession как этот

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:&sessionError]; 

Так что он будет записывать звук, когда устройство заблокировано.

Как док говорит

Для продолжения аудио записи, когда ваше приложение переходит в фона (например, когда на экране блокировки), добавьте аудио значение к ключу UIBackgroundModes в вашей информации файл списка свойств.

Также проверьте эту ссылку

AVAudioRecorder doesn't record while screen is locked

+0

Я боюсь, что это ничего не меняет. «AVAudioSessionCategoryRecord» и «AVAudioSessionCategoryPlayAndRecord» имеют тот же результат, что и выше – nahung89

+0

. Я не понимаю, почему это не сработает, поскольку документы говорят, что он будет работать во время блокировки экрана. – Rajat

+0

Вы правы. Рекордер все еще работает при блокировке устройства. Проблема исходит из CADisplayLink, который я использую для мониторинга рекордера. Я уточню свой вопрос. Спасибо большое! – nahung89

 Смежные вопросы

  • Нет связанных вопросов^_^