如何使用AVCaptureDeviceDiscoverySession获取前置摄像头,后置摄像头和音频

在iOS 10问世之前,我使用以下代码来获取录像机的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 } } } 

当iOS 10终于问世时,我在运行代码时收到了以下警告。 请注意,我的录像机仍能正常工作约2周。

iOS 10.0中不推荐使用’devices()’:请改用AVCaptureDeviceDiscoverySession。

当我今天早上运行我的代码时,我的录像机停止了工作。 xCode8没有给我任何错误,但摄像头捕获的previewLayer是完全白色的。 当我开始录制时,我收到以下错误:

错误域= AVFoundationErrorDomain代码= -11800“操作无法完成”UserInfo = {NSLocalizedDescription =操作无法完成,NSUnderlyingError = 0x17554440 {错误域= NSOSStatusErrorDomain代码= -12780“(null)”},NSLocalizedFailureReason = An发生未知错误(-12780)}

我认为这与我使用弃用的方法AVCaptureDevice.devices()这一事实有关。 因此,我想知道如何使用AVCaptureDeviceDiscoverySession

提前谢谢你的帮助!

您可以通过以下方式获得前置摄像头:

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

后置摄像头:

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

和麦克风:

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

这是我的代码(Swift 3)来获取相机位置:

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

如果需要,您还可以通过更改deviceTypes数组从iPhone 7+(双摄像头)获取新的devicesTypes。

这是一个很好的阅读: https : //forums.developer.apple.com/thread/63347

Swift 4,iOS 10+和Xcode 9.3取代

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

使用AVCaptureDevice.DiscoverySession实现

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

需要用#available(iOS 10,*)检查来包装它。

它适用于Xcode 9.2和Swift 4

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

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

斯威夫特3

用于选择后置摄像头:(也可根据需要更改.back)

为了选择另一个deviceType,将其添加到[]内(即:

[deviceTypeCamera,AVCaptureDeviceType.builtInMicrophone]

(或者创建一个私有的…就像我在带有后置摄像头的代码中所做的那样)

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

对于我的video捕获应用程序,我使用以下代码来获取麦克风,前后摄像头,我已经测试了从iOS 7到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 } } 

尝试下面的代码来获取相机ID:

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

例如: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() 
Interesting Posts