it-swarm.com.de

So erhalten Sie Frontkamera, Rückkamera und Audio mit AVCaptureDeviceDiscoverySession

Bevor iOS 10 herauskam, habe ich den folgenden Code verwendet, um die Video- und Audioaufzeichnung für meinen Videorecorder zu erhalten:

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

Als iOS 10 endlich herauskam, erhielt ich die folgende Warnung, als ich meinen Code ausführte. Beachten Sie, dass mein Videorecorder noch etwa zwei Wochen lang problemlos funktioniert hat.

'devices ()' wurde in iOS 10.0 nicht mehr unterstützt: Verwenden Sie stattdessen AVCaptureDeviceDiscoverySession.

Als ich meinen Code heute morgen ausgeführt habe, funktionierte mein Videorecorder nicht mehr. xCode8 zeigt keine Fehler an, aber der previewLayer für die Kameraerfassung ist vollständig weiß. Wenn ich dann mit der Aufnahme beginne, erhalte ich die folgende Fehlermeldung:

Fehler Domain = AVFoundationErrorDomain Code = -11800 "Die Operation konnte nicht abgeschlossen werden" UserInfo = {NSLocalizedDescription = Die Operation konnte nicht abgeschlossen werden, NSUnderlyingError = 0x17554440 {Fehler Domain = NSOSStatusErrorDomain Code = -12780 "(null)" unbekannter Fehler aufgetreten (-12780)}

Ich glaube, das hat etwas damit zu tun, dass ich den veralteten Ansatz AVCaptureDevice.devices() verwende. Daher habe ich mich gefragt, wie man stattdessen AVCaptureDeviceDiscoverySession verwendet?

Danke im Voraus für Ihre Hilfe!

33
AndreasLukas

Sie können die Frontkamera mit den folgenden Optionen erhalten:

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

Die rückseitige Kamera:

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

Und das mikrofon:

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

Swift 4, iOS 10+ und Xcode 10.1 ersetzt

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

mit AVCaptureDevice.DiscoverySession Implementierung

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

Sie müssen es mit #available (iOS 10, *) check einpacken.

11

Hier ist mein Code (Swift 3), um die Kameraposition zu erhalten:

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

Wenn Sie möchten, können Sie die neuen devicesTypes auch vom iPhone 7+ (Dual-Kamera) abrufen, indem Sie das Feld deviceTypes ändern. 

Hier ist eine gute Lektüre: https://forums.developer.Apple.com/thread/63347

11
hefgi

Es funktioniert auf Xcode 9.2 und Swift 4

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

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

7
atereshkov

Swift 3

Zur Auswahl der Rückfahrkamera: (Sie können auch die .back nach Bedarf ändern.)

Um einen anderen deviceType auszuwählen, fügen Sie ihn einfach in [] ein (d. H .: 

[deviceTypeCamera, AVCaptureDeviceType.builtInMicrophone] 

(oder ein privates let erstellen ... wie ich es im code mit der rückfahrkamera gemacht habe)

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

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

 }
3
MLBDG

beispiel: 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()
2
Harry McGovern

Versuchen Sie es mit dem folgenden Code, um die Kamera-ID zu erhalten:

NSString *cameraID = nil;

NSArray *captureDeviceType = @[AVCaptureDeviceTypeBuiltInWideAngleCamera];
AVCaptureDeviceDiscoverySession *captureDevice = 
              [AVCaptureDeviceDiscoverySession 
                discoverySessionWithDeviceTypes:captureDeviceType 
                mediaType:AVMediaTypeVideo 
                position:AVCaptureDevicePositionUnspecified];

cameraID = [captureDevice.devices.lastObject localizedName];
2
yoell32

Für meine Video-Capture-App verwende ich den folgenden Code, um das Mikrofon, die Vorder- und die Rückfahrkamera zu erhalten, und ich habe diesen Code von iOS 7 bis 10.0.2 getestet.

        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
            }

        }
1
Hammadzafar

Swift 4 (xCode 10.1)

Dies hat bei mir in der neuesten Version von Swift funktioniert. Ich habe diese Antwort nicht gesehen, und es hat eine Weile gedauert, bis ich herauskam.

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

5/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) 
0
Boris Detry