【问题标题】:android 5 , capture screen as raw rgb buffersandroid 5,将屏幕捕获为原始 rgb 缓冲区
【发布时间】:2015-08-06 23:51:43
【问题描述】:

如何使用 MediaProjectionManager 将屏幕捕获为原始 rgba 缓冲区(无编码)?

我已经看到很多关于如何捕获屏幕并使用 MediaCodec 对其进行编码的示例,但我想改用我自己的编码器。

【问题讨论】:

  • 一种方法是使用 GLES 渲染帧并使用 glReadPixels() 提取它们,例如 bigflake.com/mediacodec/#ExtractMpegFramesTest,尽管这感觉有点漫长。理论上你可以创建一个 ImageReader 并通过它访问数据,但我还没有尝试过——stackoverflow.com/questions/31687259 似乎让它工作了。
  • ImageReader 能够处理 20 fps 的帧速率吗?
  • ImageReader 只是包装了 Surface,它不复制数据,因此不会增加太多开销。另一方面,听起来您将使用您的应用程序在软件中处理视频帧(而不是基于硬件的视频编码器),这可能很昂贵。因此,您的应用能否处理 20 fps 取决于您的应用对帧的处理方式。

标签: android android-mediaprojection


【解决方案1】:

我最终按照时尚建议使用 ImageReader

【讨论】:

    【解决方案2】:

    MediaCodec 支持 RAW MIME 类型,MIMETYPE_VIDEO_RAW,如果你看http://developer.android.com/reference/android/media/MediaFormat.html#MIMETYPE_VIDEO_RAW

    但是,如果您甚至想使用可以替换 MediaCodec 的自定义编解码器,那么整个事情都应该连接到 mInputSurface。

    mMediaProjection.createVirtualDisplay("Recording Display", 
                screenWidth, screenHeight, screenDensity, 0 /* flags */, 
                mInputSurface, null /* callback */, null /* handler */);
    

    您可能注意到 Surface API 有一个 lockCanvas,它可能是通过 Canvas 写入您的编解码器的 API。

    表面: https://developer.android.com/reference/android/view/Surface.html

    画布: https://developer.android.com/reference/android/graphics/Canvas.html

    我很想看看你的结果。

    【讨论】:

    • 谢谢,我会试试 MediaCodec 和 video raw。如果我想尝试使用表面,我只是创建一个表面?我在哪里可以买到相框?
    • lockCanvas() 用于软件渲染。它在 Surface 获取数据方面没有任何作用。
    • 我会尝试的是应该通过 Surface 提供的 Canvas 类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多