2016-05-13 13 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]は常にfalseを返します。したがって、カメラは変更されません。 セッションで新しい入力デバイスを追加できないという理由はありません。

この問題を解決するのを手伝ってください。

ありがとうございます。

+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