【问题标题】:Using ADB to capture the screen [duplicate]使用 ADB 捕获屏幕 [重复]
【发布时间】:2020-10-24 02:18:33
【问题描述】:

我正在尝试尽快获取手机屏幕的屏幕截图。 目前,我正在做:

adb shell screencap -p /sdcard/screencap.png && adb pull /sdcard/screencap.png         

但是它太慢了,最多需要 3 秒。 有没有更好的方法来做到这一点?我打算在没有root的手机上使用这个功能。

还有哪些不同的参数可以用于屏幕截图?

谢谢。

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

【问题讨论】:

  • 为什么3s对你来说很慢?你打算怎么做?
  • 我打算在我的电脑上实时显示屏幕。这是一种愚蠢的做法吗? adb shell screenrecord 是一个选项,但在录制过程中无法访问。
  • 您是否只需要一个(您开发的)应用程序的实时供稿,或者它应该适用于该设备上运行的任何应用程序?
  • 它应该适用于任何事情。
  • 那么 screenrecord 应该是您的解决方案。你检查过这个developer.android.com/tools/help/adb.html#screenrecord 吗?我使用 Android Studio 录制,我猜它使用相同的东西。我可以在录制屏幕时使用该设备。您为此使用什么设备以及操作系统版本是什么?

标签: java android adb screenshot


【解决方案1】:

在 Windows、OSX 和 Linux 上保存到文件

adb exec-out screencap -p > screen.png

在 Linux 上复制到剪贴板使用

adb exec-out screencap -p | xclip -t image/png

【讨论】:

  • 这也适用于 Linux。
  • 我得到“文件“screen.png”无法打开。”当我尝试打开它时。
  • 顺便说一句,因为我经常使用它与设计师分享和产品教程,我在我的~/.bash_profile 中创建了一个 bash 别名,看起来像这样:alias adb_screenshot="adb -d shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > $(date +"%Y-%m-%d_%H-%M-%S").png"。您在终端中使用adb_screenshot 调用它,它将以当前时间戳作为文件名保存一个.png 文件。 adb 命令中的-d 选项意味着它将默认为物理设备(而不是模拟器)。如果您将其用于模拟器,则可以将其删除。
  • 对于 macOS:adb exec-out screencap -p > test.png
  • 它适用于 Windows 10
【解决方案2】:

https://stackoverflow.com/a/37191719/75579 答案在 Android 7 中以某种方式停止为我工作。所以我必须手动进行,所以我想分享一下。


如何安装

  1. 将此代码的 sn-p 放入您的 ~/.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"
    }
    
  2. 运行source ~/.bash_profilesource ~/.profile命令,


如何使用

不指定文件名的用法:

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

与文件名一起使用:

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

希望对你有帮助!

** 如果插入多个设备,这将不起作用

【讨论】:

  • 这只是移动一个文件...实际上并没有截屏?
  • @Karu 哦不,你说的太对了,我不知何故漏掉了重要的一行,我刚刚修好了!
  • 感谢@dragonwhospitsfire!
【解决方案3】:

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

adb shell screenrecord /sdcard/example.mp4

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

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

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

adb shell screenrecord --help

这无需root设备即可工作。希望这会有所帮助。

【讨论】:

  • 除非文件直接录制到我的电脑上,否则我将无法获得视频的实时提要。不过还是谢谢。
  • 它说一个错误 WorkingDirectoty: null Environment: null
【解决方案4】:

您可以从标准输出读取二进制文件,而不是将 png 保存到 sdcard 然后拉取它:

adb shell screencap -p | sed 's|\r$||' > screenshot.png

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

来源:Read binary stdout data from adb shell?

【讨论】:

  • 谢谢 Jared——不幸的是 Diego 的回答对我不起作用,但你的回答对。
  • 当我尝试这个时,我得到一个错误:“sed: RE 错误:非法字节序列”。
  • 这一直对我有用,但我只需要将其更改为 sed 's|\r\r$||'(删除两个回车符),因为我开始收到损坏的 PNG。不确定发生了什么变化(ADB 的新版本?cygwin 的新版本?)但发生了一些变化。
  • 我在打开 PNG 文件时收到 PNG file corrupted by ASCII conversion
【解决方案5】:

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

adb shell 'stty raw; screencap -p'

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

https://github.com/baitisj/android_screen_mirror

【讨论】:

  • 无需使用stty。请改用adb exec-out。见stackoverflow.com/a/31401447/1778421
  • 不幸的是,我拥有的adb 版本要么不能正确支持exec-out,要么在FreeBSD 下不能正确支持该选项。我发布的脚本确实包含 cmets,表明如果您的环境支持 exec-out 是更好的选择。
【解决方案6】:

很抱歉告诉你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.

除了命令screencap之外,还有一个命令screenshot,不知道为什么screenshotAndroid 5.0中去掉了,但是在Android 4.4下面可以找到,你可以查看@987654321的来源@。我没有比较这两个命令之间哪个更快,但是您可以在实际环境中尝试并做出最终决定。

【讨论】:

  • 谢谢。原来截图功能是实际的设备截图功能(它可以播放声音),而screencap只是默默地截图。它看起来并没有更快,但还是谢谢。
  • 您可以使用标准输出将文件直接传输到电脑
猜你喜欢
  • 1970-01-01
  • 2014-02-26
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多