【问题标题】:Why does AVFoundation display at the same zoom level as UIImagePickerController when UIImagePickerController is in video mode?UIImagePickerController 处于视频模式时,为什么 AVFoundation 显示的缩放级别与 UIImagePickerController 相同?
【发布时间】:2017-10-08 10:46:13
【问题描述】:

当 UIImagePickerController 处于视频模式时,为什么 AVFoundation 显示的缩放级别与 UIImagePickerController 相同?如何让 AVFoundation 在照片模式下显示与 UIImagePickerController 相同的缩放级别?

import UIKit
import AVFoundation
class ViewController: UIViewController {
    var captureSession = AVCaptureSession()
    var sessionOutput = AVCapturePhotoOutput()
    var sessionOutputSetting = AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecJPEG])
    var previewLayer = AVCaptureVideoPreviewLayer()
    var cameraView: UIView?
    override func viewDidLoad() {
        cameraView = UIView(frame: view.frame)
        view.addSubview(cameraView!)
    }
    override func viewWillAppear(_ animated: Bool) {
        let deviceDiscoverySession = AVCaptureDeviceDiscoverySession(deviceTypes: [.builtInDualCamera, .builtInTelephotoCamera, .builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .unspecified)
        for device in (deviceDiscoverySession?.devices)! {
            if device.position == .back {
                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.frame = (cameraView?.bounds)!
                            previewLayer.videoGravity = AVLayerVideoGravityResizeAspect  //  AVLayerVideoGravityResizeAspectFill
                            previewLayer.connection.videoOrientation = .portrait
                            cameraView?.layer.addSublayer(previewLayer)
                        }
                    }
                } catch {
                    print("exception!")
                }
            }
        }
    }
    override func viewDidAppear(_ animated: Bool) {
        captureSession.startRunning()
    }
    override var shouldAutorotate: Bool {
        return false
    }
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }
}

【问题讨论】:

    标签: ios swift avfoundation uiimagepickercontroller


    【解决方案1】:

    两个视图的纵横比不同。顶视图用视频填充屏幕,并且一些视频被剪辑。而第二个视频没有。一般来说,视频的标准输出是 4:3 纵横比。您可以通过枚举 AVCaptureDeviceFormat 或您的 AVCaptureDevice 来验证这一点。调整您的 cameraView 大小,使其具有相同的纵横比,并且您应该获得相同的缩放级别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多