如何使用/dev/graphics/fb0(Android)捕获屏幕

如何使用/dev/graphics/fb0(Android)捕获屏幕,android,driver,Android,Driver,如何使用/dev/graphics/fb0捕获Android设备屏幕内容,以及如何使用从帧缓冲区收集的数据将其制作为图像文件。我知道这需要设备扎根,我同意 提前感谢,这应该可以: 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 如果您拥有root权限 将数据从

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

提前感谢,

这应该可以:

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

如果您拥有root权限

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

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


  • Nebkat的解决方案有时有效,但在使用Dollop测试工具的过程中,我了解到没有通用的方法可以直接从fb0生成图像。摩托罗拉Droid2使用RGB32。华为Ascend使用RGB 565。三星Captivate既不使用也不将整个屏幕放入缓冲区。

    对于16位设备,您可能需要将
    -pix\u fmt rgb32
    替换为
    -pix\u fmt rgb565le

    如果您不确定设备帧缓冲区的格式,您可以迭代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
    

    结果缩略图也很有艺术性。

    您所要做的就是将rgb32更改为您所使用的任何格式。是的,大多数读者都会很明显需要更改编码和尺寸,因为我已经指出,并非所有设备都具有相同的编码。不过,FFmpeg方法不能与Captivate和其他类似的方法一起使用。谢谢!Jellybean(Android 4.2)仿真器使用rgb565。对我来说效果很好,无需添加-vframes 1我发现这是一个错误:[image2@0x2405c40]无法从模式“image.png”中获取帧文件名编号2(要么设置updatefirst,要么在文件名模式中使用类似%03d的模式)av_interleave_write_frame():无效参数i run
    adb pull/dev/graphics/fb0 fb0
    got
    adb:error:remote object'/dev/graphics/fb0'不存在
    。和
    adb外壳;苏,;cp/dev/graphics/fb/sdcard/
    got
    cp:/dev/graphics/fb0:没有这样的设备
    这是我们对一个真正的程序员的期望:)