Используйте поверхность ImageReader для видеопотока без Camera2 API

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

В идеале у меня было бы две поверхности: одна для предварительного просмотра и одна из ImageReader для обработки изображения. Похоже на это. Я понимаю, что вы объединяете две поверхности с CaptureRequest.Builder а потом .addTarget(surface), Проблема в том, что у меня нет CamerDevice сделать createCaptureRequest,

Код, который я использую, можно найти здесь.

Я попытался просто создать ImageReader и его поверхность и передать его startDecoding функция. Но это не сработало, так как я получил эту ошибку:

E/JNI: close+++++++
E/BufferQueueProducer: [ImageReader-1280x720f32315659m16-17834-0] dequeueBuffer: BufferQueue has been abandoned
E/ACodec: NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: No such device (19)
E/ACodec: Failed to allocate output port buffers after port reconfiguration: (-19)
E/ACodec: signalError(omxError 0x80001001, internalError -19)
E/MediaCodec: Codec reported err 0xffffffed, actionCode 0, while in state 6
E/AccessHeadCameraActivity: Error has occured.
                            java.lang.IllegalStateException
                            at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)
                            at android.media.MediaCodec.dequeueOutputBuffer(MediaCodec.java:2379)

Любой намек в правильном направлении был бы хорош!

Обновление 1:

Ошибка возникает из-за возвращаемого значения dequeueOutputBuffer, так как это имеет значение -1, Согласно документации на MediaCodec, это означает, что время ожидания истекло. Но почему это происходит?

Обновление 2

У меня нет surfaceCreated (потому что у меня больше нет SurfaceView), так что код переместился в onCreate, Все остальное почти так же, как здесь

@Override
public void onCreate(Bundle savedInstanceState) {

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_acess_headcamera);
    mediaManager = (MediaManager) getUnitManager(FuncConstant.MEDIA_MANAGER);

    setupImageReader();

    StreamOption streamOption = new StreamOption();
    streamOption.setChannel(StreamOption.MAIN_STREAM);
    streamOption.setDecodType(StreamOption.HARDWARE_DECODE);
    streamOption.setJustIframe(false);
    mediaManager.openStream(streamOption);

    surface = imageReader.getSurface();
    startDecoding(surface);

    initListener();
}

private void setupImageReader() {
    imageReader = ImageReader.newInstance(width, height, ImageFormat.YV12,
            IMAGE_READER_BUFFER_SIZE);
    imageReader.setOnImageAvailableListener(onImageAvailableListener, backgroundHandler);
}

0 ответов

Другие вопросы по тегам