2013-11-26 1 views
5

Возможный дубликат iPhone: AVCaptureSession capture output crashing (AVCaptureVideoDataOutput)AVCaptureSession выход захвата Грохот (AVCaptureVideoDataOutput) в IOS7

Я создал приложение с пользовательской камеры whih используется для записи видео. С помощью AVCaptureSession и AVCaptureVideoDataOutput я получил записанный видеофайл. Все отлично работает для IOS 6 и более низкой версии. но когда я запускаю того же приложение на устройстве с применением IOS7 является сбоем при deallocating класса камеры с этой проблемой ...

thread #1: tid = 0x7994, 0x3b1eab26 libobjc.A.dylib`objc_msgSend + 6, stop reason = EXC_BAD_ACCESS (code=1, address=0x7000000c) 
    frame #0: 0x3b1eab26 libobjc.A.dylib`objc_msgSend + 6 
    frame #1: 0x2fa46654 AVFoundation`-[AVCaptureVideoDataOutput _applyOverridesToCaptureOptions:] + 172 
    frame #2: 0x3387b050 UIKit` stub helpers + 27224 

код, который я использую для настройки вывода видео данных -

[_captureSession beginConfiguration]; 

     if([_captureSession canAddInput:_captureDeviceInputAudio]) 
      [_captureSession addInput:_captureDeviceInputAudio]; 

     _captureOutputAudio = [[AVCaptureAudioDataOutput alloc] init] ; 
     if([_captureSession canAddOutput:_captureOutputAudio]) 
      [_captureSession addOutput:_captureOutputAudio]; 


     _captureDeviceVideo = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
     _captureDeviceInputVideo = [AVCaptureDeviceInput deviceInputWithDevice:_captureDeviceVideo error:&error]; 


     if([_captureSession canAddInput:_captureDeviceInputVideo]) 
      [_captureSession addInput:_captureDeviceInputVideo]; 

     _captureOutputVideo = [[AVCaptureVideoDataOutput alloc] init] ; 

     if([_captureSession canAddOutput:_captureOutputVideo]) 
      [_captureSession addOutput:_captureOutputVideo]; 




      [_captureOutputAudio setSampleBufferDelegate:self queue:_captureVideoDispatchQueue]; 
      [_captureOutputVideo setSampleBufferDelegate:self queue:_captureVideoDispatchQueue]; 
      dispatch_release(_captureSessionDispatchQueue); 
      dispatch_release(_captureVideoDispatchQueue); 



      NSString *sessionPreset = [_captureSession sessionPreset]; 
      AVCaptureConnection *videoConnection = [_captureOutputVideo connectionWithMediaType:AVMediaTypeAudio]; 

      [self _setOrientationForConnection:videoConnection]; 

      // setup stabilization, if available 
      if ([videoConnection isVideoStabilizationSupported]) 
       [videoConnection setEnablesVideoStabilizationWhenAvailable:YES]; 

      // setup pixel format 
      NSDictionary *videoSettings = [[NSDictionary alloc] initWithObjectsAndKeys: 
              [NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange], (id)kCVPixelBufferPixelFormatTypeKey, 
              nil]; 
      [_captureOutputVideo setVideoSettings:videoSettings]; 

      // discard late frames 
      [_captureOutputVideo setAlwaysDiscardsLateVideoFrames:NO]; 

      // setup video to use 640 x 480 for the hightest quality touch-to-record 
      if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset640x480]) 
       sessionPreset = AVCaptureSessionPreset640x480; 

      // set the framerate and preset 
      CMTime frameDuration = CMTimeMake(1, 30); 
      if (videoConnection.supportsVideoMinFrameDuration) 
       videoConnection.videoMinFrameDuration = frameDuration; // needs to be applied to session in iOS 7 
      if (videoConnection.supportsVideoMaxFrameDuration) 
       videoConnection.videoMaxFrameDuration = frameDuration; 

Я не понял, почему это происходит для IOS7, а на нижней версии - отлично. Нужна помощь вам, ребята. Заранее спасибо.

ответ

2

Для меня я удаляю все аудио и видео входы и выходы, которые я добавил в сеансе в методе viewDidUnload перед любой строкой этого метода. Теперь он отлично работает во всех версиях IOS. для удаления вводов/выходов

[_captureSession removeInput:_captureDeviceInputAudio]; 
    [_captureSession removeOutput:_captureOutputAudio];