在没有Camera2 API的情况下将ImageReader表面用于视频流

时间:2018-07-17 09:50:57

标签: android android-camera video-capture image-reader

我正在尝试将相机的视频流放入图像读取器表面,以便能够处理这些图像。我找到了许多处理camera2 API的示例,但由于我的视频流来自外部摄像头,所以我不使用它。

理想情况下,我将具有两个表面:一个表面作为预览,另一个表面从ImageReader处理图像。与this类似。我了解到您将两个曲面分别与CaptureRequest.Builder.addTarget(surface)组合在一起。问题是我没有CamerDevice来制作createCaptureRequest

我正在使用的代码可以找到here

我试图只创建一个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上的docs,这意味着呼叫超时。但是为什么会这样呢?

更新2

我没有surfaceCreated(因为我不再有SurfaceView),所以代码移到了onCreate中。其他所有内容与here

中的内容几乎相同
@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 个答案:

没有答案