我正在尝试将 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
来从此播放器中获取静止图像?