相机预览看起来很完美,但是当我拍照并将其保存到相机胶卷时,照片会非常暗。在这里尝试了一堆线程,但没有解决它。这是我的代码。
设置相机/预览并正常工作:
captureSession.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 back camera
if(device.position == AVCaptureDevicePosition.Back) {
captureDevice = device as? AVCaptureDevice
}
}
}
if captureDevice != nil {
beginSession()
}
func beginSession() {
var err : NSError? = nil
if captureSession.canAddInput(AVCaptureDeviceInput(device: captureDevice, error: &err)) {
captureSession.addInput(AVCaptureDeviceInput(device: captureDevice, error: &err))
if err != nil {
println("error: \(err?.localizedDescription)")
}
let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
self.view.layer.addSublayer(previewLayer)
self.view.bringSubviewToFront(cameraButton)
previewLayer?.frame = self.view.layer.frame
// start camera
captureSession.startRunning()
}
拍摄照片时调用:
@IBAction func photoTaken(sender: UIButton) {
stillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
if captureSession.canAddOutput(stillImageOutput) {
captureSession.addOutput(stillImageOutput)
}
var videoConnection = stillImageOutput.connectionWithMediaType(AVMediaTypeVideo)
if videoConnection != nil {
// Show next step button
self.view.bringSubviewToFront(self.nextStep)
self.nextStep.hidden = false
// Secure image
stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) {
(imageDataSampleBuffer, error) -> Void in
var imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)
self.image = UIImage(data: imageData)
}
// Freeze camera preview
captureSession.stopRunning()
}
}
当用户按下按钮继续拍摄照片后调用此照片(此时它会将图像保存到相机胶卷,但最终会让图像看起来更好):
@IBAction func nextStepTapped(sender: UIButton) {
// Save to camera roll & proceeed
UIImageWriteToSavedPhotosAlbum(self.image, nil, nil, nil)
}
我的猜测是问题在photoTaken()函数中,但我不知道。这是我第一次在Swift / Xcode中编写应用程序,因此非常感谢任何帮助。同样,问题是保存的照片非常黑暗,我已经尝试了几乎所有我能在互联网上找到的与此问题相关的内容,但没有任何作用。谢谢!
编辑:可能值得注意的是我在iPhone 4S上测试了这个。这与它有什么关系吗?
答案 0 :(得分:18)
问题在于我正在拍摄这张照片:
stillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
if captureSession.canAddOutput(stillImageOutput) {
captureSession.addOutput(stillImageOutput)
}
我将该部分从photoTaken()(在拍摄照片时调用)移动到beginSession()(调用以启动相机),现在它可以正常工作。按下照片按钮后设置输出可能会导致延迟/延迟,并且无法使相机完全通过动作。
答案 1 :(得分:0)
"首次执行应用程序时,第一次调用AVCaptureDeviceInput.deviceInputWithDevice()会触发系统对话框,要求用户允许使用相机。这是在iOS 7的一些国家推出的,并且扩展到iOS 8的所有区域。在用户接受对话框之前,摄像机输入将发送黑色帧流。"
您可以在此处找到更多信息:http://www.objc.io/issue-21/camera-capture-on-ios.html