55 votes

Comment obtenir la caméra avant, la caméra arrière et le son avec AVCaptureDeviceDiscoverySession

Avant iOS 10 est sorti, j'ai été en utilisant le code suivant pour obtenir la capture vidéo et audio pour mon enregistreur vidéo:

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

Quand iOS 10 est finalement sorti, j'ai reçu l'avertissement suivant lorsque j'ai été l'exécution de mon code. Notez que mon enregistreur vidéo était encore en train de doucement pendant environ 2 semaines.

les appareils () " a été déprécié dans iOS 10.0: Utilisation AVCaptureDeviceDiscoverySession à la place.

Comme je l'ai été l'exécution de mon code ce matin, mon enregistreur vidéo cessé de travailler. xCode8 ne me donne pas toutes les erreurs, mais le previewLayer pour la capture de l'appareil photo est complètement blanc. Alors quand j'ai commencer l'enregistrement j'ai l'erreur suivante:

Erreur de Domaine=AVFoundationErrorDomain Code=-11800 "L'opération n'a pas pu être terminée" UserInfo={NSLocalizedDescription=L'opération n'a pas pu être terminée, NSUnderlyingError=0x17554440 {Erreur de Domaine=NSOSStatusErrorDomain Code=-12780 "(null)"}, NSLocalizedFailureReason=Une erreur inconnue s'est produite (-12780)}

Je crois qui a quelque chose à voir avec le fait que je suis en utilisant l'approche obsolète AVCaptureDevice.devices(). Donc, je me demandais comment utiliser AVCaptureDeviceDiscoverySession à la place?

Je vous remercie pour votre aide à l'avance!

111voto

born_stubborn Points 800

Vous pouvez obtenir la caméra frontale avec les éléments suivants:

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

La caméra de recul:

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

Et le micro:

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

14voto

hefgi Points 417

Voici mon code (Swift 3) pour obtenir la position de la caméra:

 // 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 vous le souhaitez, vous pouvez également obtenir les nouveaux types devicesTypes de l'iPhone 7+ (double caméra) en modifiant le tableau deviceTypes.

Voici une bonne lecture: https://forums.developer.apple.com/thread/63347

13voto

Swift 4, iOS 10+ et Xcode 10.1 remplace

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

avec l'implémentation AVCaptureDevice.DiscoverySession

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

Besoin de l'envelopper avec la vérification #available (iOS 10, *) .

9voto

atereshkov Points 448

Cela fonctionne sur Xcode 9.2 et Swift 4

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

https://developer.apple.com/documentation/avfoundation/avcapturedevice/2361508-default

3voto

MLBDG Points 11

Swift 3

Pour sélectionner la caméra de recul: (vous pouvez également modifier .back si nécessaire)

Pour sélectionner un autre deviceType simple, ajoutez-le à l'intérieur du [] (c'est-à-dire:

[deviceTypeCamera, AVCaptureDeviceType.builtInMicrophone]

(ou créer un let privé ... comme je l'ai fait dans le code avec la caméra arrière)

  private let position = AVCaptureDevicePosition.back
 private let deviceTypeBackCamera = AVCaptureDeviceType.builtInWideAngleCamera

 private func selectCaptureDevice() -> AVCaptureDevice? {
    return AVCaptureDeviceDiscoverySession(deviceTypes: [deviceTypeBackCamera], mediaType: AVMediaTypeVideo, position: position).devices.first

 }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X