Подтвердить что ты не робот

Как захватить экран как можно быстрее через adb?

Недавно я написал клиент ПК, который может отображать и контролировать экран телефона Android в режиме реального времени с помощью adb. Я использую обезьяну для управления устройством, и он отлично работает. Проблема заключается в том, как захватить экран телефона и отобразить его плавно.

Первое решение, с которым я столкнулся, состоит в том, чтобы постоянно захватывать framebuffer через adb (например, функцию захвата экрана DDMS). Теперь, когда я это делаю, производительность совершенно неприемлема. Частота кадров, снятая с framebuffer, составляет всего 5 в секунду (размер кадра - 800 * 480). Моя программа выглядит как ее икает, когда я нахожусь на телефоне.

Моя программа написана в java, используя ddmslib для захвата framebuffer.

добавить:
Мне было очень медленно кодировать необработанные данные framebuffer в формат .png, иначе это будет быстрый способ передачи сжатого исходного изображения.

Как повысить скорость захвата экрана до плавного уровня?

4b9b3361

Ответ 2

Вы можете использовать:

  $ adb shell screencap -p > sc.png Забастовкa >

который, к сожалению, не работает (файл поврежден), поэтому ваша опция -

$ adb shell screencap -p /mnt/sdcard/sc.png
$ adb pull /mnt/sdcard/sc.png

в то время как это относительно быстро, возможно, это не так быстро, как вам нужно.

Ответ 3

если медленная часть является необработанной для 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, практически без накладных расходов после получения необработанных данных.

UPD:

Эта оболочка 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

Ответ 4

В .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

Ответ 5

Используя этот метод, мое приложение продолжает запускать на нем полную частоту кадров

adb pull /dev/graphics/fb0

Это приведет к удалению необработанных данных из буфера кадров. Похоже, что он имеет ту же ширину, что и экран, но высота дополняется. Буфер кадра на моем устройстве, похоже, находится в формате RGBA8888. Чтобы получить именно то, что отображается на экране, вы должны игнорировать альфа-канал.

Обратите внимание, что для загрузки требуется примерно 0,8 секунды (resoultion: 480x854), но если у меня есть загрузка в непрерывном цикле, это не влияет на частоту кадров устройства.

Ответ 6

Это медленное решение, я уверен, что это самый быстрый способ найти решения на основе 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; 

это тот же код в моем веб-приложении

Ответ 7

Из 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, которые вы должны знать при ее использовании:

Некоторые устройства, возможно, не смогут записывать их собственное разрешение экрана. Если у вас возникли проблемы с записью на экране, попробуйте использовать более низкое разрешение экрана. Вращение экрана во время записи не поддерживается. Если экран во время записи вращается, некоторые части экрана отключены в записи.

Ответ 8

Я улучшил решение @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

Ответ 9

Хорошо, что некоторые люди говорили в 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

Ответ 10

Существует программа screenrecord с Android 4.4

adb shell screenrecord /data/local/tmp/test-video.m4v
adb pull /data/local/tmp/test-video.m4v ~/test-video.m4v

Ответ 11

adb shell screenrecord - бит-скорость 8000000 - время-ограничение 30/sdcard/example.mp4

Вы также можете изменить скорость передачи битов и изменить продолжительность видео.

Ответ 12

adb shell screencap /sdcard/screen.png && adb pull /sdcard/screen.png my_screen01.png