2015-05-29 15 views
5

So che questa domanda è stata fatta prima, tuttavia, non sono in grado di trovare alcuna soluzione che funzioni.Fotocamera frontale Nexus 6 sottosopra

La fotocamera frontale Nexus 6 viene sempre visualizzata capovolta nella mia app. Alcune delle soluzioni prevedono l'uso di "setDisplayOrientation", che capovolge la fotocamera sullo schermo. Tuttavia, codifichiamo il video conricevuto da onPreviewFrame.

In base allo Android SDK Documentation, setDisplayOrientation in realtà non cambia loin onPreviewFrame.

Questo non ha alcun effetto sull'ordine di serie di byte passati in onPreviewFrame (byte [], fotocamera), immagini JPEG o video registrati. Questo metodo non può essere chiamato durante l'anteprima.

Se non è possibile ottenere la fotocamera anteriore Nexus 6onPreviewFrame fotogrammi nella correct orientation, qual è il modo fastest sfogliare ogni fotogramma, senza subire un calo di fps.

Grazie!

+0

Puoi mostrare i tuoi codici? – Raptor

+0

Non posso .. L'attività della fotocamera ha un paio di 1000 linee che avrei bisogno di passare. Non c'è davvero niente di speciale a riguardo. Impostazione di una dimensione di anteprima di 720p sulla fotocamera anteriore utilizzando l'originale Camera api (Not Camera2). La fotocamera frontale del Nexus 6 è l'unico telefono che abbiamo visto. Una rapida ricerca su Google mostra che si tratta di un bug di Nexus 6. Anche Instagram e Snapchat hanno avuto questo problema ad un certo punto (anche se sembrano averlo risolto). Dubito che abbiano bisogno dei frame grezzi da onPreviewFrame. – tylerjroach

+0

Domani cercherò di procurarmi un Nexus 6 e creerò un'app per fotocamera smontata con il problema. Questa è stata una grande priorità in quanto una celebrità ha usato di recente l'app e ... ovviamente aveva un Nexus 6. – tylerjroach

risposta

2

Sono stato in grado di risolvere questo e mantenere alto fps utilizzando cv aperto per capovolgere i fotogrammi.

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

hai apportato questa modifica solo per nexus 6, o qualsiasi altro dispositivo aveva questo problema? –

3

Il frammento di codice sotto Camera.setDisplayOrientation() risolto questo problema per me. Devi provarlo.

+0

Sfortunatamente questo metodo non funziona per i frame di anteprima ricevuti in onPreviewFrame. "Questo non ha alcun effetto sull'ordinamento della matrice di byte trasmessa in onPreviewFrame (byte [], Camera), immagini JPEG o video registrati. Questo metodo non può essere richiamato durante l'anteprima." Sono stato in grado di farlo funzionare con la mia soluzione sopra. Grazie per il tuo contributo! – tylerjroach

0

Il modo più veloce sarebbe fare il flipping all'interno della GPU stessa. Rendi l'anteprima della fotocamera su un GLSurfaceView e usa i vertex shader per capovolgere l'immagine. Quindi, utilizzare glReadPixels per ottenere i byte del fotogramma corrente. Non sono sicuro delle prestazioni di glReadPixels su altri telefoni, ma dovrebbe essere abbastanza veloce in Nexus 6/5.

+0

Grazie per la risposta. Questa sembra una soluzione valida, tuttavia, ho già risolto il problema nella mia risposta (senza prendere un colpo di fps) con JavaCV. Questa libreria era già in uso per l'elaborazione video. Grazie per la soluzione! – tylerjroach

Problemi correlati