2016-09-08 2 views
16

Ich recherchiere derzeit aktiv, aber jetzt, da das iPhone 7 Plus über ein Dual-Kamera-System verfügt, können AVFoundation Video Frames von jeder spezifischen Kamera gleichzeitig verarbeiten?iPhone 7 Plus - AVFoundation Dual-Kamera

Ich denke/hoffe, dass ich in der Lage sein werde, Ausgabe von zwei AVCaptureDevice Instanzen zur gleichen Zeit mit einer bestimmten Position zu behandeln.

Antwort

7

In der aktualisierten Dokumentation AVFoundation (AVCaptureDeviceType) gibt es neue Gerätetypen: builtInWideAngleCamera und builtInTelephotoCamera. Daher sollte es möglich sein, mehrere Erfassungssitzungen zu erstellen und gleichzeitig das Feedback von beiden zu erhalten.

+1

Bedeutet das, dass wir getrennte Bilder von beiden Kameras separat haben können? Eigentlich ist dies eine Voraussetzung für eine meiner App, so dass es eine große Hilfe sein wird, wenn jemand meine Frage beantworten kann. Vielen Dank im Voraus. –

+0

Ich bin mir ziemlich sicher, dass Sie nicht gleichzeitig Video-Daten von beiden Kameras streamen können. Wenn Sie mehrere Capture-Sitzungen erstellen, wird durch den Aufruf von "-startRunning" in der zweiten Sitzung die erste beendet. –

12

Sie können einer AVCaptureSession nur jeweils eine Kamera hinzufügen. Zum Beispiel können Sie zwischen der vorderen und der hinteren Kamera wechseln, aber nicht beide gleichzeitig benutzen. Es ist das gleiche mit den beiden hinteren Kameras auf dem 7 Plus, Sie müssen entweder wählen. Es gibt jedoch einen kleinen Unterschied, da Sie auch eine "Duo-Kamera" aufrufen können, die beim Zoomen die Bilder beider Kameras zusammenführt. Aber das ist nur für Standfoto verfügbar und Sie erhalten nur einen Bild-/Aufnahmepuffer. Für das Video müssen Sie eine Kamera auswählen.

Um die Kamera auszuwählen, können Sie die neue AVCaptureDeviceDiscoverySession verwenden. Um die Duo-Kamera zu verwenden:

@property (nonatomic) AVCaptureDevice *backCamera; 
@property (nonatomic) AVCaptureDeviceInput *backCameraInput; 


if([AVCaptureDeviceDiscoverySession class]){ 
    NSArray *allTypes = @[AVCaptureDeviceTypeBuiltInDuoCamera, AVCaptureDeviceTypeBuiltInWideAngleCamera, AVCaptureDeviceTypeBuiltInTelephotoCamera ]; 
    AVCaptureDeviceDiscoverySession *discoverySession = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:allTypes mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionBack]; 

    for(AVCaptureDevice *device in discoverySession.devices) { 
     if(device.deviceType== AVCaptureDeviceTypeBuiltInDuoCamera){ 
      self.backCamera = device; 
      self.backCameraInput = [AVCaptureDeviceInput deviceInputWithDevice:self.backCamera error:&error]; 
     } 
    } 
} 

if(!self.backCamera){ 
    self.backCamera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
    self.backCameraInput = [AVCaptureDeviceInput deviceInputWithDevice:self.backCamera error:&error]; 
} 

Weitwinkel- und Tele verwenden Kamera einzeln

@property (nonatomic) AVCaptureDevice *backCamera; 
@property (nonatomic) AVCaptureDeviceInput *backCameraInput; 
@property (nonatomic) AVCaptureDevice *teleCamera; 
@property (nonatomic) AVCaptureDeviceInput *teleCameraInput; 


if([AVCaptureDeviceDiscoverySession class]){ 
    NSArray *allTypes = @[AVCaptureDeviceTypeBuiltInDuoCamera, AVCaptureDeviceTypeBuiltInWideAngleCamera, AVCaptureDeviceTypeBuiltInTelephotoCamera ]; 
    AVCaptureDeviceDiscoverySession *discoverySession = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:allTypes mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionBack]; 

    for(AVCaptureDevice *device in discoverySession.devices) { 
     if(device.deviceType==AVCaptureDeviceTypeBuiltInWideAngleCamera){ 
      self.backCamera = device; 
      self.backCameraInput = [AVCaptureDeviceInput deviceInputWithDevice:self.backCamera error:&error]; 
     } 

     if(device.deviceType==AVCaptureDeviceTypeBuiltInTelephotoCamera){ 
      self.teleCamera = device; 
      self.teleCameraInput = [AVCaptureDeviceInput deviceInputWithDevice:self.teleCamera error:&error]; 
     } 
    } 
} 

if(!self.backCamera){ 
    self.backCamera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
    self.backCameraInput = [AVCaptureDeviceInput deviceInputWithDevice:self.backCamera error:&error]; 
} 

Wenn Sie dies nicht tun, oder halten Sie Ihren alten Code, der Sie nur die große Kamera verwenden, auch wenn Sie Zoomen.

EDIT: In iOS 11 gibt es neue AVCapturePhotoSettings namens DualCameraDualPhotoDeliveryEnabled. Sie können zwei Standbilder gleichzeitig aufnehmen, jedoch kein Streaming/Video.

Verwandte Themen