【问题标题】:How to get InputStream from ImageReader android如何从 ImageReader android 获取 InputStream
【发布时间】:2014-02-08 15:22:13
【问题描述】:

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

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

【问题讨论】:

  • 文档说使用acquireLatestImage() 方法来获取图像。
  • @mohammedmomn 感谢您的回复,但我需要使用 android.media.ImageReader
  • @DevZer0 但我不知道如何设置 Surface。我想要当前屏幕中显示的图像。
  • 你能展示一些你在做什么的代码吗,你有一个你想使用的 ImageReader 实例吗?

标签: java android surfaceview file-descriptor fileinputstream


【解决方案1】:

听起来您正在尝试使用ImageReader 从任意Surface 中提取数据。那样不行。

ImageReader是一个缓冲队列“CPU消费者”,也就是当你向它的Surface发送数据时,运行在CPU上的代码可以直接检查数据。并非所有表面都可以这样处理——在创建表面时设置使用标志——因此您需要使用ImageReader#getSurface() 创建Surface,然后将其传递给想要将数据发送到@987654329 的东西@。

如文档所述,“一些 Android 媒体 API 类接受 Surface 对象作为渲染目标,包括 MediaPlayer、MediaCodec 和 RenderScript 分配。”

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

虚拟显示器测试更接近您想要的,因为您可以将虚拟显示器的输出定向到Surface。对于具有正常权限的应用程序,您只能将您自己的应用程序的输出发送到那里。 Android 4.4“screenrecord”命令做了类似的事情。

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

【讨论】:

    猜你喜欢
    • 2016-06-13
    • 2021-03-06
    • 2010-10-20
    • 2010-10-13
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多