使用ADB捕获屏幕

use*_*924 51 java android screenshot adb

我正试图尽快获得手机屏幕的截图.目前,我正在做:

adb shell screencap -p /sdcard/screencap.png && adb pull /sdcard/screencap.png         
Run Code Online (Sandbox Code Playgroud)

但它太慢,需要3秒钟.有没有更好的方法来做到这一点?我打算在没有根据的手机上使用此功能.

还有什么我可以用于screencap的不同论点?

谢谢.

编辑(额外信息):我打算使用这种方法能够将屏幕的实时馈送到我的电脑上.目前的方法有效但速度太慢.我无法使用,adb shell screenrecord因为在录制时我无法访问视频文件.

Die*_*ntz 126

使其工作@ OSX和Linux

adb exec-out screencap -p > screen.png
Run Code Online (Sandbox Code Playgroud)

  • 我得到"文件"screen.png"无法打开".当我试图打开它. (14认同)
  • 顺便说一下,因为我经常使用它与设计师共享和产品教程,我在我的`〜/ .bash_profile`中创建了一个bash别名,如下所示:`alias adb_screenshot ="adb -d shell screencap -p | perl -pe 's /\x0D\x0A /\x0A/g'> $(日期+"%Y-%m-%d_%H-%M-%S").png"`.你在终端中使用`adb_screenshot`调用它,它将保存一个.png文件,当前时间戳作为文件名.`adb`命令中的`-d`选项意味着它将默认为物理设备(而不是模拟器).如果您将其用于模拟器,则可以删除它. (5认同)
  • 它适用于 Windows 10 (5认同)
  • 对于 Windows 用户:在 CMD 中运行命令,而不是 PowerShell(或在 PowerShell 中运行“cmd”)。PowerShell 在创建文件时会损坏二进制数据(它将管道传输的 PNG 图像数据解释为文本)。 (5认同)
  • 对于macOS:`adb exec-out screencap -p> test.png` (4认同)
  • 这也适用于Linux. (3认同)
  • @JoshuaPinter 你的别名会更好`alias adb_screenshot="adb -d exec-out screencap -p > $(date +"%Y-%m-%d_%H-%M-%S").png"` - 如果 png 数据中存在有效的 0x0D 0x0A 序列,则该正则表达式可能会损坏文件。 (3认同)
  • 这非常好,但会一次又一次地覆盖同一个文件。此变体会写入几个文件,其名称按正确的顺序排列,无论您使用什么(健全的)程序来浏览它们: `adb exec-out screencap -p > android_screenshot_"$( date +%Yy%mm%dd_%Hh%Mm% SS)".png` (2认同)
  • 对于那些想要使用 PowerShell 的人,请使用 `cmd /c 'adb exec-out screencap -p > .\pic3.png'` 通过 CMD 进行调用([来源](/sf/ask/5041472901/ in-powershell-from-adb/72021532#72021532) ) (2认同)

Pre*_*rem 10

要开始录制设备的屏幕,请运行以下命令:

adb shell screenrecord /sdcard/example.mp4
Run Code Online (Sandbox Code Playgroud)

此命令将开始使用默认设置录制设备屏幕,并将生成的视频保存到设备上的 /sdcard/example.mp4 文件中。

完成录制后,在命令提示符窗口中按 Ctrl+C 停止屏幕录制。然后您可以在您指定的位置找到屏幕录制文件。请注意,屏幕录制将保存到您设备的内部存储中,而不是您的计算机中。

默认设置是使用您设备的标准屏幕分辨率,以 4Mbps 的比特率对视频进行编码,并将最大屏幕录制时间设置为 180 秒。有关您可以使用的命令行选项的更多信息,请运行以下命令:

adb shell screenrecord --help
Run Code Online (Sandbox Code Playgroud)

这无需植根设备即可工作。希望这可以帮助。


I'm*_*gon 10

/sf/answers/2603420361/在Android 7中以某种方式停止为我工作.所以我必须以手动方式进行,所以我想分享它.


如何安装

  1. 将这段代码放在您的~/.bash_profile~/.profile文件中:

    snap_screen() {
      if [ $# -eq 0 ]
      then
        name="screenshot.png"
      else
        name="$1.png"
      fi
      adb shell screencap -p /sdcard/$name
      adb pull /sdcard/$name
      adb shell rm /sdcard/$name
      curr_dir=pwd
      echo "save to `pwd`/$name"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运行source ~/.bash_profilesource ~/.profile命令,


如何使用

使用时不指定文件名:

$ snap_screen
11272 KB/s (256237 bytes in 0.022s)
Saved to /Users/worker8/desktop/screenshot.png
Run Code Online (Sandbox Code Playgroud)

使用文件名:

$ snap_screen mega_screen_capture
11272 KB/s (256237 bytes in 0.022s)
Saved to /Users/worker8/desktop/mega_screen_capture.png
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!

**如果插入了多个设备,则无法使用此功能


Jar*_*ler 7

您可以从 stdout 读取二进制文件,而不是将 png 保存到 SD 卡,然后将其拉出:

adb shell screencap -p | sed 's|\r$||' > screenshot.png
Run Code Online (Sandbox Code Playgroud)

这应该会节省一点时间,但不会太多。

来源:从 adb shell 读取二进制标准输出数据?

  • 尝试此操作时出现错误:“sed:RE 错误:非法字节序列”。 (6认同)
  • 这总是对我有用,但我只需要将其更改为 `sed 's|\r\r$||'`(删除两个回车),因为我开始得到损坏的 PNG。不确定发生了什么变化(ADB 的新版本?cygwin 的新版本?)但有些变化。 (2认同)
  • 打开 PNG 文件时,我收到“PNG 文件因 ASCII 转换而损坏”的信息。 (2认同)

bai*_*isj 6

利用这篇文章和其他几篇文章中的一些知识,我发现最适合我的方法是:

adb shell 'stty raw; screencap -p'

我在 GitHub 上发布了一个非常简单的 Python 脚本,它基本上镜像了通过 ADB 连接的设备的屏幕:

https://github.com/baitisj/android_screen_mirror


ali*_*dro 2

很抱歉告诉您screencap只是一个简单的命令,只接受几个参数,但它们都不能为您节省时间,这是-h帮助输出。

$ adb shell screencap -h
usage: screencap [-hp] [-d display-id] [FILENAME]
-h: this message
-p: save the file as a png.
-d: specify the display id to capture, default 0.
If FILENAME ends with .png it will be saved as a png.
If FILENAME is not given, the results will be printed to stdout.
Run Code Online (Sandbox Code Playgroud)

除了该命令之外screencap,还有另一个命令screenshot,我不知道为什么screenshot被删除Android 5.0,但它在下面可用,你可以从这里Android 4.4查看源代码。我没有比较这两个命令哪个更快,但是您可以在真实环境中尝试并做出最终决定。