Моя цель состоит в том, чтобы смочь ввести одну команду слова и получить снимок экрана от внедренного Nexus One, присоединенного USB.
До сих пор я могу получить кадровый буфер, которому я верю, a 32bit 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
Это создает прекрасное фиолетовое изображение, которое имеет части, которые неопределенно напоминают экран, но это ни в коем случае не чистый снимок экрана.
Я полагаю, что все фреймбуферы на сегодняшний день имеют RGB 565, а не 888.
Используя мой HTC Hero (и, следовательно, регулируя от 480x800 до 320x480), это работает, если я использую rgb565 вместо 8888:
ffmpeg -vframes 1 -vcodec rawvideo -f rawvideo -pix_fmt rgb565 -s 320x480 -i fb0 -f image2 -vcodec png image.png
Похоже, что буфер кадра N1 использует кодировку RGB32 (32 бита на пиксель).
Вот мой сценарий, использующий ffmpeg:
adb pull /dev/graphics/fb0 fb0
dd bs=1920 count=800 if=fb0 of=fb0b
ffmpeg -vframes 1 -vcodec rawvideo -f rawvideo -pix_fmt rgb32 -s 480x800 -i fb0b -f image2 -vcodec png fb0.png
Другой способ, производный от метода ADP1, описанного здесь http://code.lardcave.net/entries/2009/07/27/132648/
adb pull /dev/graphics/fb0 fb0
dd bs=1920 count=800 if=fb0 of=fb0b
python rgb32torgb888.py <fb0b >fb0b.888
convert -depth 8 -size 480x800 RGB:fb0b.888 fb0.png
Python script ' rgb32torgb888.py ':
import sys
while 1:
colour = sys.stdin.read(4)
if not colour:
break
sys.stdout.write(colour[2])
sys.stdout.write(colour[1])
sys.stdout.write(colour[0])