trasera tiempo samsung pasar mismo mientras grabas grabar frontal doble delantera como cambiar camara ios swift avfoundation avcapturedevice

ios - tiempo - grabar doble camara android



Cómo obtener cámara frontal, cámara trasera y audio con AVCaptureDeviceDiscoverySession (8)

Aquí está mi código (Swift 3) para obtener la posición de la cámara:

// Find a camera with the specified AVCaptureDevicePosition, returning nil if one is not found func cameraWithPosition(_ position: AVCaptureDevicePosition) -> AVCaptureDevice? { if let deviceDescoverySession = AVCaptureDeviceDiscoverySession.init(deviceTypes: [AVCaptureDeviceType.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.unspecified) { for device in deviceDescoverySession.devices { if device.position == position { return device } } } return nil }

Si lo desea, también puede obtener los nuevos tipos de dispositivos desde el iPhone 7+ (cámara dual) cambiando la matriz de tipos de dispositivos.

Aquí hay una buena lectura: https://forums.developer.apple.com/thread/63347

Antes de que saliera iOS 10, estaba usando el siguiente código para obtener la captura de video y audio para mi grabadora de video:

for device in AVCaptureDevice.devices() { if (device as AnyObject).hasMediaType( AVMediaTypeAudio ) { self.audioCapture = device as? AVCaptureDevice } else if (device as AnyObject).hasMediaType( AVMediaTypeVideo ) { if (device as AnyObject).position == AVCaptureDevicePosition.back { self.backCameraVideoCapture = device as? AVCaptureDevice } else { self.frontCameraVideoCapture = device as? AVCaptureDevice } } }

Cuando finalmente salió el iOS 10, recibí la siguiente advertencia cuando estaba ejecutando mi código. Tenga en cuenta que mi grabadora de video seguía funcionando sin problemas durante aproximadamente 2 semanas.

''devices ()'' quedó en desuso en iOS 10.0: En su lugar, use AVCaptureDeviceDiscoverySession.

Cuando estaba ejecutando mi código esta mañana, mi grabadora de video dejó de funcionar. xCode8 no me da ningún error pero el previewLayer para la captura de la cámara es completamente blanco. Cuando empiezo a grabar recibo el siguiente error:

Error Domain = AVFoundationErrorDomain Code = -11800 "No se pudo completar la operación" UserInfo = {NSLocalizedDescription = La operación no se pudo completar, NSUnderlyingError = 0x17554440 {Error Domain = NSOSStatusErrorDomain Code = -12780 "(null)"), NSLocalizedFail ocurrió un error desconocido (-12780)}

Creo que tiene algo que ver con el hecho de que estoy usando el enfoque en desuso AVCaptureDevice.devices() . Por lo tanto, me preguntaba cómo usar AVCaptureDeviceDiscoverySession en AVCaptureDeviceDiscoverySession lugar?

¡De forma anticipada, muchas gracias por su ayuda!


Ejemplo: iOS 11 Swift 4

override func viewDidLoad() { super.viewDidLoad() // Get the back-facing camera for capturing videos // AVCaptureDevice.default(.builtInWideAngleCamera, for: AVMediaType.video, position: .back) let deviceDiscoverySession = AVCaptureDevice.default(.builtInWideAngleCamera, for: AVMediaType.video, position: .back) guard let captureDevice = deviceDiscoverySession else { print("Failed to get the camera device") return } do { // Get an instance of the AVCaptureDeviceInput class using the previous device object. let input = try AVCaptureDeviceInput(device: captureDevice) // Set the input device on the capture session. captureSession.addInput(input) } catch { // If any error occurs, simply print it out and don''t continue any more. print(error) return } // Initialize the video preview layer and add it as a sublayer to the viewPreview view''s layer. videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill videoPreviewLayer?.frame = view.layer.bounds view.layer.addSublayer(videoPreviewLayer!) // Start video capture. captureSession.startRunning()



Para mi aplicación de captura de video, estoy usando el siguiente código para obtener el micrófono, la cámara delantera y trasera, y he probado este código de iOS 7 a 10.0.2.

var frontCamera : AVCaptureDevice? var rearCamera : AVCaptureDevice? captureSession = AVCaptureSession() let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) let audioDevices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeAudio) for mic in audioDevices { audioDevice = mic as? AVCaptureDevice audioCapturePossible = true } for device in devices { if device.position == AVCaptureDevicePosition.Front { frontCamera = device as? AVCaptureDevice hasFrontCamera = true } else if device.position == AVCaptureDevicePosition.Back { rearCamera = device as? AVCaptureDevice hasRearCamera = true } }


Pruebe el siguiente código para obtener la ID de la cámara:

NSString *cameraID = nil; NSArray *captureDeviceType = @[AVCaptureDeviceTypeBuiltInWideAngleCamera]; AVCaptureDeviceDiscoverySession *captureDevice = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:captureDeviceType mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionUnspecified]; cameraID = [captureDevice.devices.lastObject localizedName];


Puede obtener la cámara frontal con lo siguiente:

AVCaptureDevice.default(.builtInWideAngleCamera, for: AVMediaType.video, position: .front)

La cámara trasera:

AVCaptureDevice.default(.builtInWideAngleCamera, for: AVMediaType.video, position: .back)

Y el micrófono:

AVCaptureDevice.default(.builtInMicrophone, for: AVMediaType.audio, position: .unspecified)


Swift 4, iOS 10+ y Xcode 9.3 reemplaza

if let cameraID = AVCaptureDevice.defaultDevice(withDeviceType: AVCaptureDeviceType.builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.front)?.localizedName { //cameraID = "Front Camera" }

con la implementación de AVCaptureDevice.DiscoverySession

if let cameraID = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.front).devices.first?.localizedName{ //cameraID = "Front Camera" }

Necesidad de envolverlo con #available (iOS 10, *) cheque.


Swift 3

Para seleccionar la cámara trasera: (también puede cambiar .back según sea necesario)

Para seleccionar otro tipo de dispositivo, agréguelo dentro de [] (es decir:

[deviceTypeCamera, AVCaptureDeviceType.builtInMicrophone]

(o cree un permiso privado ... como lo hice en el código con la cámara trasera)

private let position = AVCaptureDevicePosition.back private let deviceTypeBackCamera = AVCaptureDeviceType.builtInWideAngleCamera private func selectCaptureDevice() -> AVCaptureDevice? { return AVCaptureDeviceDiscoverySession(deviceTypes: [deviceTypeBackCamera], mediaType: AVMediaTypeVideo, position: position).devices.first }