2016-05-13 76 views
1

使用AVFoundation,我卡在從後排到前排從前到後更換相機。
爲此我使用以下代碼。攝像頭在ios中沒有變化

- (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]返回總是假,所以相機不會改變。 我沒有明白爲什麼會話無法添加新的輸入設備。

請幫我解決這個問題。

在此先感謝。

+0

您需要添加新的人之前先刪除以前的輸入。在這裏檢查 – stefos

+0

@stefos,那麼我在代碼中['CaptureSession removeInput:VideoInputDevice]中寫入的語句的效果是什麼?' – DeathStroke

回答

0
AVCaptureVideoPreviewLayer *captureVideoPreviewLayer; 
bool isUsingFrontFacingCamera; 

方法:

- (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

從會話中刪除所有inputDevice沒有任何區別。我在張貼之前已經過測試。 – DeathStroke

+0

這就像一個魅力 – incmiko