Переключите переднюю / заднюю камеру с помощью AVCaptureSession

Я следую единственному ответу на SO –

Переключить камеры с avcapturesession

Однако CameraWithPosition не работает. Устаревшие?

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

Что вам нужно сделать, это перенастроить вашу 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; } 

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

Ниже приведен пример использования коммутатора с сеансом видео:

 .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]; } } } 
  • Как записать видео на iOS без использования предустановки?
  • Почему запись и воспроизведение видео с AVCaptureSession, AVAssetWriter и AVPlayer заикаются?
  • Преобразовать CMSampleBufferRef в UIImage с цветовым пространством YUV?
  • Упрощенный захват экрана: записывать видео только то, что появляется в слоях UIView?
  • appendPixelBuffer возвращает NO для kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
  • Ошибка компилятора Swift: не может вызвать 'lockForConfiguration' с помощью списка аргументов типа '(() -> ())'
  • iOS для фокусировки
  • Позволяет воспроизводить музыку во время записи видео, как snapchat ios
  • Сканирование штрих-кодов AVCaptureSession
  • Сохранение видео в неправильной ориентации AVCaptureSession
  • Результат AVCaptureMovieFileOutput отличается от того, что видно в AVCaptureVideoPreviewLayer при увеличении с включенной стабилизацией
  • Interesting Posts

    Создание popover на iPhone?

    iOS 7 – сообщение, отправленное на освобожденный экземпляр 0x15d17cc0

    MKMapView по умолчанию или копировать / дублировать начальное состояние?

    TabBarController: ориентация просмотров в разных ориентациях

    Скрыть ярлык при подключении UITableView Cell

    «Строка? не конвертируется в «NSString» (после миграции Xcode 7)

    Image Manipulation Filter, например, баланс белого, экспозиция, разделение тона и т. Д. На IOS

    Текст UILabel отключается

    Inhereted project .. NSLog не печатает на консоль

    UITableViewCell с UITextField теряют возможность выбора строки UITableView?

    Как добавить изображение к кнопке удаления UITableViewCell

    Удалить элемент в массиве без жесткого кодирования индекса? в Свифт

    IOS. OpenGL. Несколько представлений одновременно

    Как я могу использовать библиотеку PoDoFo для аннотирования PDF-файлов на iOS?

    CIImage пуст при попытке использовать его с текстурой, полученной из кадра видеофайла

    Давайте будем гением компьютера.