我有一个相机应用程序,锁定到景观.需要时,我会旋转从中获取的原始字节,onPreviewFrame()并使用它们对视频进行编码.
然而,这种方法在Nexus 5X和6设备中失败了,因为它们的反向传感器让我倒置了帧.
随着旋转的预览会不会帮助我在这种情况下,描述在这里:
这不影响在onPreviewFrame(byte [],Camera)中传递的字节数组的顺序
我想知道是否有任何方法可以检测相机传感器是否反转和/或原始帧是否颠倒,因此在旋转时会增加额外的校正.
Android提供此代码,使相机预览面朝上显示所有相机和屏幕方向:
public static void setCameraDisplayOrientation(Activity activity,
int cameraId, android.hardware.Camera camera) {
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate …Run Code Online (Sandbox Code Playgroud) 我是Android开发中的新手,所以如果我的问题很简单,我会提前道歉.在我的应用程序的一部分,我需要我的后置摄像头的实时预览,所以我创建了一个自定义类,扩展SurfaceView并实现SurfaceHolder.Callback(我基本上遵循了android文档中的说明).
不幸的是,我正在Nexus 5x中测试我的应用程序,我刚刚意识到它已经以相反的方式安装了相机传感器.出于这个原因,在我的Nexus 5x上运行时,我的应用程序的相机预览显示为颠倒,这是我不想要的.
似乎新的android.hardware.camera2 API能够自动处理这个问题.最终我需要使用这个新API更新我的所有代码,但是现在我需要的是使用旧相机API时的快速修复.
所以我在那里读书,我发现了一段代码,我需要在SurfaceChanged方法中引入以解决这个问题.这里是:
Display display = ((WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
if(display.getRotation() == Surface.ROTATION_0)
{
parameters.setPreviewSize(capHeight, capWidth);
camera.setDisplayOrientation(90);
}
if(display.getRotation() == Surface.ROTATION_90)
{
parameters.setPreviewSize(capWidth, capHeight);
}
if(display.getRotation() == Surface.ROTATION_180)
{
parameters.setPreviewSize(capHeight, capWidth);
}
if(display.getRotation() == Surface.ROTATION_270)
{
parameters.setPreviewSize(capWidth, capHeight);
camera.setDisplayOrientation(180);
}
camera.setParameters(parameters);*/
camera.startPreview();
Run Code Online (Sandbox Code Playgroud)
问题是我没有看到某些事情发生了变化.
有什么想法吗?