Antes de iOS 10 salió yo estaba usando el siguiente código para obtener la captura de vídeo y audio para mi grabadora de vídeo:

 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 iOS 10 finalmente salió, he recibido la siguiente advertencia cuando yo estaba corriendo mi código. Tenga en cuenta que mi grabadora de vídeo todavía estaba trabajando suavemente durante aproximadamente 2 semanas.

dispositivos()’ ya no se utiliza en iOS 10.0: Uso AVCaptureDeviceDiscoverySession lugar.

Como yo estaba corriendo mi código esta mañana, mi grabadora de video dejo de funcionar. xCode8 no me da errores, pero la previewLayer para la captura de la cámara es completamente blanco. Cuando a continuación, iniciar la grabación de recibo el siguiente error:

Error de Dominio=AVFoundationErrorDomain Código=-11800 «La operación no se pudo completar» UserInfo={NSLocalizedDescription=La operación no se pudo completar, NSUnderlyingError=0x17554440 {Error de Dominio=NSOSStatusErrorDomain Código=-12780 «(null)»}, NSLocalizedFailureReason=ocurrió Un error desconocido (-12780)}

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

Gracias por su ayuda de antemano!

InformationsquelleAutor AndreasLukas | 2016-10-06

10 Comentarios

  1. 80

    Usted puede conseguir la cámara frontal con el siguiente:

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

    La parte posterior de la cámara:

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

    Y el micrófono:

    AVCaptureDevice.default(.builtInMicrophone, for: AVMediaType.audio, position: .unspecified)
    • Resultó que mi cámara en mi iPhone estaba roto, por lo tanto el color blanco se muestra en la vista previa de la capa. Gracias por tu respuesta, aunque, al menos podía deshacerse de mi advertencia xcode8 fue constantemente me dan.
    • ¿Sabes cómo hacer lo mismo con la parte posterior de la cámara con Objective-C en su lugar?
  2. 13

    Swift 4, iOS 10+ y Xcode 10.1 reemplaza

    if let cameraID = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front)?.localizedName {
           //cameraID = "Front Camera"
    }

    con AVCaptureDevice.DiscoverySession aplicación

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

    Necesario para envolver con #disponible(iOS 10,*) de verificación.

    • Código para el descubrimiento de la sesión debe ser: if let cameraID = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.front).devices.first?.localizedName{ //cameraID = "Front Camera" } AVCaptureDeviceType fue reemplazado por AVCaptureDevice.DeviceType y AVCaptureDevicePosition fue reemplazado por AVCaptureDevice.Position (XCode 9.2 / Swift 4)
    • Los dispositivos de la matriz está vacía, ¿sabes por qué?
  3. 11

    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 la nueva devicesTypes desde el iPhone 7+ (doble cámara) por el cambio de la deviceTypes matriz.

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

  4. 3

    Swift 3

    Para la selección de la parte posterior de la cámara:(también se puede cambiar .de nuevo según sea necesario)

    Para seleccionar otro deviceType simple agregarla dentro de los [ ] (i.e:

    [deviceTypeCamera, AVCaptureDeviceType.builtInMicrophone]

    (o crear un privado vamos… como yo 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
    
     }
    • Xcode 9 sólo me preguntó uso __deviceTypes: en lugar de deviceTypes:, aparte de eso, funciona.
  5. 3

    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()
    • Cualquiera que lo encuentre que esto no funciona con la última versión beta 11.3 SDK en 10+ teléfonos? Esto funciona en mi teléfono, pero no de mi testflight probadores de teléfono de la vista previa de vídeo de la capa no está siendo creado.
  6. 2

    Tratar a continuación el código para obtener la IDENTIFICACIÓN de la cámara:

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

    Para mi captura de vídeo de la aplicación que estoy utilizando el siguiente código para obtener el micrófono, cámara frontal y trasera y he probado este código de iOS 7 para 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
                }
    
            }
    • Usted todavía consigue el desuso de advertencia con AVCaptureDevice.devicesWithMediaType
  8. 1

    Swift 4 (xCode 10.1)

    Esto es lo que funcionó para mí en la última versión de Swift. No volví a ver a esta respuesta, y me tomó un tiempo para suss así que aquí es cómo conseguir que la parte delantera frente a la cámara.

     if let device = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera , mediaType: AVMediaTypeVideo, position: .front)  {
        //Do the camera thing here..
    }
  9. 0

    05/2019 :

     //video
            self.session = AVCaptureSession()
            guard
                let videoDeviceInput = try? AVCaptureDeviceInput(device: device!),
                self.session!.canAddInput(videoDeviceInput)
                else { return }
            self.session!.addInput(videoDeviceInput)
    
      //audio
            guard
                let audioDeviceInput = try? AVCaptureDeviceInput(device: mic!),
                self.session!.canAddInput(audioDeviceInput)
                else { return }
            self.session!.addInput(audioDeviceInput) 

Dejar respuesta

Please enter your comment!
Please enter your name here