Ios 进入背景时停止摄像机录制并保存文件

Ios 进入背景时停止摄像机录制并保存文件,ios,camera,avcapturesession,avcapturemoviefileoutput,Ios,Camera,Avcapturesession,Avcapturemoviefileoutput,我已经找了两天的答案了,但我似乎找不到正确的答案 我有一个示例应用程序,它使用AVCaptureSession和AVCaptureMovieFileOutput从设备录制音频和视频 当我开始录音时,我呼叫: [self.movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self]; 然后它开始记录到文件中。如果我再按一下按钮,它就会停止录音 [self.movieFileOutput stopRe

我已经找了两天的答案了,但我似乎找不到正确的答案

我有一个示例应用程序,它使用AVCaptureSession和AVCaptureMovieFileOutput从设备录制音频和视频

当我开始录音时,我呼叫:

[self.movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];
然后它开始记录到文件中。如果我再按一下按钮,它就会停止录音

[self.movieFileOutput stopRecording];
一切正常,但当我进入后台(来电或HOME press)时,我在委托方法中得到一个错误:didFinishRecordingToOutputFileAttribute

我希望的操作应该是在进入后台时保存/完成文件。如果我在“ApplicationIdentinterBackground”上调用stopRecording,它将在调用ApplicationIdentinterBackground之前进入后台。在进入活动状态时,它被称为。。。。并生成错误并留下损坏的电影文件

看来它没有足够的时间来保存文件

我错过了什么

这是我的错误

Error Domain=AVFoundationErrorDomain code=-11818“录制已停止”UserInfo=0x17594e20{nsLocalizedRecoverysSuggestion=停止使用录制设备的任何其他操作,然后重试。NSUnderlyingError=0x175d3500“操作无法完成。(OSStatus错误-16133。)”,NSLocalizedDescription=录制已停止}

AVErrorSessionWasInterrupted = -11818

NSOperationQueue
是执行多线程任务的推荐方法,以避免阻塞主线程。后台线程用于在应用程序处于非活动状态时执行的任务,如GPS指示或音频流

如果应用程序在前台运行,则根本不需要后台线程

对于简单任务,可以使用块将操作添加到队列:

NSOperationQueue* operationQueue = [[NSOperationQueue alloc] init];
[operationQueue addOperationWithBlock:^{
    // Perform long-running tasks without blocking main thread
}];
更多关于和的信息


您可以在
应用程序willresignactive:
中处理保存,然后您可以在后台继续您的过程。

这不起作用,我必须确保会话在进入后台时不会中断。然后您必须创建另一个线程。。当线程进入后台时,您必须处理该线程。检查,应用程序WillResignActive没有给我足够的时间进行处理。在Melih Büyükbayram,确实如此@米切尔:我想说同样的话。我看不出他的答案。我也试过苹果的AVDemo应用程序,它也给出了同样的错误。似乎无论如何都会抛出错误。不同之处在于,在苹果的代码中,他们有时间使用UIBackgroundTaskIdentifier执行大量代码这是我的做法。我确实从苹果的示例代码中实现了这段代码,但我犯了一个愚蠢的错误。。。每次保存电影时,文件扩展名都会更改,因此看起来已损坏-对我来说是1。。。。。。
- (void)applicationWillResignActive:(UIApplication *)application {
    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{

      // Wait until the pending operations finish
      [operationQueue waitUntilAllOperationsAreFinished];

      [application endBackgroundTask: bgTask];
      bgTask = UIBackgroundTaskInvalid;
    }]; 
}