2016-05-13 16 views
1

Mit AVFoundation, ich bin bei einem Wechsel Kamera von hinten nach vorne stecken und vorne nach hinten.
Dafür verwende ich folgenden Code.
Kamera verändert sich nicht ios in

- (IBAction)CameraToggleButtonPressed:(id)sender 
{ 
    if ([[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] count] > 1)   
    { 
     NSError *error; 
     AVCaptureDeviceInput *NewVideoInput; 
     AVCaptureDevicePosition position = [[VideoInputDevice device] position]; 
     if (position == AVCaptureDevicePositionBack) 
     { 
      NewVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self CameraWithPosition:AVCaptureDevicePositionFront] error:&error]; 
     } 
     else if (position == AVCaptureDevicePositionFront) 
     { 
      NewVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self CameraWithPosition:AVCaptureDevicePositionBack] error:&error]; 
     } 
     if (NewVideoInput != nil) 
     { 
      [CaptureSession beginConfiguration];      [CaptureSession removeInput:VideoInputDevice]; 
      if ([CaptureSession canAddInput:NewVideoInput]) 
      { 
       [CaptureSession addInput:NewVideoInput]; 
       VideoInputDevice = NewVideoInput; 
      } 
      else 
      { 
       [CaptureSession addInput:VideoInputDevice]; 
      } 
      [self CameraSetOutputProperties]; 
      [CaptureSession commitConfiguration]; 
     } 
    } 
} 

[CaptureSession canAddInput:NewVideoInput] kehrt immer falsch, so wird die Kamera nicht ändern. Ich bekomme keinen Punkt, warum die Sitzung kein neues Eingabegerät hinzufügen kann.

Bitte helfen Sie mir, dieses Problem zu lösen.

Vielen Dank im Voraus.

+0

Sie müssen die vorherige Eingabe entfernen, bevor neue hinzufügen. Überprüfen Sie hier – stefos

+0

@stefos, was wird die Wirkung der Anweisung sein, schrieb ich in Code '[CaptureSession removeInput: VideoInputDevice];' – DeathStroke

Antwort

0
AVCaptureVideoPreviewLayer *captureVideoPreviewLayer; 
bool isUsingFrontFacingCamera; 

Methode:

- (void) switchCam{ 

    if (![self cameraIsRunning]) 
     return; 

    AVCaptureDevicePosition desiredPosition; 

    if (isUsingFrontFacingCamera) 
     desiredPosition = AVCaptureDevicePositionBack; 
    else 
     desiredPosition = AVCaptureDevicePositionFront; 

    for (AVCaptureDevice *d in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) { 

     if ([d position] == desiredPosition) { 

      [[captureVideoPreviewLayer session] beginConfiguration]; 

      AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:d error:nil]; 

      for (AVCaptureInput *oldInput in [[captureVideoPreviewLayer session] inputs]) { 
       [[captureVideoPreviewLayer session] removeInput:oldInput]; 
      } 

      [[captureVideoPreviewLayer session] addInput:input]; 
      [[captureVideoPreviewLayer session] commitConfiguration]; 

      break; 
     } 
    } 

    isUsingFrontFacingCamera = !isUsingFrontFacingCamera; 
} 

- (bool) cameraIsRunning{ 

    return [session isRunning]; 
} 
+0

Entfernung aller EingabeDevice von Sitzung macht keinen Unterschied. Ich habe es bereits getestet, bevor ich hier gepostet habe. – DeathStroke

+0

Das funktioniert wie ein Zauber – incmiko