为光电捕捉设备旋转视频刷
本文关键字:旋转 视频 | 更新日期: 2023-09-27 18:19:22
我在手机上显示视频刷的方向有一些问题。它实际上应该像内置的相机应用程序一样灵活,这意味着它应该适用于
- 所有纵横比
- 两个摄像头(前后)
- 和所有页面方向
至少有一个总是错误的。我试过https://projects.developer.nokia.com/cameraexplorer让它工作,但即使它有最好的方法,它不适合我在不同的页面方向和前置摄像头旋转错误的方式(逆时针当我顺时针旋转我的手机,所以我是颠倒的)。
是否有一个完整的工作摄像机视频刷代码片段?
要正确显示取景器,需要以下两个信息:
- orientation:预览图片相对于页面方向的方向
- 缩放:预览图片大小和xaml控件之间的因子。
首先你需要一个画布,videobrush作为背景
<Canvas x:Name="viewfinderCanvas" Width="480" Height="800" >
<Canvas.Background>
<VideoBrush x:Name="viewfinderBrush" Stretch="None" />
</Canvas.Background>
</Canvas>
你必须使用Stretch="None"否则XAML将在viewbrush上应用缩放。现在你需要viewfinderBrush转换来正确显示它。默认情况下,画布中心对应于预览图片的中心,所以我们需要计算一个角度,一个比例因子,并使用画布中心作为变换中心。
计算所需角度:
- 相对于设备纵向方向的传感器方向。这个值由PhotoCaptureDevice。SensorRotationInDegrees财产。
- 你的页面相对于设备的纵向方向。
double ComputeAngle(PageOrientation orientation)
{
if ((orientation & PageOrientation.Portrait) == PageOrientation.Portrait)
{
return m_captureDevice.SensorRotationInDegrees;
}
else if ((orientation & PageOrientation.LandscapeLeft) == PageOrientation.LandscapeLeft)
{
return m_captureDevice.SensorRotationInDegrees - 90;
}
else //PageOrientation.LandscapeRight
{
return m_captureDevice.SensorRotationInDegrees + 90;
}
}
比例只是画布尺寸和预览图片尺寸之间的因子:
//orient preview picture size from the computed anle.
var tmp = new CompositeTransform(){Rotation = ComputeAngle(currentPageOrientation)};
var previewSize = tmp.TransformBounds (new Rect(new Point(), new Size(m_captureDevice.PreviewResolution.Width, m_captureDevice.PreviewResolution.Height))).Size;
double s1 = viewfinderCanvas.Width/ (double)previewSize.Width;
double s2 = viewfinderCanvas.Height/ (double)previewSize.Height;
- 如果您使用最大因子,则可以创建Fit =>缩放=数学。马克斯(s1, s2)
- 如果你使用最小因子,你做一个Fit In =>缩放=数学。分钟(s1, s2)
前后摄像头的视线方向相反。因此,为了正确显示前置摄像头,你需要在一个维度上应用镜子。在WP8传感器上,方向通常为90°,因此Y尺寸相反。
if (sensorLocation == CameraSensorLocation.Back)
{
viewfinderBrush.Transform = new CompositeTransform() {
Rotation = ComputeAngle(currentPageOrientation),
CenterX = viewfinderCanvas.Width / 2,
CenterY = viewfinderCanvas.Height / 2,
ScaleX = scale,
ScaleY = scale };
}
else
{
viewfinderBrush.Transform = new CompositeTransform() {
Rotation = ComputeAngle(currentPageOrientation),
CenterX = viewfinderCanvas.Width / 2,
CenterY = viewfinderCanvas.Height / 2,
ScaleX = scale,
ScaleY = -1 * scale };//Y mirror
}
您可以在github上找到示例的最新版本:https://github.com/yan-verdavaine/wp8-sample/tree/master/Imaging/ViewFinder
这个问题很老了,但是无论如何,在网络上没有关于使用前置摄像头时方向错误的答案。为了解决这个问题,你需要改变VideBrush X轴的方向。下面是如何做到这一点的代码片段:
if (cameraType == CameraType.Primary)
{
viewfinderBrush.RelativeTransform =
new CompositeTransform() { CenterX = 0.5, CenterY = 0.5, Rotation = 90 };
}
else
{
viewfinderBrush.RelativeTransform =
new CompositeTransform() { CenterX = 0.5, CenterY = 0.5, Rotation = 90, ScaleX = -1 };
}
你能解决这个问题吗?当使用前置摄像头时,我也发现了同样的行为。
我在矩形(包含videobrush元素)上应用旋转变换(角度= 180°),它工作了。我还改变了AudioVideoCaptureDevice对象上的EncodeWithOrientation属性的值,录制的电影也没问题。这个解决方案只适用于纵向模式,但是当你改回横向模式时,一切都错了,所以这个技术并不能真正解决问题。也许这是SDK中的错误?