2015-08-07 9 views
10

Sto seguendo l'unica risposta che questo ha sulla SO -Interruttore fronte/retro macchina fotografica con AVCaptureSession

Switch cameras with avcapturesession

Tuttavia cameraWithPosition non sembra funzionare. Deprecato?

//Get new input 
    AVCaptureDevice *newCamera = nil; 
    if(((AVCaptureDeviceInput*)currentCameraInput).device.position == AVCaptureDevicePositionBack) 
    { 
     newCamera = [self cameraWithPosition:AVCaptureDevicePositionFront]; 
    } 
    else 
    { 
     newCamera = [self cameraWithPosition:AVCaptureDevicePositionBack]; 
    } 
+0

'cameraWithPosition' è un metodo personalizzato, controllare la mia risposta per questo. :) – 0yeoj

risposta

12

Quello che dovete fare è riconfigurare il AVCaptureSession

Qui è quello che sto usando:

// note that `AVCaptureSession * session` 
// 
if(session) 
{ 
    [session beginConfiguration]; 

    AVCaptureInput *currentCameraInput = [session.inputs objectAtIndex:0]; 

    [session removeInput:currentCameraInput]; 

    AVCaptureDevice *newCamera = nil; 

    if(((AVCaptureDeviceInput*)currentCameraInput).device.position == AVCaptureDevicePositionBack) 
    { 
     newCamera = [self cameraWithPosition:AVCaptureDevicePositionFront]; 
    } 
    else 
    { 
     newCamera = [self cameraWithPosition:AVCaptureDevicePositionBack]; 
    } 

    NSError *err = nil; 

    AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:newCamera error:&err]; 

    if(!newVideoInput || err) 
    { 
     NSLog(@"Error creating capture device input: %@", err.localizedDescription); 
    } 
    else 
    { 
     [session addInput:newVideoInput]; 
    } 

    [session commitConfiguration]; 
} 

// make sure you have this method in your class 
// 
- (AVCaptureDevice *)cameraWithPosition:(AVCaptureDevicePosition)position 
{ 
    NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; 

    for (AVCaptureDevice *device in devices) 
    { 
     if ([device position] == position) 
      return device; 
    } 
    return nil; 
} 
+0

Questo è esattamente quello che ho ... probabilmente lo abbiamo preso dallo stesso link. Continua a darmi questo "No visible @interface --- selector" cameraWithPosition: "". – durazno

+0

@durazno, probabilmente, hihi ... dai un'occhiata a '- (AVCaptureDevice *) cameraWithPosition: (AVCaptureDevicePosition) position' check (*) o forse hai perso qualcosa .. Puoi mostrarci come implementa' cameraWithPosition: '? – 0yeoj

+0

Ahhh, in realtà dobbiamo implementare il metodo cameraWithPosition ... Ho pensato che fosse appena arrivato con AVFoundation ... Ok ora ce l'ho fatta. Grazie! – durazno

1

Ecco un esempio per l'utilizzo di switch con una sessione video:

.h 

UIViewController<AVCaptureFileOutputRecordingDelegate> 

@property(nonatomic,strong) AVCaptureSession *CaptureSession; 
@property(nonatomic,strong) AVCaptureMovieFileOutput *MovieFileOutput; 
@property(nonatomic,strong) AVCaptureDeviceInput *VideoInputDevice; 

- (void) CameraSetOutputProperties; 
- (AVCaptureDevice *) CameraWithPosition:(AVCaptureDevicePosition) Position; 

Poi:

.m 

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    CaptureSession = [[AVCaptureSession alloc] init]; 

    //etc 


} 

- (IBAction)CameraToggle:(id)sender 
{ 
    if ([[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] count] > 1)  //Only do if device has multiple cameras 
    { 
     NSError *error; 
     //AVCaptureDeviceInput *videoInput = [self videoInput]; 
     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]; 
      } 

      //Set the connection properties again 
      [self CameraSetOutputProperties]; 


      [CaptureSession commitConfiguration]; 
     } 
    } 
} 
+0

Da dove viene il metodo cameraWithPosition ??? È da qualche biblioteca che non conosco? – durazno

+0

- (AVCaptureDevice *) CameraWithPosition: posizione (AVCaptureDevicePosition); che è dichiarato nell'intestazione. È un metodo per restituire il dispositivo in base alla posizione di acquisizione corrente. Niente di troppo elegante. –

3

In Swift 3,0

/// Swap camera and reconfigures camera session with new input 
fileprivate func swapCamera() { 

    // Get current input 
    guard let input = cameraSession.inputs[0] as? AVCaptureDeviceInput else { return } 

    // Begin new session configuration and defer commit 
    cameraSession.beginConfiguration() 
    defer { cameraSession.commitConfiguration() } 

    // Create new capture device 
    var newDevice: AVCaptureDevice? 
    if input.device.position == .back { 
     newDevice = captureDevice(with: .front) 
    } else { 
     newDevice = captureDevice(with: .back) 
    } 

    // Create new capture input 
    var deviceInput: AVCaptureDeviceInput! 
    do { 
     deviceInput = try AVCaptureDeviceInput(device: newDevice) 
    } catch let error { 
     print(error.localizedDescription) 
     return 
    } 

    // Swap capture device inputs 
    cameraSession.removeInput(input) 
    cameraSession.addInput(deviceInput) 
} 

/// Create new capture device with requested position 
fileprivate func captureDevice(with position: AVCaptureDevicePosition) -> AVCaptureDevice? { 

    let devices = AVCaptureDeviceDiscoverySession(deviceTypes: [ .builtInWideAngleCamera, .builtInMicrophone, .builtInDualCamera, .builtInTelephotoCamera ], mediaType: AVMediaTypeVideo, position: .unspecified).devices 

    if let devices = devices { 
     for device in devices { 
      if device.position == position { 
       return device 
      } 
     } 
    } 

    return nil 
} 
Problemi correlati