1

我正在嘗試構建一個相機應用程序。正如我在iOS的是新的,我讀文檔,觀看教程,並寫了下面的代碼:CapturePhoto不能正常工作3

import UIKit 
import AVFoundation 
class StartVC: UIViewController { 

var connection: AVCaptureConnection! 
var output: AVCapturePhotoOutput! 
var videoPreviewLayer: AVCaptureVideoPreviewLayer! 
@IBOutlet var videoPreviewView: UIView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.createCamera() 
} 

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    self.videoPreviewLayer.bounds = self.videoPreviewView.bounds 
    self.videoPreviewLayer.position = CGPoint(x: self.videoPreviewView.bounds.midX, y: self.videoPreviewView.bounds.midY) 
} 

func createCamera() { 
    let captureSession = AVCaptureSession() 

    if captureSession.canSetSessionPreset(AVCaptureSessionPresetHigh) { 
     captureSession.sessionPreset = AVCaptureSessionPresetHigh 
    } else { 
     print("Error: Couldn't set preset = \(AVCaptureSessionPresetHigh)") 
     return 
    } 

    let cameraDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 

    var error: NSError? 

    let inputDevice = try! AVCaptureDeviceInput.init(device: cameraDevice) 
    //let inputDevice = AVCaptureDeviceInput.withDevice(cameraDevice) as AVCaptureDeviceInput 
    if let error = error { 
     print("Error: \(error)") 
     return 
    } 

    if captureSession.canAddInput(inputDevice) { 
     captureSession.addInput(inputDevice) 
    } else { 
     print("Error: Couldn't add input device") 
     return 
    } 

    let imageOutput = AVCapturePhotoOutput() 
    if captureSession.canAddOutput(imageOutput) { 
     captureSession.addOutput(imageOutput) 
    } else { 
     print("Error: Couldn't add output") 
     return 
    } 

    // Store imageOutput. We will need it to take photo 
    self.output = imageOutput 

    let connection = imageOutput.connections.first as! AVCaptureConnection! 
    // Store this connection in property. We will need it when we take image. 
    self.connection = connection 
    connection?.videoOrientation = AVCaptureVideoOrientation.portrait 

    captureSession.startRunning() 

    // This will preview the camera 
    let videoLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
    videoLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
    videoLayer?.contentsScale = UIScreen.main.scale 

    self.videoPreviewView.layer.addSublayer(videoLayer!) 

    // Store this layer instance in property. We will place it into a view 
    self.videoPreviewLayer = videoLayer 
} 



@IBAction func CaptureButton(_ sender: UIButton) { 

    let captureSettings = AVCapturePhotoSettings() 
    let previewPixelType = captureSettings.availablePreviewPhotoPixelFormatTypes.first! 
    let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType, 
         kCVPixelBufferWidthKey as String: 300, 
         kCVPixelBufferHeightKey as String: 300, 
         ] 
    captureSettings.previewPhotoFormat = previewFormat 

    self.output.capturePhoto(with: captureSettings, delegate: self as! AVCapturePhotoCaptureDelegate) 

} 

}

但我得到的錯誤本節。

@IBAction func CaptureButton(_ sender: UIButton) { 

    let captureSettings = AVCapturePhotoSettings() 
    let previewPixelType = captureSettings.availablePreviewPhotoPixelFormatTypes.first! 
    let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType, 
         kCVPixelBufferWidthKey as String: 300, 
         kCVPixelBufferHeightKey as String: 300, 
         ] 
    captureSettings.previewPhotoFormat = previewFormat 

// For this line 
     self.output.capturePhoto(with: captureSettings, delegate: self as! AVCapturePhotoCaptureDelegate) 

    } 

錯誤是說,它不能的值轉換myViewControllerAVCapturePhotoCaptureDelegate

我怎樣才能解決這個問題?

+1

請在您的視圖控制器中實現AVCapturePhotoCaptureDelegate –

+0

類StartVC:UIViewController

+0

我試圖實現委託,但它也帶給我麻煩。你能否爲我實施委託功能? – mumu

回答

0

試試這個

class StartVC: UIViewController { 
} 
extension StartVC: AVCapturePhotoCaptureDelegate{ 
} 

無需鑄造

self.output.capturePhoto(with: captureSettings, delegate: self) 

它可以是也寫爲

class StartVC: UIViewController,AVCapturePhotoCaptureDelegate { 


} 
+0

如果我不投它,它會帶來錯誤。什麼是擴展的實現? – mumu

+0

「AVCapturePhotoCaptureDelegate」的委託功能可以在擴展名內部調用 – Vishnu

1

這個錯誤是因爲你沒有確認AVCapturePhotoCaptureDelegate到你已經寫了這段代碼的viewController。

爲了解決這個錯誤,請在你的類聲明中添加 'AVCapturePhotoCaptureDelegate' 象下面這樣:

class myViewController: UIViewController,AVCapturePhotoCaptureDelegate{ 


} 
0

嘗試在info.plist中添加「隱私 - 相機使用說明」鍵。如果您使用的是iOS 10+。

這個鍵是從我們的應用程序訪問攝像頭所必需的。