2015-08-07 13 views
10

Obserwuję tylko odpowiedź ta ma na SO -Przełącznik przód/tył kamera z AVCaptureSession

Switch cameras with avcapturesession

Jednak cameraWithPosition nie wydają się działać. Przestarzałe?

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

'cameraWithPosition' jest dostosowane metoda, sprawdź moją odpowiedź na to. :) – 0yeoj

Odpowiedz

12

Co trzeba zrobić, to przekonfigurować AVCaptureSession

Tutaj jest to, czego używam:

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

To jest dokładnie to, co mam ... prawdopodobnie wzięliśmy to z tego samego łącza. Wciąż daje mi to "Brak widocznego @interface --- selektora" cameraWithPosition: "". – durazno

+0

@durazno, prawdopodobnie hihi .. spójrz na pozycję '- (AVCaptureDevice *) cameraWithPosition: (pozycja AVCaptureDevicePosition)' sprawdź (*) lub może coś przeoczyłeś .. Czy możesz pokazać nam, jak implementujesz 'cameraWithPosition: '? – 0yeoj

+0

Ahhh musimy faktycznie wdrożyć metodę CameraWithPosition ... Pomyślałem, że przyszedł z AVFoundation ... Ok teraz to dostałem. Dzięki! – durazno

1

Oto przykład za pomocą przełącznika z sesji wideo:

.h 

UIViewController<AVCaptureFileOutputRecordingDelegate> 

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

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

wówczas:

.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

Skąd pochodzi metoda cameraWithPosition? Czy to z jakiejś biblioteki, o której nie wiem? – durazno

+0

- (AVCaptureDevice *) CameraWithPosition: (AVCaptureDevicePosition) Pozycja; który jest zadeklarowany w nagłówku. Jest to metoda zwracania urządzenia na podstawie aktualnej pozycji przechwytywania. Nic nadzwyczajnego. –

3

w 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 
}