2015-03-19 17 views
16

मैं लाइव दृश्य के साथ फ्रंट कैमरा प्राप्त करने की कोशिश कर रहा हूं। मैं बैक कैमरा प्राप्त करने में सक्षम हूं:स्विफ्ट में फ्रंट कैमरा कैसे प्राप्त करें?

var backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 

लेकिन मुझे लगता है कि फ्रंट कैमरा कैसे प्राप्त करें। फ्रंट कैमरा का उपयोग करने के लिए मैं उपरोक्त कोड कैसे बदल सकता हूं?

उत्तर

18

फ्रंट कैमरा प्राप्त करने के लिए मेरी परियोजनाओं में से एक से यहां एक कामकाजी उदाहरण है। यह उद्देश्य-सी में है लेकिन काम करने के लिए साबित हुआ और तेजी से बदलने के लिए काफी आसान है।

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

for (AVCaptureDevice *device in videoDevices){ 

    if (device.position == AVCaptureDevicePositionFront){ 

     captureDevice = device; 
     break; 
    } 
} 

और स्विफ्ट 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 
      } 
     } 
    } 
} 
+0

ऊपर प्रदान की तेजी कोड का उपयोग करना, मैं स्विफ्ट 2 आईओएस 9 के साथ इस कोड का इस्तेमाल किया; मुझे केवल ब्रेक को हटाना पड़ा क्योंकि उसने मुझे संकलन त्रुटि दी थी। महान स्रोत यहाँ! –

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

आप .first के बाद हालांकि .filter एक छोटी समाधान के लिए देख रहे हैं सबसे कारगर नहीं

+0

अधिक कॉम्पैक्ट कोड से प्यार करें। क्या कोई अन्य प्रकार का उपकरण है जो स्थिति = मोर्चा के रूप में दिखा सकता है? आश्चर्य है कि यह AVCaptureDevice.devicesWithMediatType (AVMediaTypeVideo) होना चाहिए। फ़िल्टर ({$ 0.position ==Front})। पहले के रूप में? AVCaptureDevice – Keith

+0

महान कोड नमूने के लिए धन्यवाद। – Fattie

1

है के आधार पर समाधान mbuff24 द्वारा प्रस्तुत किया गया। सरणी तरीकों में शामिल प्रथम (जहां :) के अलावा .filter()

guard let frontCamera = AVCaptureDevice.devices().first(where: { ($0 as AnyObject).position == .front }) as? AVCaptureDevice else { 
      fatalError("No front facing camera found") 
      } 
7

आईओएस 10.0 में और बाद में, आप AVCaptureDevice के माध्यम से पुनरावृति की जरूरत नहीं है। स्थिति के आधार पर कैमरा खोजने के लिए devices (या devicesWithMediaType)। (वास्तव में, उन दोनों एपीआई को आईओएस 10 में बहिष्कृत किया गया है, और आईफोन 7 प्लस, आईफोन 8 प्लस, या आईफोन एक्स पर उपलब्ध उपकरणों का पूरा सेट वापस नहीं लौटाएं।)

यदि आपको बस एक ढूंढना है सरल विशेषताओं (जैसे फ्रंट-फेस कैमरा जो वीडियो शूट कर सकते हैं) के आधार पर एकल डिवाइस, बस 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 

वास्तव में अधिकांश उपयोग मामलों के लिए यह सब कुछ है।


devices सरणी के माध्यम से पुनरावृत्ति की पुरानी पद्धति के लिए एक स्थानापन्न के रूप में भी AVCaptureDeviceDiscoverySession नहीं है। हालांकि, अधिकांश चीजें जिन्हें आप आमतौर पर devices सरणी के माध्यम से पुन: सक्रिय करते हैं, उन्हें defaultDevice(withDeviceType:mediaType:position:) विधि का उपयोग करके पाया जा सकता है, ताकि आप इसका उपयोग भी कर सकें और कम कोड लिख सकें।

ऐसे मामले जहां AVCaptureDeviceDiscoverySession उपयोग करने लायक है, कम आम, अधिक जटिल मामले हैं: कहें कि आप एक निश्चित फ्रेम दर का समर्थन करने वाले सभी उपकरणों को ढूंढना चाहते हैं, या यह देखने के लिए महत्वपूर्ण मूल्य का उपयोग करना है कि उपलब्ध डिवाइसों का सेट कब बदलता है ।


वैसे, एप्पल ने आईओएस 10/स्विफ्ट 3 तस्वीर पर कब्जा करने के लिए प्रणाली a guide और कुछ sample code कि दोनों इन API के लिए वर्तमान सर्वोत्तम प्रथाओं दिखाने है।

0
import AVFoundation 
import Foundation 


@IBOutlet weak var imageView: UIImageView! 
    let captureSession = AVCaptureSession() 
    let stillImageOutput = AVCaptureStillImageOutput() 
    var previewLayer : AVCaptureVideoPreviewLayer? 
    var captureDevice : AVCaptureDevice? 
    var Arrdata:[Studentdata] = [] 
override func viewDidLoad() { 
     super.viewDidLoad() 
     captureSession.sessionPreset = AVCaptureSessionPresetHigh 
      if let devices = AVCaptureDevice.devices() as? [AVCaptureDevice] 
      { 
       for device in devices 
       { 
        if (device.hasMediaType(AVMediaTypeVideo)) 
        { 
         if(device.position == AVCaptureDevicePosition.front) 
         { 
          captureDevice = device 
          if captureDevice != nil 
          { 
           print("Capture device found") 
           beginSession() 
          } 
         } 
        } 
       } 
      } 


    } 

func beginSession() 
    { 
     do 
     { 
      try captureSession.addInput(AVCaptureDeviceInput(device: captureDevice)) 
      stillImageOutput.outputSettings = [AVVideoCodecKey:AVVideoCodecJPEG] 
      if captureSession.canAddOutput(stillImageOutput) 
      { 
       captureSession.addOutput(stillImageOutput) 
      } 
     } 
     catch 
     { 
      print("error: \(error.localizedDescription)") 
     } 
     guard let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) else 
     { 
      print("no preview layer") 
      return 
     } 
     self.view.layer.addSublayer(previewLayer) 
     previewLayer.frame = self.view.layer.frame 
     captureSession.startRunning() 
     self.view.addSubview(imageView) 
    } 
4

स्विफ्ट 4, आईओएस 10+ और Xcode 9 बीटा 5AVCaptureDevice साथ बदलता है

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

।DiscoverySession कार्यान्वयन

if #available(iOS 10,*){ 
    if let cameraID = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDeviceType.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.front).devices.first?.localizedName{ 
      //cameraID = "Front Camera" 
    } 
} 
2

latests है:

guard let device = AVCaptureDevice.default(AVCaptureDevice.DeviceType.builtInWideAngleCamera, for: .video, position: .front) else { 
      return 

}

संबंधित मुद्दे