ImageReader.acquireLatestImage 抛出异常

问题描述

我正在尝试将 ExoPlayer 的输出渲染到 ImageReader 上:

// Create the player
exoplayer = new SimpleExoPlayer.Builder(ctx).setTrackSelector(new DefaultTrackSelector(ctx)).build();

// Create the virtual output
ImageReader ir = ImageReader.newInstance(1920,1080,PixelFormat.RGBA_8888,5);

imageReader.setonImageAvailableListener(new ImageReader.OnImageAvailableListener() {
    @Override
    public void onImageAvailable(ImageReader imageReader) {
        imageReader.acquireLatestimage();
    }
},null);

exoplayer.setVideoSurface(ir.getSurface());
exoplayer.prepare(...);
exoplayer.setPlayWhenReady(true);

有一些要求:

  • 即使在 Android 处于睡眠状态(屏幕关闭)期间,ImageReader 也应接收 Exo 的渲染
  • ExoPlayer 没有任何“真正的”渲染表面,只有这个 imageReader.getSurface

现在,step0 是让它工作,但我无法达到它的原因:imageReader.acquireLatestimage() 抛出异常:

java.lang.UnsupportedOperationException:生产者输出缓冲区格式 0x7fa30c06 与 ImageReader 配置的缓冲区格式 0x1 不匹配。

我可以理解抛出消息,但我无法弄清楚0x7fa30c06

应该是 ycbcr_420_SP。但此常量已被弃用,并建议

改用 ImageFormat.NV21。 (https://coderwall.com/p/b6j9mw/fix-textmate-code-completion-for-rails-4-models)

我尝试用 NV21 初始化 ImageReader,但随后又发生了崩溃:

java.lang.RuntimeException: java.lang.IllegalArgumentException: 不支持 NV21 格式

如何使用 ImageReader 从该播放器获取静止图像?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)