2015-05-29 2 views
5

Я знаю, что этот вопрос задан раньше, однако я не могу найти какие-либо решения, которые работают.Nexus 6 Front Camera Upside Down

Передняя камера Nexus 6 всегда показывает вверх ногами в моем приложении. Некоторые из решений - использовать «setDisplayOrientation», что делает флип камеры на экране. Однако мы кодируем видео с frames, полученным от onPreviewFrame.

Согласно Android SDK Documentation, setDisplayOrientation фактически не изменяет byte[] в onPreviewFrame.

Это не влияет на порядок массива байтов, переданный в onPreviewFrame (байт [], камеру), изображения JPEG или записанные видео. Этот метод не может быть вызван во время предварительного просмотра.

Если это не возможно получить Nexus 6 фронтальная камера onPreviewFrame кадров в correct orientation, что является fastest способ перевернуть каждый кадр, не испытав падение кадров в секунду.

Спасибо!

+0

Вы не можете показывать свои коды? – Raptor

+0

Я не могу .. Активность камеры имеет пару 1000 строк, которые мне нужно будет пройти. В этом нет ничего особенного. Установка размера предварительного просмотра 720p на передней камере с использованием оригинальной камеры api (Not Camera2). Передняя камера на Nexus 6 является единственным телефоном, который мы это видели. Быстрый поиск в Google показывает, что это ошибка Nexus 6. Даже Instagram и Snapchat имели эту проблему в какой-то момент (хотя они, похоже, исправили ее). Я сомневаюсь, что им нужны необработанные кадры из onPreviewFrame. – tylerjroach

+0

Я постараюсь заполучить Nexus 6 завтра и создать урезанное приложение для камеры с проблемой. Это был большой приоритет, поскольку знаменитость недавно использовала приложение и ... конечно, у него был Nexus 6. – tylerjroach

ответ

2

Мне удалось разрешить это и сохранить fps высоко, открыв cv, чтобы перевернуть фреймы.

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 (байт [], камера), изображения JPEG или записанные видео. Этот метод не разрешается вызывать во время предварительного просмотра». Мне удалось заставить его работать с моим решением выше. Спасибо за ваш вклад! – tylerjroach

0

Самый быстрый способ - сделать щелчок внутри самого графического процессора. Проведите предварительный просмотр камеры на GLSurfaceView и используйте вершинные шейдеры, чтобы перевернуть изображение вверх ногами. Затем используйте glReadPixels для получения байтов текущего кадра. Я не уверен в производительности glReadPixels на других телефонах, но это должно быть довольно быстро в Nexus 6/5.

+0

Спасибо за ваш ответ. Это похоже на действительное решение, однако, я уже исправил проблему в своем ответе (не принимая удар по fps) с помощью JavaCV. Эта библиотека уже использовалась для обработки видео. Спасибо за ваше решение! – tylerjroach

Смежные вопросы