问题描述
我正在尝试将 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 (将#修改为@)