Я пытаюсь передать видеопоток камеры на поверхность устройства чтения изображений, чтобы иметь возможность обрабатывать эти изображения. Я нашел много примеров, связанных с API камеры2, но я не использую его, потому что мой видеопоток поступает с внешней камеры.
В идеале у меня было бы две поверхности: одна для предварительного просмотра, а другая - от 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);
}