首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过AVCaptureDeviceDiscoverySession获取前置摄像头、后置摄像头和音频

如何通过AVCaptureDeviceDiscoverySession获取前置摄像头、后置摄像头和音频
EN

Stack Overflow用户
提问于 2016-10-06 19:20:28
回答 12查看 42K关注 0票数 50

在iOS 10推出之前,我使用以下代码为我的录像机获取视频和音频捕获:

代码语言:javascript
运行
复制
 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最终发布时,我在运行代码时收到了以下警告。请注意,我的录像机仍然顺利地工作了大约两个星期。

'devices()‘在iOS 10.0中已弃用:请改用AVCaptureDeviceDiscoverySession。

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

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

我相信这与我使用过时的方法AVCaptureDevice.devices()有关。因此,我想知道如何使用AVCaptureDeviceDiscoverySession来代替?

提前感谢您的帮助!

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2016-10-06 19:43:08

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

代码语言:javascript
运行
复制
AVCaptureDevice.default(.builtInWideAngleCamera, for: AVMediaType.video, position: .front)

后置摄像头:

代码语言:javascript
运行
复制
AVCaptureDevice.default(.builtInWideAngleCamera, for: AVMediaType.video, position: .back)

还有麦克风:

代码语言:javascript
运行
复制
AVCaptureDevice.default(.builtInMicrophone, for: AVMediaType.audio, position: .unspecified)
票数 100
EN

Stack Overflow用户

发布于 2017-02-11 03:15:25

下面是我获取摄像头位置的代码(Swift 3):

代码语言:javascript
运行
复制
// 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
}

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

这里有一个很好的读物:https://forums.developer.apple.com/thread/63347

票数 14
EN

Stack Overflow用户

发布于 2017-08-03 13:07:20

Swift 4、iOS 10+和Xcode 10.1取代

代码语言:javascript
运行
复制
if let cameraID = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front)?.localizedName {
       //cameraID = "Front Camera"
}

使用AVCaptureDevice.DiscoverySession实现

代码语言:javascript
运行
复制
if let cameraID = AVCaptureDevice.DiscoverySession.init(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: .video, position: .front).devices.first?.localizedName{
        //cameraID = "Front Camera"
} 

需要用#available(iOS 10,*) check对其进行包装。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39894630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档