【发布时间】:2011-06-06 23:42:15
【问题描述】:
如何使用/dev/graphics/fb0 捕获 Android 设备屏幕内容,以及如何使用从帧缓冲区收集的数据将其制作成图像文件。我知道这需要设备植根,我可以接受。
提前致谢,
【问题讨论】:
如何使用/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
【讨论】:
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
如果你有root权限。
将数据从 fb0 复制到另一个文件,例如
cat fb0 > tmp
此时,您仍然无法打开新文件。 因为文件的数据结构不能满足任何图像文件格式。 所以你需要的是解码它。在该文件中,每两个字节描述一个像素。 较高的 5 口代表红色,较低的 5 口代表蓝色,其余中间 6 口代表绿色。您可以使用上面的信息来构建 BMP 和任何其他可见文件。
【讨论】:
Nebkat 的解决方案有时有效,但在使用 Dollop 测试工具时,我了解到没有直接从 fb0 制作图像的通用方法。 Motorola Droid 2 使用 RGB 32。Huawei Ascend 使用 RGB 565。Samsung Captivate 两者都不使用,而且似乎也没有将整个屏幕放入缓冲区。
【讨论】:
对于 16 位设备,您可能希望将 -pix_fmt rgb32 替换为 -pix_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
结果缩略图也有点艺术。
【讨论】: