从adb获取Nexus One的屏幕截图?

46

我的目标是能够键入一个单词命令并从通过 USB 连接的已 root 的 Nexus One 获取屏幕截图。

到目前为止,我可以获取帧缓冲区,我相信这是一个 32位 xRGB888 原始图像,通过以下方式进行提取:

adb pull /dev/graphics/fb0 fb0

不过,从那里开始,我很难将它转换为png格式。我正在尝试使用ffmpeg进行转换,如下所示:

ffmpeg -vframes 1 -vcodec rawvideo -f rawvideo -pix_fmt rgb8888 -s 480x800 -i fb0 -f image2 -vcodec png image.png

这会生成一张可爱的紫色图像,其中有些部分模糊地类似于屏幕,但并不是完全清晰的截图。

14个回答

1
完全自动化此过程的方法是创建一个脚本,将当前时间戳添加到文件名中。这样,您不必自己编写文件名,所有屏幕截图都具有不同的名称,并且按时间排序。
Bash脚本示例:
#! /bin/bash

filename=$(date +"_%Y-%m-%d-%H:%M")

/PATH_TO_ANDROID_SDK/platform-tools/adb -d shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > screenshot$filename.png

这将创建一个名为screenshot_2014-01-07-10:31.png的文件。

1
在MyTouch Slide 3G上,我的截图中红色和蓝色通道被交换了。以下是正确的ffmpeg命令,供其他人参考: (值得注意的部分: -pix_fmt bgr32
ffmpeg -vframes 1 -vcodec rawvideo -f rawvideo -pix_fmt bgr32 -s 320x480 -i fb0 -f image2 -vcodec png image.png

感谢Patola提供的便捷shell脚本!至少对于我的手机来说,在纵向模式(320x480)下不需要进行任何变形即可正确定位,因此他的脚本末尾变成了:
# assuming 'down' is towards the keyboard or usb jack 
# in landscape and protrait modes respectively
(( ${PORTRAIT} )) || mogrify -rotate 270 "${outputfile}"

/bin/rm -f fb0.$$ fb0b.$$

1
这可能与问题从adb shell的stdout读取二进制数据有关,其中adb尝试为您执行LF到CRLF转换(它可能只是adb的Windows版本)。我个人遇到了将\n转换为\r\r\n的问题,因此为了进行转换,最好使用[1]中的代码或使用以下方法之一。

对于我在cygwin中运行它: adb shell 'cat /dev/graphics/fb0' | perl -pi -e 's/\r\r\n/\n/g' 似乎会有所帮助

除此之外,请尝试将宽度和高度与文件大小进行比较。如果文件大小不能被Width * height整除,则adb工具要么自动为您执行操作,要么是rgb545或rgb8888之外的更奇特的格式。

如果只是颜色问题(即:结果图像中的所有内容都在正确的位置),那么您可能需要考虑交换红色和蓝色通道,因为一些系统(通常)使用字节顺序BGRA而不是RGBA。

1

rgb565 而不是 8888 在模拟器上也可以工作


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接