Swift 3 - AVCapture自定义相机视图

13

我在跟随这个视频来制作一个自定义相机视图。

https://www.youtube.com/watch?v=w0O3ZGUS3pk

然而由于iOS 10和swift 3的更改,许多事情不再相关了。

以下是我在将废弃的函数更改为新函数后得到的代码... 然而没有错误,但在UIView上也看不到预览。

import UIKit
import AVFoundation

class ViewController: UIViewController, AVCapturePhotoCaptureDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    @IBOutlet weak var cameraView: UIView!
    var captureSession = AVCaptureSession();
    var sessionOutput = AVCapturePhotoOutput();
    var sessionOutputSetting = AVCapturePhotoSettings(format: [AVVideoCodecKey:AVVideoCodecJPEG]);
    var previewLayer = AVCaptureVideoPreviewLayer();

    override func viewWillAppear(_ animated: Bool) {
        let deviceDiscoverySession = AVCaptureDeviceDiscoverySession(deviceTypes: [AVCaptureDeviceType.builtInDuoCamera, AVCaptureDeviceType.builtInTelephotoCamera,AVCaptureDeviceType.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.unspecified)
        for device in (deviceDiscoverySession?.devices)! {
            if(device.position == AVCaptureDevicePosition.front){
                do{
                    let input = try AVCaptureDeviceInput(device: device)
                    if(captureSession.canAddInput(input)){
                        captureSession.addInput(input);

                        if(captureSession.canAddOutput(sessionOutput)){
                            captureSession.addOutput(sessionOutput);
                            previewLayer = AVCaptureVideoPreviewLayer(session: captureSession);
                            previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
                            previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait;
                            cameraView.layer.addSublayer(previewLayer);
                        }
                    }
                }
                catch{
                    print("exception!");
                }
            }
        }
    }

sessionOutputSetting 没有被使用...为什么? - StackUnderflow
1个回答

18

您忘记启动会话:

captureSession.startRunning()

并设置您的预览层框架:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    previewLayer.frame = cameraView.bounds
}

p.s. 在您添加会话输入和输出后,应退出该循环。


它应该只运行一次,不管怎样? - Jeff Huang
1
可能吧,但是这让我感到紧张。 - Rhythmic Fistman
1
例如,iPhone 7+ 上不是有两个后置摄像头吗?虽然不太可能,但未来的硬件可能会让你感到惊讶... - Rhythmic Fistman
是的,一定要跳出循环。如果可能的话,始终避免未来的问题。 - Christopher Smit
你能否为此创建一个新问题并包含你的代码? - Rhythmic Fistman
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接