我在看这堂课:https://developer.android.com/reference/android/media/ImageReader.html
我想要的是从ImageReader类中获取一个InputStream,并获取正在渲染到当前表面的图像数据。 Current Surface表示当前显示的android屏幕。 我在AOSP代码中查看了一个示例,但实际上很难理解。 如果有人为我提供了一个很好的ImageReader类示例,那将非常有用。
答案 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进行渲染,则可以使用here和here来展示一些替代方案。)