我正在尝试使用AVCapturePhotoOutput
and捕获图像AVCaptureSession
,我的代码如下(通过 XCTest 运行它):
func testCapture() {
let expectation = expectation(description: "Camera")
let captureSession = AVCaptureSession()
let videoDevice = AVCaptureDevice.default(for: .video)
// Create the capture device.
let videoDeviceInput = try! AVCaptureDeviceInput(device: videoDevice!)
guard captureSession.canAddInput(videoDeviceInput) else {
assert(false)
return
}
captureSession.addInput(videoDeviceInput)
let photoOutput = AVCapturePhotoOutput()
guard captureSession.canAddOutput(photoOutput) else {
assert(false)
return
}
captureSession.sessionPreset = .photo
photoOutput.isHighResolutionCaptureEnabled = true
// Add the output.
captureSession.addOutput(photoOutput)
// Open the camera.
captureSession.startRunning()
// Create callback.
let delegate = Delegate({ photo in
print("Success")
expectation.fulfill()
})
let settings = AVCapturePhotoSettings()
photoOutput.capturePhoto(with: settings, delegate: delegate)
self.wait(for: [expectation], timeout: 30)
}
我的委托对象是:
private class Delegate: NSObject, AVCapturePhotoCaptureDelegate {
let callback: (AVCapturePhoto) -> Void
init(_ callback: @escaping (AVCapturePhoto) -> Void) {
self.callback = callback
}
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
print("Did finish processing photo: \(photo) error: \(error)")
self.callback(photo)
}
func photoOutput(_ output: AVCapturePhotoOutput, willBeginCaptureFor resolvedSettings: AVCaptureResolvedPhotoSettings) {
print("Will begin capture")
}
func photoOutput(_ output: AVCapturePhotoOutput, willCapturePhotoFor resolvedSettings: AVCaptureResolvedPhotoSettings) {
print("Will capture photo")
}
func photoOutput(_ output: AVCapturePhotoOutput, didFinishCaptureFor resolvedSettings: AVCaptureResolvedPhotoSettings, error: Error?) {
print("didFinishCaptureFor")
}
func photoOutput(_ output: AVCapturePhotoOutput, didFinishRecordingLivePhotoMovieForEventualFileAt outputFileURL: URL, resolvedSettings: AVCaptureResolvedPhotoSettings) {
print("didFinishRecordingLivePhotoMovieForEventualFileAt")
}
func photoOutput(_ output: AVCapturePhotoOutput, didCapturePhotoFor resolvedSettings: AVCaptureResolvedPhotoSettings) {
print("Did capture image")
}
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingLivePhotoToMovieFileAt outputFileURL: URL, duration: CMTime, photoDisplayTime: CMTime, resolvedSettings: AVCaptureResolvedPhotoSettings, error: Error?) {
print("Did finish processing live")
}
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?, previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) {
print("Did finish processing2")
}
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingRawPhoto rawSampleBuffer: CMSampleBuffer?, previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) {
print("Did finish processing raw")
}
}
运行代码会产生以下输出:
Will begin capture
Will capture photo
Did capture image
它缺少对didFinishProcessingPhoto
.
知道可能是什么原因吗?