android - samsung - ¿Cómo capturar la pantalla lo más rápido posible a través de adb?
como hacer una captura de pantalla en el celular (12)
Esta pregunta ya tiene una respuesta aquí:
- Leer datos stdout binarios de adb shell? 15 respuestas
Recientemente, escribí un cliente de PC que puede mostrar y controlar la pantalla de mi teléfono Android en tiempo real usando adb . Uso el mono para controlar el dispositivo y funciona bien. El problema es cómo agarrar la pantalla del teléfono y mostrarla sin problemas.
La primera solución que he encontrado es agarrar continuamente el framebuffer
través de adb
(como la función de captura de pantalla de DDMS). Ahora cuando lo hago, el rendimiento es bastante inaceptable. La velocidad de fotogramas capturada desde el framebuffer
es tan baja como 5 por segundo (el tamaño de fotograma es 800 * 480). Mi programa se ve como su hipo cuando me deslizo en el teléfono.
Mi programa está escrito en java usando ddmslib
para capturar framebuffer
.
añadir:
Descubrí que la codificación de los datos en bruto del framebuffer
en formato .png
es muy lenta, de lo contrario, esta sería una forma rápida de transmitir una imagen en bruto comprimida.
¿Cómo puedo mejorar la velocidad de captura de la pantalla a un nivel uniforme?
Bueno, algunas personas dijeron que en Perl hay muchas maneras de hacer una cosa. :-) De todos modos, este puede funcionar mejor (ya que no hay una expresión regular) y puede resolver el problema en Cygwin en MS Windows (cuyo Perl define /n
como CRLF):
adb shell screencap -p | perl -pe ''BEGIN { $/="/cM/cJ"; $/="/cJ"; } chomp;'' > screen-$(date +%Y%m%d_%H%M%S).png
De docs :
Tomando una captura de pantalla del dispositivo
El comando screencap es una utilidad de shell para tomar una captura de pantalla de una pantalla de dispositivo. Mientras que en un shell, la sintaxis es:
screencap <filename>
Para usar la captura de pantalla desde la línea de comandos, escriba lo siguiente:
$ adb shell screencap /sdcard/screen.png
Aquí hay un ejemplo de sesión de captura de pantalla, utilizando el shell adb para capturar la captura de pantalla y el comando de extracción para descargar el archivo desde el dispositivo:
$ adb shell
shell@ $ screencap /sdcard/screen.png
shell@ $ exit
$ adb pull /sdcard/screen.png
Grabando una pantalla de dispositivo
El comando screenrecord es una utilidad de shell para grabar la pantalla de dispositivos con Android 4.4 (nivel de API 19) y superior. La utilidad registra la actividad de la pantalla en un archivo MPEG-4.
Note: Audio is not recorded with the video file.
Un desarrollador puede usar este archivo para crear videos promocionales o de capacitación. Mientras que en un shell, la sintaxis es:
screenrecord [options] <filename>
Para usar screenrecord desde la línea de comando, escriba lo siguiente:
$ adb shell screenrecord /sdcard/demo.mp4
Detenga la grabación de la pantalla presionando Ctrl-C; de lo contrario, la grabación se detendrá automáticamente a los tres minutos o el límite de tiempo establecido por - time-limit .
Para comenzar a grabar la pantalla de su dispositivo, ejecute el comando screenrecord para grabar el video. Luego, ejecute el comando de extracción para descargar el video desde el dispositivo a la computadora host. Aquí hay un ejemplo de sesión de grabación:
$ adb shell
shell@ $ screenrecord --verbose /sdcard/demo.mp4
(press Ctrl-C to stop)
shell@ $ exit
$ adb pull /sdcard/demo.mp4
La utilidad de registro de pantalla puede grabar en cualquier resolución admitida y velocidad de bits que solicite, al tiempo que conserva la relación de aspecto de la pantalla del dispositivo. La utilidad registra en la resolución y orientación de la pantalla nativa de forma predeterminada, con una duración máxima de tres minutos.
Hay algunas limitaciones conocidas de la utilidad de registro de pantalla que debe tener en cuenta al usarla:
Es posible que algunos dispositivos no puedan grabar en su resolución de pantalla nativa. Si encuentra problemas con la grabación de pantalla, intente utilizar una resolución de pantalla más baja. No se admite la rotación de la pantalla durante la grabación. Si la pantalla gira durante la grabación, parte de la pantalla se corta en la grabación.
En .bash_profile en mi mac:
function droidShot() {
/full_path_to_droid_sdk/platform-tools/adb shell screencap -p | perl -pe ''s//x0D/x0A//x0A/g'' > $1.png
}
uso:
droidshot whatever
y el archivo aparece en lo que sea.png
Esta es una solución lenta, estoy seguro de que es la forma más rápida que puede encontrar en soluciones basadas en adb,
# this line require a superuser privilege:
adb shell "su -c ''cat /dev/graphics/fb0 > /sdcard/capture.raw''"
adb pull /sdcard/capture.raw
ffmpeg -loglevel panic -f rawvideo -pix_fmt bgr32 -s 320x480 -i /
capture.raw -vcodec png -vframes 1 capture.png;
Hay un programa de screenrecord
partir de Android 4.4
adb shell screenrecord /data/local/tmp/test-video.m4v
adb pull /data/local/tmp/test-video.m4v ~/test-video.m4v
He mejorado la solución de @ steveha:
Cree un script de shell que diga: '' captura de pantalla de Android '' con el siguiente contenido:
adb shell screencap -p | perl -pe ''s//x0D/x0A//x0A/g'' > screen-`date +%Y-%m-%d_%X`.png
Coloque este archivo en su directorio bin local o en cualquier otro $ PATH que prefiera.
Esto le permitiría guardar los archivos con una marca de tiempo en el directorio actual.
Recuerda hacer el script de shell ejecutable usando
chmod +x android-screenshot
Podrías usar:
$ adb shell screencap -p> sc.png
que desafortunadamente no funciona (el archivo está dañado), por lo que la opción que queda es
$ adb shell screencap -p /mnt/sdcard/sc.png
$ adb pull /mnt/sdcard/sc.png
Si bien esto es relativamente rápido, probablemente no sea tan rápido como lo necesitas.
Usando este método, mi aplicación continúa ejecutándose a su máxima velocidad de cuadros
adb pull /dev/graphics/fb0
Esto hará que bajen los datos sin procesar del buffer de cuadros. Parece que tiene el mismo ancho que la pantalla, pero la altura se completa. El buffer de cuadros en mi dispositivo parece estar en formato RGBA8888. Para obtener exactamente lo que se muestra en la pantalla, debe ignorar el canal alfa.
Tenga en cuenta que esto tarda ~ 0,8 segundos en descargarme (resolución: 480x854) pero si lo tengo descargando en un bucle continuo, no afecta la velocidad de cuadros del dispositivo.
adb shell screenrecord --bit-rate 8000000 - time-limit 30 /sdcard/example.mp4
Puede cambiar la tasa de bits y cambiar la duración del video también.
si la parte lenta es en bruto a la conversión png (el time adb shell screencap -p /sdcard/x.png
es considerablemente más lento que el time adb shell screencap /sdcard/nonpng.raw
, como lo tengo en los juegos) y no es necesario el png, entonces puede hacer como aquí https://github.com/sowcow/shot . Convierte los datos sin procesar a un formato simple de ppm y convierte de ppm a bmp usando imagemagick casi sin sobrecarga después de obtener los datos sin procesar
actualizacion:
Este script de shell por max_plenert es un mejor ejemplo:
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
adb shell screencap -p | perl -pe ''s//x0D/x0A//x0A/g'' > screen.png
Fuente:
http://blog.shvetsov.com/2013/02/grab-android-screenshot-to-computer-via.html
adb shell screencap /sdcard/screen.png && adb pull /sdcard/screen.png my_screen01.png