Ответ 1
adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > screen.png
Источник:
http://blog.shvetsov.com/2013/02/grab-android-screenshot-to-computer-via.html
Недавно я написал клиент ПК, который может отображать и контролировать экран телефона Android в режиме реального времени с помощью adb. Я использую обезьяну для управления устройством, и он отлично работает. Проблема заключается в том, как захватить экран телефона и отобразить его плавно.
Первое решение, с которым я столкнулся, состоит в том, чтобы постоянно захватывать framebuffer
через adb
(например, функцию захвата экрана DDMS). Теперь, когда я это делаю, производительность совершенно неприемлема. Частота кадров, снятая с framebuffer
, составляет всего 5 в секунду (размер кадра - 800 * 480). Моя программа выглядит как ее икает, когда я нахожусь на телефоне.
Моя программа написана в java, используя ddmslib
для захвата framebuffer
.
добавить:
Мне было очень медленно кодировать необработанные данные framebuffer
в формат .png
, иначе это будет быстрый способ передачи сжатого исходного изображения.
Как повысить скорость захвата экрана до плавного уровня?
adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > screen.png
Источник:
http://blog.shvetsov.com/2013/02/grab-android-screenshot-to-computer-via.html
Вы можете использовать:
$ adb shell screencap -p > sc.png
Забастовкa >
который, к сожалению, не работает (файл поврежден), поэтому ваша опция -
$ adb shell screencap -p /mnt/sdcard/sc.png
$ adb pull /mnt/sdcard/sc.png
в то время как это относительно быстро, возможно, это не так быстро, как вам нужно.
если медленная часть является необработанной для png-преобразования (time adb shell screencap -p /sdcard/x.png
значительно медленнее, чем time adb shell screencap /sdcard/nonpng.raw
, так как у меня есть это в играх), а png не требуется, тогда вы можете сделать вот как https://github.com/sowcow/shot. Он преобразует необработанные данные в простой формат ppm и преобразует ppm в bmp, используя imagemagick, практически без накладных расходов после получения необработанных данных.
Эта оболочка script by max_plenert является лучшим примером:
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
В .bash_profile на моем mac:
function droidShot() {
/full_path_to_droid_sdk/platform-tools/adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > $1.png
}
использование:
droidshot whatever
и файл отображается в файле any.png
Используя этот метод, мое приложение продолжает запускать на нем полную частоту кадров
adb pull /dev/graphics/fb0
Это приведет к удалению необработанных данных из буфера кадров. Похоже, что он имеет ту же ширину, что и экран, но высота дополняется. Буфер кадра на моем устройстве, похоже, находится в формате RGBA8888. Чтобы получить именно то, что отображается на экране, вы должны игнорировать альфа-канал.
Обратите внимание, что для загрузки требуется примерно 0,8 секунды (resoultion: 480x854), но если у меня есть загрузка в непрерывном цикле, это не влияет на частоту кадров устройства.
Это медленное решение, я уверен, что это самый быстрый способ найти решения на основе 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;
Из docs:
Команда screencap - это утилита оболочки для снятия снимка экрана устройства. Хотя в оболочке синтаксис:
screencap <filename>
Чтобы использовать screencap из командной строки, введите следующее:
$ adb shell screencap /sdcard/screen.png
Вот пример сеанса скриншота, используя оболочку adb для захвата снимка экрана и команды pull для загрузки файла с устройства:
$ adb shell
[email protected] $ screencap /sdcard/screen.png
[email protected] $ exit
$ adb pull /sdcard/screen.png
Команда screenrecord - это утилита оболочки для записи дисплеев устройств под управлением Android 4.4 (API уровня 19) и выше. Утилита записывает активность экрана в файл MPEG-4.
Note: Audio is not recorded with the video file.
Разработчик может использовать этот файл для создания рекламных или обучающих видеороликов. Хотя в оболочке синтаксис:
screenrecord [options] <filename>
Чтобы использовать screenrecord из командной строки, введите следующее:
$ adb shell screenrecord /sdcard/demo.mp4
Остановите запись на экране, нажав Ctrl-C, в противном случае запись автоматически прекратится через три минуты или ограничение по времени - ограничение по времени.
Чтобы начать запись экрана вашего устройства, запустите команду screenrecord, чтобы записать видео. Затем запустите команду pull для загрузки видео с устройства на главный компьютер. Здесь пример сеанса записи:
$ adb shell
[email protected] $ screenrecord --verbose /sdcard/demo.mp4
(press Ctrl-C to stop)
[email protected] $ exit
$ adb pull /sdcard/demo.mp4
Утилита screenrecord может записывать с любым поддерживаемым разрешением и скоростью передачи данных, которые вы запрашиваете, сохраняя при этом пропорции дисплея устройства. Утилита записывает в исходное разрешение экрана и ориентацию по умолчанию с максимальной длиной в три минуты.
Существуют некоторые известные ограничения утилиты screenrecord, которые вы должны знать при ее использовании:
Некоторые устройства, возможно, не смогут записывать их собственное разрешение экрана. Если у вас возникли проблемы с записью на экране, попробуйте использовать более низкое разрешение экрана. Вращение экрана во время записи не поддерживается. Если экран во время записи вращается, некоторые части экрана отключены в записи.
Я улучшил решение @steveha:
Создайте оболочку script, скажем: " андроид-скриншот" со следующим содержимым:
adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > screen-`date +%Y-%m-%d_%X`.png
Поместите этот файл в каталог локального bin или любой другой $PATH, который вы предпочитаете.
Это позволит вам сохранить файлы с меткой времени в текущем каталоге.
Не забудьте сделать исполняемый файл оболочки script с помощью
chmod +x android-screenshot
Хорошо, что некоторые люди говорили в Perl, есть много способов сделать одно.:-) Во всяком случае, этот может работать лучше (поскольку нет регулярного выражения) и может решить проблему в Cygwin в MS Windows (чей Perl определяет \n
как CRLF):
adb shell screencap -p | perl -pe 'BEGIN { $/="\cM\cJ"; $\="\cJ"; } chomp;' > screen-$(date +%Y%m%d_%H%M%S).png
Существует программа screenrecord
с Android 4.4
adb shell screenrecord /data/local/tmp/test-video.m4v
adb pull /data/local/tmp/test-video.m4v ~/test-video.m4v
adb shell screenrecord - бит-скорость 8000000 - время-ограничение 30/sdcard/example.mp4
Вы также можете изменить скорость передачи битов и изменить продолжительность видео.
adb shell screencap /sdcard/screen.png && adb pull /sdcard/screen.png my_screen01.png