要對 Android device 做 screenshot 的話,最簡單的方法是透過 ddms, 在 ddms 連上 device 後,就有個命令叫 screenshot 直接取回 png 格式。這方法可以在 Ubuntu/Windows 上進行,算是最方便的。
不過,若我們要做到像「每3秒取回一張 screenshot」要怎麼辦?首先,可以參考 Android source code 中的
sdk/screenshot/src/com/android/screenshot/Screenshot.java 它的做法基本上跟 ddms 的做法是完全一模一樣的,只是這個可以產生一個可執行檔,放在 out/host/linux-x86/bin/screenshot2.jar
sdk/screenshot/src/com/android/screenshot/Screenshot.java 它的做法基本上跟 ddms 的做法是完全一模一樣的,只是這個可以產生一個可執行檔,放在 out/host/linux-x86/bin/screenshot2.jar
上述 screenshot2 有搭配一個同名的 shell script 程式,純粹用來設定執行 out/host/linux-x86/framework/screenshot2.jar 的執行環境, 因為是 jar file, 理論上也可以在 windows 下執行才對,但是我沒測試過在 windows 下執行,想必也很複雜,因為還要裝 DDMS library。
還有一個辦法是透過直接抓取 /dev/graphics/fb0 來轉換,Android 是採用 framebuffer 來做 display device, 不過直接抓這個 framebuffer 的話,其格式是 raw image, 或是說,我們必須先研究出 android device 的 framebuffer format, 這一點根據我的研究是每個產品都可以不一樣,每個 android version 也不見得相同。But….至少在我的 android 3.1 模擬機中,是 16 bpp, 這一點,最好是看上面提到的 sdk/screenshot/src/com/android/screenshot/Screenshot.java 中會有線索。
上述的提到的直接存取 framebuffer 的做法上,可以參考下面的方法:
$ adb pull /dev/graphics/fb0 fb0.raw # 這一步可以抓回 device 上的 screenshot raw image
$ adb pull /dev/graphics/fb0 fb0.raw # 這一步可以抓回 device 上的 screenshot raw image
$ ffmpeg -vframes 1 -vcodec rawvideo -f rawvideo -pix_fmt rgb565le -s 1280x800 -i fb0.raw -f image2 -vcodec png fb0.png
# 上面 ffmpeg 的參數可以參考 Screenshot.java 給的線索,當然 code 本身沒有,自己印出來看就知道了
上述命令必須在有安裝 ffmpeg 的環境才能執行,因此是可以在 Ubuntu/Windows 下執行的。比較神奇的是,明明 file size 是 1280x800x4, 我原本以為是 32bpp, 結果是 16bpp…
參考資訊: http://stackoverflow.com/questions/2807070/screenshot-of-the-nexus-one-from-adb
0 意見:
張貼留言