我的视频播放在我的手机上显示photocapture设备时,我遇到了一些问题。它实际上应该像内置相机应用程序一样灵活,这意味着它应该适用于
其中至少有一个总是错误的。我尝试https://projects.developer.nokia.com/cameraexplorer让它工作,但即使它有最好的方法,它不适合我在不同的页面方向和前置摄像头旋转错误的方式(顺时针旋转我的手机逆时针,所以我的上升下移)。
是否有任何带有完整工作相机videobrush的代码片段?
答案 0 :(得分:7)
要正确显示取景器,您需要两个信息:
首先,你需要一个以videobrush为背景的画布
<Canvas x:Name="viewfinderCanvas" Width="480" Height="800" >
<Canvas.Background>
<VideoBrush x:Name="viewfinderBrush" Stretch="None" />
</Canvas.Background>
</Canvas>
您必须使用 Stretch =“无”或XAML将在视图刷上应用缩放。现在您需要viewfinderBrush转换才能正确显示它。 默认情况下,画布中心对应于预览图片中心,因此我们需要计算角度,比例因子并使用画布中心作为转换中心。
计算您需要的角度:
代码:
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;
前置和后置摄像头的眼睛方向相反。因此,要正确显示前置摄像头,您需要在一个维度上应用镜像。在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
答案 1 :(得分:3)
问题是陈旧的,但无论如何,当使用前置摄像头时,网络上没有关于错误方向的答案。要解决此问题,您需要更改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 };
}
答案 2 :(得分:0)
你能解决这个问题吗?当使用前置摄像头时,我认识到了同样的行为。
我在Rectangle(承载videobrush元素)上应用了旋转变换(角度= 180°),并且它有效。我还在AudioVideoCaptureDevice对象上更改了EncodeWithOrientation属性的值,录制的电影也没问题。此解决方案仅适用于纵向模式,但是当您更改回横向时,一切都会出错,因此此tecnique并未真正解决问题。也许这是SDK中的一个错误?