0

アプリがバックグラウンドで動作している間 (バックグラウンド モードにオーディオを追加)、録音を行っています。無期限に録音され、バックグラウンドでもアプリはアクティブなままです。

アプリをバックグラウンドでアクティブなままにし、30 分ごとに 30 秒間のサウンド クリップを録音できるようにしたいと考えています。

のメソッドNSTimerと組み合わせて使用​​しようとしましたが、起動する前にアプリが強制終了されます。何か案は?AVAudioRecorderrecordForDuration:NSTimer

次のコードはバックグラウンドで動作し、5 秒ごとに 5 秒間記録しますが、scheduledTimerWithTimeInterval を 1 分に増やすと動作しません。

- (void)viewDidLoad
{
    [super viewDidLoad];



    // retrieve avaudiosession instance
    _session = [ AVAudioSession sharedInstance];
    // set category
    NSError *errRet;
    [_session setCategory:AVAudioSessionCategoryPlayAndRecord error:&errRet];
    [_session setActive:YES error:&errRet];


    NSArray *dirPaths;
    NSString *docsDir;

    dirPaths = NSSearchPathForDirectoriesInDomains(
                                                   NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir = dirPaths[0];

    NSString *soundFilePath = [docsDir
                               stringByAppendingPathComponent:@"sound.caf"];

    NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];

    NSDictionary *recordSettings = [NSDictionary
                                    dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithInt:AVAudioQualityMin],
                                    AVEncoderAudioQualityKey,
                                    [NSNumber numberWithInt:16],
                                    AVEncoderBitRateKey,
                                    [NSNumber numberWithInt: 2],
                                    AVNumberOfChannelsKey,
                                    [NSNumber numberWithFloat:44100.0],
                                    AVSampleRateKey,
                                    nil];

    NSError *error = nil;

    _audioRecorder = [[AVAudioRecorder alloc]
                      initWithURL:soundFileURL
                      settings:recordSettings
                      error:&error];

    if (error)
    {
        NSLog(@"error: %@", [error localizedDescription]);
    } else {
        [self recordAudio];
        NSTimer* timer;
        timer=[NSTimer scheduledTimerWithTimeInterval: 10.0 target:self selector:@selector(recordAudio) userInfo:nil repeats: YES];
        NSLog(@"timer fired");
    }
}


- (IBAction)recordAudio{

    if (!_audioRecorder.recording)
    {
        NSError *errRet;
        [_session setCategory:AVAudioSessionCategoryRecord error:&errRet];
        [_session setActive:YES error:&errRet];
        //_play.enabled = NO;
        [_audioRecorder recordForDuration:5.0];
        NSLog(@"Finished Recording");
    }
}
4

1 に答える 1

0

Skype がこれを行うので、あなたもできます。

Info.plist で UIBackgroundModesaudio を設定する必要があり、アプリを切り替える前に、オーディオ セッションがアクティブ/実行中/その他であることを確認する必要があります (アプリがいつ録音/再生/再生を突然開始しないことを前提としています)。背景にあります)。

ドキュメントによると、「オーディオ」を使用するとバックグラウンドでオーディオを再生できますが、おそらくこれはオーディオの録音にも当てはまります。うまくいかない場合は、次の方法を試してみてください。

  • 「voip」と「audio」の両方を設定します。
  • 無音を再生します (これは、Audio Queue API を使用するのが最も簡単かもしれません)。
于 2013-06-12T04:14:14.723 に答える