Nexus 6前置摄像头倒置

问题描述:

我知道这个问题之前已经问过,但是,我找不到任何可行的解决方案。Nexus 6前置摄像头倒置

Nexus 6前置摄像头在我的应用程序中始终显示为倒置。其中一些解决方案是使用“setDisplayOrientation”,它可以在屏幕上翻转相机。然而,我们编码从onPreviewFrame收到的frames视频。

根据Android SDK DocumentationsetDisplayOrientation实际上并没有改变onPreviewFrame中的byte[]

这不会影响在onPreviewFrame传递(字节[],摄像机)字节数组,JPEG图像,或录制的视频的顺序。预览期间不允许调用此方法。

如果它是不可能得到Nexus 6前置摄像头onPreviewFrame帧在correct orientation,什么是翻转每一帧,而不遭受的FPS下降的fastest方式。

谢谢!

+0

你能显示你的代码吗? – Raptor

+0

我不能..相机活动有几条1000线,我需要通过。虽然没有什么特别的。使用原始相机api(不是相机2)在前置相机上设置720p的预览尺寸。 Nexus 6上的前置摄像头是我们看到的唯一一款手机。一个快速的Google搜索显示它是一个Nexus 6的bug。即使Instagram和Snapchat在某个时候也有这个问题(尽管他们似乎已经修复了这个问题)。我怀疑他们需要onPreviewFrame的原始帧。 – tylerjroach

+0

我会尽力明天看到Nexus 6,并创建一个精简版的相机应用程序。这一直是一个重要的优先事项,因为名人最近使用的应用程序和..当然,他有一个Nexus 6. – tylerjroach

我能够解决这个问题,并通过使用打开的cv翻转帧保持fps高。

yuvimage = opencv_core.IplImage.create(frame.getWith/2, frame.getHeight/2 * 3/2, IPL_DEPTH_8U, 1); 
yuvimage.getByteBuffer().clear(); 
yuvimage.getByteBuffer().put(halveYUV420(frame.getData(), frame.getWidth(), frame.getHeight())); 
rgbimage = opencv_core.IplImage.create(frame.getWidth/2, frame.getHeight/2, IPL_DEPTH_8U, 3); 
rgbimage.getByteBuffer().clear(); 
opencv_imgproc.cvCvtColor(yuvimage, rgbimage, opencv_imgproc.CV_YUV2BGR_NV21); 
opencv_core.cvFlip(rgbimage, rgbimage, 0); 
+0

你做了这个变化只适用于nexus 6,或任何其他设备有这个问题? –

Camera.setDisplayOrientation()下的代码片段为我解决了这个问题。你需要尝试一下。

+0

不幸的是,这种方法不适用于onPreviewFrame中收到的预览帧。 “这不会影响在onPreviewFrame(byte [],Camera)中传递的字节数组的顺序,JPEG图片或录制的视频,在预览过程中不允许调用此方法。”我能够在上面解决我的问题。感谢您的输入! – tylerjroach

最快的方法是在GPU内部进行翻转。 在GLSurfaceView上渲染相机预览,并使用顶点着色器将图像颠倒。 然后,使用glReadPixels来获取当前帧的字节。 我不确定其他手机上的glReadPixels的性能,但Nexus 6/5的速度应该相当快。

+0

感谢您的回复。这看起来像是一个有效的解决方案,但是,我已经用JavaCV在我的答案中解决了这个问题(不会对fps产生影响)。这个库已经被用于视频处理。感谢您的解决方案! – tylerjroach