当设备处于横向状态时,预览相机旋转 90º



我正在开发一个基于此repo示例的应用程序(https://github.com/tensorflow/examples/blob/master/lite/examples/image_classification/ios/ImageClassification/Camera%20Feed/CameraFeedManager.swift)。我已经建立了与样品相同的预览相机结构,所以我在人像模式下启动应用程序,预览相机可以正常工作。但是,我改为landscapeRigh或我将应用程序设置为仅模式landscaperight和。。。。预览旋转90º。我已尝试使用命令:videoDataOutput.connection(with: .video)?.videoOrientation = .landscapeRight但它不起作用……我可以设置所有模式,而且它总是有相同的行为。你能给我一些建议来解决这个问题吗?谢谢

您需要更新预览层的连接.videoOrientation

我抓住了这个例子,创建了一个新项目,并将其简化为基本内容——没有TensorFlow引用,没有剪贴板图像,没有按钮/选项等。

这将在40,40(左上角(创建一个280 x 280视频视图。您需要从链接到的回购中获得的东西是CameraFeedManager.swift:

没有@IBOutlet@IBAction连接。。。只需创建一个新的视图控制器,并将其自定义类分配给MyTestViewController:

导入AVFoundation导入UIKit

class MyTestViewController: UIViewController {
var previewView: PreviewView = {
let v = PreviewView()
return v
}()
private lazy var cameraCapture = CameraFeedManager(previewView: previewView)
override func viewDidLoad() {
super.viewDidLoad()
let g = view.safeAreaLayoutGuide
previewView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(previewView)
NSLayoutConstraint.activate([
previewView.topAnchor.constraint(equalTo: g.topAnchor, constant: 40.0),
previewView.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 40.0),
previewView.widthAnchor.constraint(equalToConstant: 280.0),
previewView.heightAnchor.constraint(equalTo: previewView.widthAnchor),
])
cameraCapture.delegate = self
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
#if !targetEnvironment(simulator)
cameraCapture.checkCameraConfigurationAndStartSession()
#endif
}
#if !targetEnvironment(simulator)
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
cameraCapture.stopSession()
}
#endif
private func updatePreviewLayer(layer: AVCaptureConnection, orientation: AVCaptureVideoOrientation) {
layer.videoOrientation = orientation
previewView.previewLayer.frame = previewView.frame
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if let connection =  self.previewView.previewLayer.connection  {
let currentDevice: UIDevice = UIDevice.current
let orientation: UIDeviceOrientation = currentDevice.orientation
let previewLayerConnection: AVCaptureConnection = connection
if previewLayerConnection.isVideoOrientationSupported {
switch (orientation) {
case .portrait:
updatePreviewLayer(layer: previewLayerConnection, orientation: .portrait)
break
case .landscapeRight:
updatePreviewLayer(layer: previewLayerConnection, orientation: .landscapeLeft)
break
case .landscapeLeft:
updatePreviewLayer(layer: previewLayerConnection, orientation: .landscapeRight)
break
case .portraitUpsideDown:
updatePreviewLayer(layer: previewLayerConnection, orientation: .portraitUpsideDown)
break
default:
updatePreviewLayer(layer: previewLayerConnection, orientation: .portrait)
break
}
}
}
}
}
// MARK: CameraFeedManagerDelegate Methods
extension MyTestViewController: CameraFeedManagerDelegate {
func didOutput(pixelBuffer: CVPixelBuffer) {
// do something with the output
}
// MARK: Session Handling Alerts
func sessionWasInterrupted(canResumeManually resumeManually: Bool) {
print("session was interrupted")
}
func sessionInterruptionEnded() {
print("session interruption ended")
}
func sessionRunTimeErrorOccured() {
print("session runtime error")
}
func presentCameraPermissionsDeniedAlert() {
let alertController = UIAlertController(title: "Camera Permissions Denied", message: "Camera permissions have been denied for this app. You can change this by going to Settings", preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
let settingsAction = UIAlertAction(title: "Settings", style: .default) { (action) in
UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [:], completionHandler: nil)
}
alertController.addAction(cancelAction)
alertController.addAction(settingsAction)
present(alertController, animated: true, completion: nil)
}
func presentVideoConfigurationErrorAlert() {
let alert = UIAlertController(title: "Camera Configuration Failed", message: "There was an error while configuring camera.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
self.present(alert, animated: true)
}
}
// MARK: PreviewView
class PreviewView: UIView {
var shouldUseClipboardImage: Bool = false
var previewLayer: AVCaptureVideoPreviewLayer {
guard let layer = layer as? AVCaptureVideoPreviewLayer else {
fatalError("Layer expected is of type VideoPreviewLayer")
}
return layer
}
var session: AVCaptureSession? {
get {
return previewLayer.session
}
set {
previewLayer.session = newValue
}
}
override class var layerClass: AnyClass {
return AVCaptureVideoPreviewLayer.self
}
}

最新更新