2015-10-22 2 views
0

Я поторопил массу времени, поэтому я подумал, что буду репонировать.AVCaptureSession didFinishRecordingToOutputFileAtURL: не вызывается, когда происходит прерывание (например, центр управления)

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

Это прекрасно работает до тех пор, пока приложение не будет вставлено на задний план, центр управления не будет поднят или не произойдет перерыв, например, будильник/звонок. В зависимости от аппаратного обеспечения устройства мы видим различную ошибку.

  • На старых устройствах сеанс захвата не сможет начать запись после такого события, даже если мы повторно инициализируем captureSession.
  • На новых устройствах существующее видео, если оно существует, будет прекрасным, но любые последующие попытки возобновить запись либо прекратятся, либо не будут записывать звук.

В первой ситуации didStartRecordingToOutputFileAtURL: никогда не будет вызван. Во второй ситуации будет вызываться didStartRecordingToOutputFileAtURL: но didFinishRecordingToOutputFileAtURL: не будет.

В настоящее время мы делаем это:

- (void)viewDidLoad { 
    [self initializeCaptureSessionAndOutputData]; //based on your requirements 
} 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self.captureSession startRunning]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interruptionDidOccur) 
               name:UIApplicationWillResignActiveNotification 
              object:nil]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [self.captureSession stopRunning]; 
    [[NSNotificationCenter] defaultCenter] removeObserver:self]; 
} 

- (void)interruptionDidOccur { 
    [self.movieFileOutput stopRecording]; //expect didFinishRecordingToOutputFileAtURL to be called 
} 

ответ

0

Проблема документированы, но решаемая. Помимо вызова

[self.captureSession stopRunning]

в viewWillDisappear: она должна вызываться всякий раз, когда уведомление UIApplicationWillResignActiveNotification обжигают тоже. Вот пример кода:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self handleAppReturn]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(becameActive) 
              name:UIApplicationDidBecomeActiveNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resignActive) 
              name:UIApplicationWillResignActiveNotification 
              object:nil]; 
} 

- (void)resignActive { 
    [self.videoCameraManager.captureSession stopRunning]; 
    if (!self.isPaused) { 
     [self pauseVideo]; 
    } 
} 

- (void)becameActive { 
    [self.videoCameraManager.captureSession startRunning]; 
} 
Смежные вопросы