2016-10-06 3 views
22

Перед прошивкой 10 вышел я использую следующий код, чтобы получить видео и аудио захвата для моего видеомагнитофона:Как получить переднюю камеру, заднюю камеру и аудио с AVCaptureDeviceDiscoverySession

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 недель.

'devices()' was deprecated in iOS 10.0: Use AVCaptureDeviceDiscoverySession instead.

Поскольку я запускал свой код этим утром, мой видеомагнитофон прекратил работать. xCode8 не дает мне никаких ошибок, но предварительный просмотр для захвата камеры полностью белый. Когда я затем начать запись я получаю следующее сообщение об ошибке:

Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x17554440 {Error Domain=NSOSStatusErrorDomain Code=-12780 "(null)"}, NSLocalizedFailureReason=An unknown error occurred (-12780)}

Я считаю, что есть что-то делать с тем, что я использую устаревший подход AVCaptureDevice.devices(). Следовательно, мне было интересно, как использовать AVCaptureDeviceDiscoverySession вместо этого?

Благодарим за помощь!

ответ

46

Вы можете получить фронтальную камеру со следующим:

AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .front) 

Задняя камера:

AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .back) 

И микрофон:

AVCaptureDevice.defaultDevice(withDeviceType: .builtInMicrophone, mediaType: AVMediaTypeAudio, position: .unspecified) 
+0

Оказался, что моя камера на моем iPhone была сломана, поэтому белым цветной показ в слое предварительного просмотра. Спасибо за ваш ответ, хотя, по крайней мере, я мог избавиться от своего предупреждения. Xcode8 постоянно давал мне. – AndreasLukas

+1

Знаете ли вы, как сделать то же самое, используя заднюю камеру с Objective-C? – fi12

2

Для моего захвата видео приложение I» m используя следующий код, чтобы получить микрофон, переднюю и заднюю камеру, и я протестировал этот код с 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 
      } 

     } 
+0

Вы все еще получаете устаревшее предупреждение с AVCaptureDevice.devicesWithMediaType –

8

Вот мой код (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 
} 

Если вы хотите, вы можете также получить новые devicesTypes от iPhone 7+ (двойная камера) путем изменения массива deviceTypes ,

Вот хорошо читать: https://forums.developer.apple.com/thread/63347

2

Попробуйте ниже код, чтобы получить камеры ID:

NSString *cameraID = nil; 

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

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

Swift 3

Для выбора задней камеры: (также вы можете изменить .Задняя по необходимости)

Для выбора другого устройстваТип простого добавления его внутри [] (то есть:

[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 

} 
+0

Xcode 9 просто попросил меня использовать __deviceTypes: вместо deviceTypes :, кроме этого, он работает. – epx

7

Swift 4, IOS 10+ и Xcode 9 бета 5 заменяющего

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: [AVCaptureDeviceType.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.front).devices.first?.localizedName{ 
     //cameraID = "Front Camera" 
} 

Необходимо обернуть его #доступный (iOS 10, *) проверить.

1

пример: прошивка 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() 
+0

отличное спасибо! – GameDev