如何从ImageReader android获取InputStream

时间:2014-02-08 15:22:13

标签: java android surfaceview file-descriptor fileinputstream

我在看这堂课:https://developer.android.com/reference/android/media/ImageReader.html

我想要的是从ImageReader类中获取一个InputStream,并获取正在渲染到当前表面的图像数据。 Current Surface表示当前显示的android屏幕。 我在AOSP代码中查看了一个示例,但实际上很难理解。 如果有人为我提供了一个很好的ImageReader类示例,那将非常有用。

1 个答案:

答案 0 :(得分:5)

听起来您正试图使用​​ImageReader从任意Surface中提取数据。它没有那种方式。

ImageReader是一个缓冲队列“CPU使用者”,这是一种奇特的说法,当你将数据发送到Surface时,CPU上运行的代码可以直接检查数据。并非所有曲面都可以这样处理 - 在创建曲面时设置使用标志 - 因此您需要使用Surface创建ImageReader#getSurface(),然后将其传递给想要发送数据的内容到Surface

正如文档所述,“有几个Android媒体API类接受Surface对象作为渲染目标,包括MediaPlayer,MediaCodec和RenderScript Allocations。”

ImageReader的主要客户是相机,在您链接的CTS测试中进行了演示。它并不适用于MediaCodec解码器,因为输出格式与相机不同(其中一些是专有的)。

虚拟显示测试更接近您的需求,因为您可以将虚拟显示的输出定向到Surface。对于具有普通权限的应用,您只能在那里发送自己的应用输出。 Android 4.4“screenrecord”命令执行类似的操作。

(如果您要记录您在SurfaceView上绘制的内容,并且使用OpenGL进行渲染,则可以使用herehere来展示一些替代方案。)