2013-09-04 2 views
4

Я много разбирался в этой теме, но кажется, что я делаю что-то неправильно или мое понимание как-то не так.Максимальная производительность захвата и отображения видеокамеры

Поскольку у меня довольно хороший смартфон (Nexus 4), я предположил, что это должно быть тривиальной задачей. Но все мои усилия не оправдались. Например. Я достиг всего 10 FPS для потока 800x480, используя новейшую инфраструктуру OpenCV.

Итак, можно ли достичь> 25FPS для захвата и отображения высококачественного видео с камеры моего телефона? Если да, то какова лучшая стратегия для этого? Особые соображения устройства приветствуются.

Ресурсы я использовал:

Update: Я был в состоянии увеличить производительность до захвата почти постоянными ~ 25fps @ 1280x720, просто установив recording hint, пока e используя SurfaceTexture и TextureView в качестве раковины камеры.

Однако мне интересно, возможно ли увеличить производительность еще больше. Я пытался использовать разные форматы предварительного просмотра, но без везения. Возможно, существует неявный верхний предел, примененный к производительности захвата, о котором я не знаю.

Тем не менее, я продолжу исследования и информирую вас. Все виды информации по-прежнему приветствуются!

+1

Не знаю, просто добавьте комментарий, чтобы получить уведомление об итогах;) (и, для сравнения, мой дешевый таблетка trekstor получает 15 кадров в секунду (640x480) без какой-либо обработки, ocv245 – berak

+0

openCV неизменно неряшлив IMO - что происходит, когда вы пытаетесь потоковой передачи без него? –

+1

Другой ресурс для использования: http://stackoverflow.com/questions/3871311/how-can-i-profile-my-android-app – Bull

ответ

2

Ограничивающим фактором является то, как быстро вы можете перемещать большую кучу данных. Существует аналогичная дискуссия here. У вас есть три задачи: (1) получить изображение, (2) сохранить изображение («захват») и (3) отобразить изображение. (Если я неправильно понял ваш вопрос, и вам не понадобится №2, то режим предварительного просмотра камеры Surface будет делать то, что вы хотите на высокой скорости.)

Один подход к эффективному использованию полосы пропускания, доступный на Android 4.3 , должен подать предварительный просмотр камеры Surface в кодер AVC, сохранить закодированный поток MPEG, а затем декодировать кадры для отображения. Буферы из камеры могут быть поданы в кодировщик MediaCodec без необходимости их копирования или преобразования данных в другой формат. (См. Пример CameraToMpegTest.) Этот подход может быть несовместим с одной из ваших заявленных целей: сжатие, применяемое к каждому кадру, может снизить качество ниже допустимых уровней.

Если вам нужно сохранить рамки «целиком», вам нужно скопировать данные, возможно, несколько раз, и записать их на диск. Чем больше кадр, тем больше данных вам нужно переместить, а тем медленнее все. Например, камера захватывает данные и записывает их в собственный буфер; собственный буфер копируется в управляемый буфер для Dalvik VM; буфер записывается на диск; YUV преобразуется в RGB; RGB отображается на экране, загружая данные в текстуру и визуализируя их.

+0

Спасибо за подробное объяснение. Я рассмотрю это и посмотрю, как t по сравнению с моим текущим подходом. –

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