需要说明旋转 AV 摄像机的步骤
Need An Explanation of Steps to Rotate AV Camera
所以我遇到了旋转问题。我有一个 AV 摄像机设置为在视图控制器中显示。现在我知道其中涉及很多组件,这就是为什么我只是说 AV 摄像机。我的问题是,当我旋转设备时,预览层也不随设备旋转。这除了有任何按钮或任何类型的记录操作之外,只是预览要捕获的内容。
我在这里和互联网上四处寻找,但我找不到任何东西可以简单地向我解释在设备旋转时正确旋转此预览所涉及的步骤。我找到的所有信息都是点点滴滴,很难理解如何根据我的逻辑修改这些代码片段。
如果我能在我需要用我的设备正确旋转这个预览层的地方获得一步一步的逻辑基础,那就太好了。非常感谢任何帮助。
谢谢
我想通了!我只需要应用我们在线性代数中学到的标准变换旋转矩阵!此函数在viewWillAppear
.
中注册设备轮换通知后,随设备轮换轮换videoPreviewLayer
虽然轮换并不顺畅。您可以看到层随设备旋转时的边缘。我试过将它分派到它自己的队列中,但并没有太大的区别。
我的解决方案是将预览层锁定到一个方向,UIDeviceOrientation.Portrait
,然后在视图中的按钮上应用 deviceOrientationDidChange()
。我怀疑我也必须在按下捕获时将它应用于 video/picture 数据,以便用户能够最终以他们采用 video/picture 的方式查看它。 (如有错误请指正)
/**************************************************************************
DEVICE ORIENTATION DID CHANGE
**************************************************************************/
func deviceOrientationDidChange() {
println("DEVICE ORIENTATION DID CHANGE CALLED")
let orientation: UIDeviceOrientation = UIDevice.currentDevice().orientation
//------ IGNORE THESE ORIENTATIONS ------
if orientation == UIDeviceOrientation.FaceUp || orientation == UIDeviceOrientation.FaceDown || orientation == UIDeviceOrientation.Unknown || orientation == UIDeviceOrientation.PortraitUpsideDown || self.currentOrientation == orientation {
println("device orientation is \(orientation) --- returning...")
return
}
self.currentOrientation = orientation
//------ APPLY A ROTATION USING THE STANDARD ROTATION TRANSFORMATION MATRIX in R3 ------
/*
x y z
--- ---
x | cosø -sinø 0 |
y | sinø cosø 0 |
z | 0 0 1 |
--- ---
BUT IMPLEMENTED BY APPLE AS
x y z
--- ---
x | cosø sinø 0 |
y | -sinø consø 0 |
z | 0 0 1 |
--- ---
*/
//----- PERFORM VIDEO PREVIEW LAYER ROTATION BEFORE CAMERA CONTROLLER ROTATION ------
switch orientation {
case UIDeviceOrientation.Portrait:
println("Device Orientation Portrait")
if self.usingFrontCamera == true {
}
else {
self.playBackTransformation = CGAffineTransformMakeRotation(self.degrees0)
self.videoPreviewLayer?.setAffineTransform(self.playBackTransformation!)
self.videoPreviewLayer!.frame = self.view.bounds
}
break
case UIDeviceOrientation.LandscapeLeft:
println("Device Orientation LandScapeLeft")
if self.usingFrontCamera == true {
}
else {
self.playBackTransformation = CGAffineTransformMakeRotation(CGFloat(-self.degrees90))
self.videoPreviewLayer?.setAffineTransform(self.playBackTransformation!)
self.videoPreviewLayer!.frame = self.view.bounds
}
break
case UIDeviceOrientation.LandscapeRight:
println("Device Orientation LandscapeRight")
if self.usingFrontCamera == true {
}
else {
self.playBackTransformation = CGAffineTransformMakeRotation(self.degrees90)
self.videoPreviewLayer?.setAffineTransform(self.playBackTransformation!)
self.videoPreviewLayer!.frame = self.view.bounds
}
break
default:
break
}
}
所以我遇到了旋转问题。我有一个 AV 摄像机设置为在视图控制器中显示。现在我知道其中涉及很多组件,这就是为什么我只是说 AV 摄像机。我的问题是,当我旋转设备时,预览层也不随设备旋转。这除了有任何按钮或任何类型的记录操作之外,只是预览要捕获的内容。
我在这里和互联网上四处寻找,但我找不到任何东西可以简单地向我解释在设备旋转时正确旋转此预览所涉及的步骤。我找到的所有信息都是点点滴滴,很难理解如何根据我的逻辑修改这些代码片段。
如果我能在我需要用我的设备正确旋转这个预览层的地方获得一步一步的逻辑基础,那就太好了。非常感谢任何帮助。
谢谢
我想通了!我只需要应用我们在线性代数中学到的标准变换旋转矩阵!此函数在viewWillAppear
.
videoPreviewLayer
虽然轮换并不顺畅。您可以看到层随设备旋转时的边缘。我试过将它分派到它自己的队列中,但并没有太大的区别。
我的解决方案是将预览层锁定到一个方向,UIDeviceOrientation.Portrait
,然后在视图中的按钮上应用 deviceOrientationDidChange()
。我怀疑我也必须在按下捕获时将它应用于 video/picture 数据,以便用户能够最终以他们采用 video/picture 的方式查看它。 (如有错误请指正)
/**************************************************************************
DEVICE ORIENTATION DID CHANGE
**************************************************************************/
func deviceOrientationDidChange() {
println("DEVICE ORIENTATION DID CHANGE CALLED")
let orientation: UIDeviceOrientation = UIDevice.currentDevice().orientation
//------ IGNORE THESE ORIENTATIONS ------
if orientation == UIDeviceOrientation.FaceUp || orientation == UIDeviceOrientation.FaceDown || orientation == UIDeviceOrientation.Unknown || orientation == UIDeviceOrientation.PortraitUpsideDown || self.currentOrientation == orientation {
println("device orientation is \(orientation) --- returning...")
return
}
self.currentOrientation = orientation
//------ APPLY A ROTATION USING THE STANDARD ROTATION TRANSFORMATION MATRIX in R3 ------
/*
x y z
--- ---
x | cosø -sinø 0 |
y | sinø cosø 0 |
z | 0 0 1 |
--- ---
BUT IMPLEMENTED BY APPLE AS
x y z
--- ---
x | cosø sinø 0 |
y | -sinø consø 0 |
z | 0 0 1 |
--- ---
*/
//----- PERFORM VIDEO PREVIEW LAYER ROTATION BEFORE CAMERA CONTROLLER ROTATION ------
switch orientation {
case UIDeviceOrientation.Portrait:
println("Device Orientation Portrait")
if self.usingFrontCamera == true {
}
else {
self.playBackTransformation = CGAffineTransformMakeRotation(self.degrees0)
self.videoPreviewLayer?.setAffineTransform(self.playBackTransformation!)
self.videoPreviewLayer!.frame = self.view.bounds
}
break
case UIDeviceOrientation.LandscapeLeft:
println("Device Orientation LandScapeLeft")
if self.usingFrontCamera == true {
}
else {
self.playBackTransformation = CGAffineTransformMakeRotation(CGFloat(-self.degrees90))
self.videoPreviewLayer?.setAffineTransform(self.playBackTransformation!)
self.videoPreviewLayer!.frame = self.view.bounds
}
break
case UIDeviceOrientation.LandscapeRight:
println("Device Orientation LandscapeRight")
if self.usingFrontCamera == true {
}
else {
self.playBackTransformation = CGAffineTransformMakeRotation(self.degrees90)
self.videoPreviewLayer?.setAffineTransform(self.playBackTransformation!)
self.videoPreviewLayer!.frame = self.view.bounds
}
break
default:
break
}
}