1

编辑:如果应用程序在后台运行,则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 得到了一个提示:它在锁屏上有音乐控制,而我的应用程序没有。

在此处输入图像描述

这是我的配置代码AVAudioSessionAVAudioRecorder

- (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];
    }
}

如果您能提供任何信息,我将不胜感激。谢谢大佬!

4

1 回答 1

1

您必须设置您AVAudioSession喜欢的类别

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

这样它就会在设备锁定时录制音频。

正如医生所说

要在应用转换到后台时(例如,屏幕锁定时)继续录制音频,请将音频值添加到信息属性列表文件中的 UIBackgroundModes 键。

还要检查这个链接

屏幕锁定时 AVAudioRecorder 不录制

于 2015-09-10T11:31:40.607 回答