2015-05-29 151 views
5

我知道這個問題之前已經問過,但是,我找不到任何可行的解決方案。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

回答

2

我能夠解決這個問題,並通過使用打開的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,或任何其他設備有這個問題? –

3

Camera.setDisplayOrientation()下的代碼片段爲我解決了這個問題。你需要嘗試一下。

+0

不幸的是,這種方法不適用於onPreviewFrame中收到的預覽幀。 「這不會影響在onPreviewFrame(byte [],Camera)中傳遞的字節數組的順序,JPEG圖片或錄製的視頻,在預覽過程中不允許調用此方法。」我能夠在上面解決我的問題。感謝您的輸入! – tylerjroach

0

最快的方法是在GPU內部進行翻轉。 在GLSurfaceView上渲染相機預覽,並使用頂點着色器將圖像顛倒。 然後,使用glReadPixels來獲取當前幀的字節。 我不確定其他手機上的glReadPixels的性能,但Nexus 6/5的速度應該相當快。

+0

感謝您的回覆。這看起來像是一個有效的解決方案,但是,我已經用JavaCV在我的答案中解決了這個問題(不會對fps產生影響)。這個庫已經被用於視頻處理。感謝您的解決方案! – tylerjroach

相關問題