最近,我写了一个PC客户端,可以使用adb实时显示和控制我的Android手机屏幕.我使用猴子来控制设备,它工作正常.问题是如何抓住手机屏幕并顺利显示.
第一个解决方案,我想出了是不断抢framebuffer通adb(如DDMS的屏幕捕捉功能).现在,当我这样做时,性能是非常不可接受的.从中捕获的帧速率低至framebuffer每秒5帧(帧大小为800*480).当我在手机上滑动时,我的程序看起来像打嗝.
我的程序是用java编写的,ddmslib用来抓取framebuffer.
add:
我发现将原始framebuffer数据编码为.png格式要慢得多,否则这将是传输压缩原始图像的快速方法.
如何将屏幕捕获速度提高到平稳水平?
ste*_*eha 25
adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > screen.png
Run Code Online (Sandbox Code Playgroud)
资源:
http://blog.shvetsov.com/2013/02/grab-android-screenshot-to-computer-via.html
你可以使用:
$ adb shell screencap -p> sc.png
遗憾的是它不起作用(文件已损坏),所以你的选择是
$ adb shell screencap -p /mnt/sdcard/sc.png
$ adb pull /mnt/sdcard/sc.png
Run Code Online (Sandbox Code Playgroud)
虽然速度相对较快,但可能并不像你需要的那么快.
如果慢的部分原料为PNG转换(time adb shell screencap -p /sdcard/x.png比要慢得多time adb shell screencap /sdcard/nonpng.raw,因为我有它在游戏中)和PNG是没有必要的,那么你可以不喜欢这里https://github.com/sowcow/shot.它将原始数据转换为简单的ppm格式,并使用imagemagick将ppm转换为bmp,在获取原始数据后几乎没有开销
max_plenert的这个shell脚本是一个更好的例子:
adb shell screencap /sdcard/mytmp/rock.raw
adb pull /sdcard/mytmp/rock.raw
adb shell rm /sdcard/mytmp/rock.raw
// remove the header
tail -c +13 rock.raw > rock.rgba
// extract width height and pixelformat:
hexdump -e '/4 "%d"' -s 0 -n 4 rock.raw
hexdump -e '/4 "%d"' -s 4 -n 4 rock.raw
hexdump -e '/4 "%d"' -s 8 -n 4 rock.raw
convert -size 480x800 -depth 8 rock.rgba rock.png
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
41701 次 |
| 最近记录: |