如何在Swift中获得前置摄像头?

min*_*eek 23 iphone ios swift

我试图让前置摄像头具有实时视图.我可以使用后置摄像头:

var backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
Run Code Online (Sandbox Code Playgroud)

但我似乎无法找到如何获得前置摄像头.如何更改上面的代码才能使用前置摄像头?

chr*_*ram 22

这是我的一个项目的工作示例,以获得前置摄像头.这是客观的,但经过验证可以很容易地转换成swift.

NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
AVCaptureDevice *captureDevice = nil;

for (AVCaptureDevice *device in videoDevices){

    if (device.position == AVCaptureDevicePositionFront){

        captureDevice = device;
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

在Swift 3.2+中:

if let videoDevices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) {
    var captureDevice: AVCaptureDevice
    for device in videoDevices {
        if let device = device as? AVCaptureDevice {
            if device.position == AVCaptureDevicePosition.front {
                captureDevice = device
                break
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


mbu*_*f24 9

guard let device = AVCaptureDevice.devices().filter({ $0.position == .Front })
    .first as? AVCaptureDevice else {
        fatalError("No front facing camera found")
}
Run Code Online (Sandbox Code Playgroud)

如果你正在寻找一个更短的解决方案,虽然.filter后面的.first效率不是最高的


ric*_*ter 9

在iOS 10.0及更高版本中,您无需迭代AVCaptureDevice.devices(或devicesWithMediaType)按位置找到相机.(事实上​​,这两种API在iOS 10中都已弃用,并且不会在iPhone 7 Plus,iPhone 8 Plus或iPhone X上返回完整的可用设备集.)

如果你只需要根据简单的特性找到一个设备(比如一个可以拍摄视频的前置摄像头),就可以使用了AVCaptureDevice.defaultDevice(withDeviceType:mediaType:position:).例如:

guard let device = AVCaptureDevice.defaultDevice(
    withDeviceType: .builtInWideAngleCamera,
    mediaType: AVMediaTypeVideo,
    position: .front)
    else { fatalError("no front camera. but don't all iOS 10 devices have them?")

// then use the device: captureSession.addInput(device) or whatever
Run Code Online (Sandbox Code Playgroud)

真的,对于大多数用例来说都是如此.


这也 AVCaptureDeviceDiscoverySession可以替代迭代devices数组的旧方法.但是,您devices可以使用新defaultDevice(withDeviceType:mediaType:position:)方法找到通常在数组中迭代的大部分内容,因此您可以使用它并编写更少的代码.

AVCaptureDeviceDiscoverySession值得使用的情况是不太常见,更复杂的情况:假设您想要找到支持特定帧速率的所有设备,或者使用键值观察来查看可用设备集的更改时间.


顺便说一句,苹果也有一个引导到iOS的10 /斯威夫特3照片拍摄系统和一些示例代码既显示了这些API目前的最佳做法.


Raf*_*sun 6

Swift 4.1、iOS 10+ 和Xcode 9.3取代

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

使用AVCaptureDevice.DiscoverySession实现

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


zum*_*zum 6

最新消息是:

guard let device = AVCaptureDevice.default(AVCaptureDevice.DeviceType.builtInWideAngleCamera, for: .video, position: .front) else {
    return
}
Run Code Online (Sandbox Code Playgroud)