2015-05-06 2 views
0

Я хочу отображать вывод в реальном времени камеры в контроллере вида. Я начинаю with this example.Как отобразить вывод в реальном времени камеры в UIView

Это то, что я сделал: я создал новый контроллер View на доске Story и подключил его к классу ниже. Код и вывод ниже.

import UIKit 
import AVFoundation 

//NOT WORKING - Unable to see Camera View in UIView: https://stackoverflow.com/questions/28683863/front-camera-to-fill-circular-uiview 

class TestVC: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate{ 

var previewView : UIView!; 
var boxView:UIView!; 

//Camera Capture requiered properties 
var videoDataOutput: AVCaptureVideoDataOutput!; 
var videoDataOutputQueue : dispatch_queue_t!; 
var previewLayer:AVCaptureVideoPreviewLayer!; 
var captureDevice : AVCaptureDevice! 
let session=AVCaptureSession(); 
var currentFrame:CIImage! 
var done = false; 


var cameraView = UIView() 

override func viewDidLoad() { 
    super.viewDidLoad() 


    cameraView.frame = CGRectMake(100, self.view.center.y-260, 568, 568) 
    cameraView.backgroundColor = UIColor(red:26/255, green:188/255, blue:156/255, alpha:1) 
    cameraView.layer.cornerRadius = 284 
    cameraView.layer.borderColor = UIColor.whiteColor().CGColor 
    cameraView.layer.borderWidth = 15 
    cameraView.contentMode = UIViewContentMode.ScaleToFill 
    cameraView.layer.masksToBounds = true 



    var screenSize = UIScreen.mainScreen().bounds.size; 
    self.previewView = UIView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.size.width, UIScreen.mainScreen().bounds.size.height)); 
    self.previewView.contentMode = UIViewContentMode.ScaleAspectFit 
    self.view.addSubview(previewView); 

    //Add a box view 
    self.boxView = UIView(frame: CGRectMake(0, 0, 100, 200)); 
    self.boxView.backgroundColor = UIColor.greenColor(); 
    self.boxView.alpha = 0.3; 

    self.view.addSubview(self.boxView); 

    self.setupAVCapture(); 
} 

override func viewWillAppear(animated: Bool) { 
    if !done { 
     session.startRunning(); 
    } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 

override func shouldAutorotate() -> Bool { 
    if (UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft || 
     UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeRight || 
     UIDevice.currentDevice().orientation == UIDeviceOrientation.Unknown) { 
      return false; 
    } 
    else { 
     return true; 
    } 
} 
} 


// AVCaptureVideoDataOutputSampleBufferDelegate protocol and related methods 
extension TestVC: AVCaptureVideoDataOutputSampleBufferDelegate{ 

func setupAVCapture(){ 
    session.sessionPreset = AVCaptureSessionPreset640x480 

    let devices = AVCaptureDevice.devices(); 
    // Loop through all the capture devices on this phone 
    for device in devices { 
     // Make sure this particular device supports video 
     if (device.hasMediaType(AVMediaTypeVideo)) { 
      // Finally check the position and confirm we've got the front camera 
      if(device.position == AVCaptureDevicePosition.Front) { 
       captureDevice = device as? AVCaptureDevice 
       if captureDevice != nil { 
        beginSession() 
        break 
       } 
      } 
     } 
    } 
} 

func beginSession(){ 
    var err : NSError? = nil 
    var deviceInput:AVCaptureDeviceInput = AVCaptureDeviceInput(device: captureDevice, error: &err) 
    if err != nil { 
     println("error: \(err?.localizedDescription)") 
    } 
    if self.session.canAddInput(deviceInput){ 
     self.session.addInput(deviceInput) 
    } 

    self.videoDataOutput = AVCaptureVideoDataOutput() 
    var rgbOutputSettings = [NSNumber(integer: kCMPixelFormat_32BGRA):kCVPixelBufferPixelFormatTypeKey] 
    self.videoDataOutput.alwaysDiscardsLateVideoFrames=true 
    self.videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", DISPATCH_QUEUE_SERIAL) 
    self.videoDataOutput.setSampleBufferDelegate(self, queue:self.videoDataOutputQueue) 
    if session.canAddOutput(self.videoDataOutput){ 
     session.addOutput(self.videoDataOutput) 
    } 
    self.videoDataOutput.connectionWithMediaType(AVMediaTypeVideo).enabled = true 

    self.previewLayer = AVCaptureVideoPreviewLayer(session: self.session) 
    self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 

    var rootLayer :CALayer = self.cameraView.layer 
    rootLayer.masksToBounds=true 
    self.previewLayer.frame = rootLayer.bounds 
    rootLayer.addSublayer(self.previewLayer) 
    session.startRunning() 

} 

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) { 
    // do stuff here 

} 

// clean up AVCapture 
func stopCamera(){ 
    session.stopRunning() 
} 

} 

Это все, что я вижу на выходе:

enter image description here

От the example, я не мог сказать, где следующий фрагмент кода должен идти? Итак, я поместил его в viewDidLoad. Может быть, ему нужно отправиться в другое место?

cameraView.frame = CGRectMake(100, self.view.center.y-260, 568, 568) 
    cameraView.backgroundColor = UIColor(red:26/255, green:188/255, blue:156/255, alpha:1) 
    cameraView.layer.cornerRadius = 284 
    cameraView.layer.borderColor = UIColor.whiteColor().CGColor 
    cameraView.layer.borderWidth = 15 
    cameraView.contentMode = UIViewContentMode.ScaleToFill 
    cameraView.layer.masksToBounds = true 
+0

Независимо от того, работает ли ваш код, вы не увидите живой канал - симулятор не имеет доступа к камере. – Jeffrey

+0

Я пробовал на реальном устройстве iPhone 5C, см. Ту же зеленую коробку – user1406716

ответ

0

Какой UIView вы хотите отобразить слой предварительного просмотра? boxView или cameraView? В вашем коде вы добавляете слой предварительного просмотра в cameraView, но только добавьте boxView в качестве подзаголовка на ваш основной вид, так что cameraView никогда не отображается.

Если вы хотите cameraView, измените self.view.addSubview(self.boxView) на self.view.addSubview(self.cameraView) в viewDidLoad. Если boxView, измените var rootLayer :CALayer = self.cameraView.layer на var rootLayer :CALayer = self.boxView.layer в beginSession.

В любом случае будет отображаться предварительный просмотр камеры в прямом эфире, хотя результаты разные, так как boxView и cameraView настроены по-разному.

Я думаю boxView ваш предназначен один, так ТЛ; др: вы добавили предварительного просмотра слоя cameraView, когда вы хотели, чтобы добавить его в boxView.

0

Вы близки к успеху, но провода плохо подключены.

Green box is boxview. если вы хотите просмотр камеры в boxview, вы должны добавить Предварительный просмотр до boxview.

 Смежные вопросы

  • Нет связанных вопросов^_^