【问题标题】:How to capture the screen using /dev/graphics/fb0 (Android)如何使用 /dev/graphics/fb0 (Android) 捕获屏幕
【发布时间】:2011-06-06 23:42:15
【问题描述】:

如何使用/dev/graphics/fb0 捕获 Android 设备屏幕内容,以及如何使用从帧缓冲区收集的数据将其制作成图像文件。我知道这需要设备植根,我可以接受。

提前致谢,

【问题讨论】:

    标签: android driver


    【解决方案1】:

    这应该可行:

    adb pull /dev/graphics/fb0 fb0
    ffmpeg -vframes 1 -vcodec rawvideo -f rawvideo -pix_fmt rgb32 -s 320x480 -i fb0 -f image2 -vcodec png image.png
    

    【讨论】:

    • 非常适合我,无需添加 -vframes 1
    • 我收到此错误:[image2 @ 0x2405c40] 无法从模式“image.png”获取帧文件名编号 2(设置 updatefirst 或在文件名模式中使用 %03d 之类的模式) av_interleaved_write_frame(): 参数无效
    • 我运行adb pull /dev/graphics/fb0 fb0 得到adb: error: remote object '/dev/graphics/fb0' does not exist。而adb shell;su;cp /dev/graphics/fb /sdcard/ 得到了cp: /dev/graphics/fb0: No such device
    【解决方案2】:

    如果你有root权限。

    1. 将数据从 fb0 复制到另一个文件,例如

      cat fb0 > tmp
      
    2. 此时,您仍然无法打开新文件。 因为文件的数据结构不能满足任何图像文件格式。 所以你需要的是解码它。在该文件中,每两个字节描述一个像素。 较高的 5 口代表红色,较低的 5 口代表蓝色,其余中间 6 口代表绿色。您可以使用上面的信息来构建 BMP 和任何其他可见文件。

    【讨论】:

    • 这是我们对真正程序员的期望:)
    【解决方案3】:

    Nebkat 的解决方案有时有效,但在使用 Dollop 测试工具时,我了解到没有直接从 fb0 制作图像的通用方法。 Motorola Droid 2 使用 RGB 32。Huawei Ascend 使用 RGB 565。Samsung Captivate 两者都不使用,而且似乎也没有将整个屏幕放入缓冲区。

    【讨论】:

    • 您所要做的就是将 rgb32 更改为您使用的任何内容。
    • 是的,更改编码和尺寸的必要性对大多数读者来说是显而易见的,因为我已经指出并非所有设备都具有相同的编码。然而,FFmpeg 方法不适用于 Captivate 和其他类似的方法。
    • 谢谢! Jellybean (Android 4.2) 模拟器使用 rgb565。
    【解决方案4】:

    对于 16 位设备,您可能希望将 -pix_fmt rgb32 替换为 -pix_fmt rgb565le

    【讨论】:

      【解决方案5】:

      如果您不确定设备帧缓冲区的格式,您可以迭代 ffmpeg 支持的格式,如下所示:

      for fmt in $(ffmpeg -pix_fmts|cut -d " " -f 2); do ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt $fmt -s 320x480 -i fb0 -f image2 -vcodec png /tmp/image-$fmt.png; done
      

      结果缩略图也有点艺术。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-15
        • 2014-05-31
        • 2014-03-06
        相关资源
        最近更新 更多