2015-08-07 3 views
10

Я следую единственный ответ, это имеет на SO -Переключатель передняя/задняя камера с AVCaptureSession

Switch cameras with avcapturesession

Однако cameraWithPosition не похоже на работу. Устаревшие?

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

'cameraWithPosition' является заказным методом, проверьте мой ответ на этот вопрос. :) – 0yeoj

ответ

12

Что вам нужно сделать, это изменить конфигурацию AVCaptureSession

Здесь это то, что я использую:

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

Это именно то, что у меня есть ... мы, вероятно, взяли его по той же ссылке. Он продолжает давать мне эту «Нет видимой @interface --- selector» cameraWithPosition: ». – durazno

+0

@ durazno, вероятно, hihi .. взгляните на камеру '- (AVCaptureDevice *) CameraWithPosition: (AVCaptureDevicePosition) position' проверьте (*) или, возможно, вы что-то пропустили. Можете ли вы показать нам, как вы реализуете' cameraWithPosition: '? – 0yeoj

+0

Ahhh мы действительно должны реализовать метод cameraWithPosition ... Я думал, что он просто появился с AVFoundation ... Хорошо, теперь это получилось. Благодаря! – durazno

1

Вот пример использования переключателя с видео сессии:

.h 

UIViewController<AVCaptureFileOutputRecordingDelegate> 

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

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

Тогда:

.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

Где работает метод CameraWithPosition? Это из какой-то библиотеки, о которой я не знаю? – durazno

+0

- (AVCaptureDevice *) CameraWithPosition: (AVCaptureDevicePosition) Позиция; который объявляется в заголовке. Это метод возврата устройства на основе текущей позиции захвата. Ничего особенного. –

3

В 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 
} 
Смежные вопросы