Является ли SURFACE_TYPE_NORMAL действительным типом камеры Android? - PullRequest
0 голосов
/ 16 декабря 2011

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

При первом запуске япросто звонил:

holder = getHolder();
holder.addCallback(this);
... 
camera.addCallbackBuffer(buffer);
camera.setPreviewDisplay(holder);
camera.setPreviewCallbackWithBuffer(callback);
camera.startPreview();

Внутри обратного вызова я делаю следующее:

SurfaceHolder holder;
Canvas c = holder.lockCanvas();
if (c != null) {
    try {
        // Draw to canvas
    } finally {
        holder.unlockCanvasAndPost(c);
    }
}

Это работало довольно хорошо и давало достойную производительность на Motorola Photon.* У меня также есть Motorola Droid и LG Optimus;на этих двух устройствах onPreviewFrame никогда не будет вызвано, и в результате держатель никогда не будет извлечен при обратном вызове.И пользователь застрянет с черным экраном.

После поиска я обнаружил, что необходимо добавить следующую строку

holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

С этой строкой я наконец получаю обратный вызов.Но проблема в том, что если я пытаюсь позвонить holder.lockCanvas(), я получаю сообщение об ошибке, так как это не разрешено с SURFACE_TYPE_PUSH_BUFFERS.

Теперь я смог обойти эту проблему, поместив ImageView поверх SurfaceView и вместо этого нарисовав кадры в ImageView.Но производительность этого ужасна по сравнению с использованием SURFACE_TYPE_NORMAL.

Мои вопросы:

  • Является ли SURFACE_TYPE_NORMAL допустимым используемым типом, илимогу ли я доверять только SURFACE_TYPE_PUSH_BUFFERS?
  • Если это так, можно ли определить, поддерживает ли устройство SURFACE_TYPE_NORMAL, чтобы я мог выжать этот дополнительный бит производительности из устройств, которые это делают?Существуют ли определенные версии Android или производители, которые поддерживают его?

В качестве примечания, я понимаю, что для Honeycomb (3.0) эти значения больше не поддерживаются.Но они требуются для 2.3 и ниже.Также для ICS (4.0), новый конвейер SurfaceTexture работает быстро.Но я все равно хотел бы поддержать как минимум 2.2 и 2.3.

1 Ответ

0 голосов
/ 03 января 2012

Хотя я не получил официального ответа и, вероятно, не получу, поскольку в более новых версиях Android это не рекомендуется, я обнаружил, что SURFACE_TYPE_NORMAL недопустимо для использования с предварительным просмотром камеры на многих устройствах.

Этот ответ приходит от тестирования на различных устройствах. На некоторых устройствах видео никогда не будет получено; это не имеет никакого отношения к различным используемым параметрам.

...