Камера onPreviewFrame () не вызывается на некоторых устройствах (отсутствует предварительный просмотр) - PullRequest
0 голосов
/ 02 февраля 2019

На одном из моих двух устройств onPreviewFrame не вызывается, несмотря на то, что я использую один и тот же код.

Я пытаюсь получить, обработать (с помощью OpenCV) и затем отобразить кадры камеры с использованием устаревшихAPI камеры.(Поскольку я использую устройство LEGACY, а устаревший API обеспечивает лучшую производительность для него.)

Это означает, что я не хочу напрямую отображать кадры предварительного просмотра, но я смог определить это на этомустройство, настройка отображения необходима для предварительного просмотра.Это означает, что я должен установить своего рода высокопроизводительный фиктивный дисплей.Мои варианты: setPreviewDisplay -> SurfaceHolder и setPreviewTexture -> SurfaceTexture.

Еще одна вещь, которую я узнал, заключается в том, что setPreviewCallbackWithBuffer тоже не работает на этом устройстве: я должен использовать setPreviewCallback.

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

Мне не удалось найти пустышку SurfaceHolder для метода setPreviewDisplay, поэтому я не смог получить обратные вызовы для предварительного просмотра, которые будут вызываться с помощью этого метода.С другой стороны, setPreviewTexture с новым SurfaceTexture вызывает onPreviewFrame, но я постоянно получаю сообщение об ошибке «BufferQueue был заброшен», и данные предварительного просмотра также кажутся неверными: пока я устанавливаю формат изображенияизображение, созданное из указанных данных, неверно.Глядя на разные цвета, изображение становится разным.Опять же, тот же код работал на другом устройстве, и я установил формат изображения, поэтому вывод должен быть действительным.

Мой текущий код, где вызывается onPreviewFrame, но с неверными данными:

camera = Camera.open();
camera.setPreviewTexture(new SurfaceTexture(1));
camera.setPreviewCallback(this);
camera.setParameters(configurator.getParameters()); //sets the resolution (same on both devices), the fps range and the format to ImageFormat.YV12 (or NV21, makes no difference)
camera.startPreview();

Телефон, для которого не требуется предварительный просмотр: Doogee X5 MAX
Телефон, у которого возникли проблемы: Samsung Galaxy J3 (2016)

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

setPreviewCallbackWithBuffer не работал, потому что буфер был слишком мал.Я не видел ошибки, пока не избавился от ошибок "BufferQueue был заброшен"Причина слишком малого размера буфера в том, что:

  • Я не запрашивал размер предварительного просмотра, я просто использовал значение, которое я установил для размера предварительного просмотра

  • Я позвонил Camera.Parameters#setRecordingHint(true), что привязало мое разрешение (и, возможно, другие настройки) к жестко заданным значениям.Это разрешение не совпадает с тем, которое я выбрал, поэтому мой буфер действительно был слишком мал.

0 голосов
/ 03 февраля 2019

Re: фиктивная текстура предварительного просмотра, это лучший обходной путь, который вы можете получить.Официальный API требует, чтобы предварительный просмотр куда-то шел, и большинство устройств применяют эту политику.

Нет способа проверить во время выполнения, доставляет ли устройство предварительный просмотр в реальном времени без «раковины» (поверхности или текстуры) для рисования.,В других подобных ситуациях мы вынуждены поддерживать белые и черные списки устройств на основе лабораторных экспериментов по обеспечению качества и жалоб конечных пользователей.Для некоторых функций метод состоит в том, чтобы попробовать оптимальную настройку при первом запуске вашего приложения (на определенном устройстве), и, если в другом случае происходит сбой или сбой, использовать менее эффективную альтернативу во второй попытке и оставить этот флаг в SharedPreferences для будущих запусков.

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

Комуизбегайте «BufferQueue был оставлен» ошибки, добавьте пустышку SurfaceTexture в качестве поля в вашей деятельности или фрагменте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...