0

我正在尝试将 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。(来源

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

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

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

4

0 回答 0