На одном из моих двух устройств 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)