2015-06-04 14 views
9
związane błąd

Xcode/iOS 8/AVFoundation w konsoli:iOS: błąd w __connection_block_invoke_2: Połączenie przerwane

error in __connection_block_invoke_2: Connection interrupted 

jestem po prostu dodając AVCaptureVideoDataOutput do Apple próbki app 'AVCamManualUsingtheManualCaptureAPI'

Co dodałem było:

// CoreImage wants BGRA pixel format 
    NSDictionary *outputSettings = @{ (id)kCVPixelBufferPixelFormatTypeKey : [NSNumber numberWithInteger:kCVPixelFormatType_32BGRA]}; 

    // create and configure video data output 
    AVCaptureVideoDataOutput *videoDataOutput = [[AVCaptureVideoDataOutput alloc] init]; 
    videoDataOutput.videoSettings = outputSettings; 
    videoDataOutput.alwaysDiscardsLateVideoFrames = YES; 
    [videoDataOutput setSampleBufferDelegate:self queue:sessionQueue]; 

Przede fragmencie włożona do przykładowego projektu:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

    self.recordButton.layer.cornerRadius = self.stillButton.layer.cornerRadius = self.cameraButton.layer.cornerRadius = 4; 
    self.recordButton.clipsToBounds = self.stillButton.clipsToBounds = self.cameraButton.clipsToBounds = YES; 

    // Create the AVCaptureSession 
    AVCaptureSession *session = [[AVCaptureSession alloc] init]; 
    [self setSession:session]; 

    // Set up preview 
    [[self previewView] setSession:session]; 

    // Check for device authorization 
    [self checkDeviceAuthorizationStatus]; 

    // In general it is not safe to mutate an AVCaptureSession or any of its inputs, outputs, or connections from multiple threads at the same time. 
    // Why not do all of this on the main queue? 
    // -[AVCaptureSession startRunning] is a blocking call which can take a long time. We dispatch session setup to the sessionQueue so that the main queue isn't blocked (which keeps the UI responsive). 

    dispatch_queue_t sessionQueue = dispatch_queue_create("session queue", DISPATCH_QUEUE_SERIAL); 
    [self setSessionQueue:sessionQueue]; 

    dispatch_async(sessionQueue, ^{ 
     [self setBackgroundRecordingID:UIBackgroundTaskInvalid]; 

     NSError *error = nil; 

     AVCaptureDevice *videoDevice = [AAPLCameraViewController deviceWithMediaType:AVMediaTypeVideo preferringPosition:AVCaptureDevicePositionBack]; 
     AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; 

     if (error) 
     { 
      NSLog(@"%@", error); 
     } 

     [[self session] beginConfiguration]; 

     if ([session canAddInput:videoDeviceInput]) 
     { 
      [session addInput:videoDeviceInput]; 
      [self setVideoDeviceInput:videoDeviceInput]; 
      [self setVideoDevice:videoDeviceInput.device]; 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       // Why are we dispatching this to the main queue? 
       // Because AVCaptureVideoPreviewLayer is the backing layer for our preview view and UIView can only be manipulated on main thread. 
       // Note: As an exception to the above rule, it is not necessary to serialize video orientation changes on the AVCaptureVideoPreviewLayer’s connection with other session manipulation. 

       [[(AVCaptureVideoPreviewLayer *)[[self previewView] layer] connection] setVideoOrientation:(AVCaptureVideoOrientation)[self interfaceOrientation]]; 
      }); 
     } 

     AVCaptureDevice *audioDevice = [[AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio] firstObject]; 
     AVCaptureDeviceInput *audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error]; 

     if (error) 
     { 
      NSLog(@"%@", error); 
     } 

     if ([session canAddInput:audioDeviceInput]) 
     { 
      [session addInput:audioDeviceInput]; 
     } 

     AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; 
     if ([session canAddOutput:movieFileOutput]) 
     { 
      [session addOutput:movieFileOutput]; 
      AVCaptureConnection *connection = [movieFileOutput connectionWithMediaType:AVMediaTypeVideo]; 
      if ([connection isVideoStabilizationSupported]) 
      { 
       [connection setEnablesVideoStabilizationWhenAvailable:YES]; 
      } 
      [self setMovieFileOutput:movieFileOutput]; 
     } 

     AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; 
     if ([session canAddOutput:stillImageOutput]) 
     { 
      [stillImageOutput setOutputSettings:@{AVVideoCodecKey : AVVideoCodecJPEG}]; 
      [session addOutput:stillImageOutput]; 
      [self setStillImageOutput:stillImageOutput]; 
     } 
      // CoreImage wants BGRA pixel format 
NSDictionary *outputSettings = @{ (id)kCVPixelBufferPixelFormatTypeKey : [NSNumber numberWithInteger:kCVPixelFormatType_32BGRA]}; 

// create and configure video data output 
AVCaptureVideoDataOutput *videoDataOutput = [[AVCaptureVideoDataOutput alloc] init]; 
videoDataOutput.videoSettings = outputSettings; 
videoDataOutput.alwaysDiscardsLateVideoFrames = YES; 
[videoDataOutput setSampleBufferDelegate:self queue:sessionQueue]; 

     [[self session] commitConfiguration]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self configureManualHUD]; 
     }); 
    }); 

    self.manualHUDFocusView.hidden = YES; 
    self.manualHUDExposureView.hidden = YES; 
    self.manualHUDWhiteBalanceView.hidden = YES; 
} 

otrzymuję 'Błąd w __connection_block_invoke_2: Połączenie przerwane', a także ...

-(void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 

..delegate nigdy nie jest wywoływana.

Wszystko, co próbuję zrobić, to zmodyfikować kod, aby wyświetlać filtry obrazów podstawowych na żywo.

+1

Wygląda na to, że nie jest dupą, ponieważ obie odpowiedzi są zupełnie inne. to pytanie skupia się na poprawce dla konkretnej wersji problemu, podczas gdy inne pytanie koncentruje się bardziej na tym, dlaczego. – Crashalot

+0

Tak, to nie jest duplikat i powyższe pytanie nie jest akceptowane przez osobę pytającą. –

+0

Odpowiedź na drugie pytanie odpowiada tylko na część o "Ostrzeżeniu o odebranej pamięci", a nie o błędzie "__connection_block_invoke_2". – RenniePet

Odpowiedz

6

Naprawiłem problem.

Nie można jednocześnie używać AVCaptureMovieFileOutput i AVCaptureVideoDataOutput. Wyjąłem AVCaptureMovieFileOutput, a delegata AVCaptureVideoDataOutput zostało wywołane.