【问题标题】:Use adb screenrecord command to mirror Android screen to PC via USB使用 adb screenrecord 命令通过 USB 将 Android 屏幕镜像到 PC
【发布时间】:2015-10-07 00:08:34
【问题描述】:

我已经尝试了fadden 的建议,将 Android 屏幕镜像到 PC,但 vlc 播放器屏幕没有显示:

该函数的正确命令行是什么?谢谢。

【问题讨论】:

标签: android adb screencast


【解决方案1】:

由于 vlc 无法从 adb std 输出播放 h264 文件,我转而使用 ffplay 作为流播放器,它通过以下命令工作:

adb shell screenrecord --output-format=h264 - | ffplay -

OS X 二进制 ffplay 和流屏幕:

谢谢!!

【讨论】:

  • 在 Ubuntu 上运行良好,谢谢!!
  • 如何在 vlc 中打开这个?
  • 在 Mac OS X Yosemite 上试过这个,我得到一个“pipe:: Invalid data found when processing input”可能是因为我正在使用蓝牙。
  • 如何在 Windows 上执行此操作?
  • 使用 adb shell "while true; do screenrecord --output-format=h264 --time-limit 5 -; done" | ffplay - 克服 180 秒的限制,让它在
【解决方案2】:

我不记得我用于初始测试的 vlc 命令行。我最近在桌面 Linux (Ubuntu 15.10) 上尝试了一些不同的东西。

VLC

如果您只是将输出通过管道传输到vlc --demux h264 -,它似乎可以工作,但您会逐渐落后。添加--h264-fps=60 似乎对此有所帮助,但是您开始遇到错误(“ES_OUT_SET_(GROUP_)PCR is called too late”)。添加--clock-jitter=0 似乎可以减少错误的创伤,但它仍然很混乱。

ffplay

一个简单的ffplay - 有效,但似乎需要几秒钟才能决定开始,并最终远远落后于整个时间。

更新 - 2018 年 1 月

使用ffplay -framerate 60 -framedrop -bufsize 16M - 可以为您提供持续相当长一段时间的体面品质。这是由于以下命令同步帧率和比特率,否则视频将尝试以 30fps 播放,由于额外的帧,随着时间的推移,一切看起来/变慢。然后,比特率将有助于尽可能保持视频正确定时。 我发现它可以在 100-1000 毫秒的延迟内工作;类似于大多数蓝牙耳机。 您可能会收到“考虑增加探针大小”错误,这可能会冻结流。最好重启screenrecord或尝试追加-probesize 16M

注意: 带有 ffplay 的此配置适用于预先通过管道传输的以下 adb 命令。如果您正在运行 GPU 密集型任务或使用较旧的手机,1280x720 的大小是更好的建议。如果您的手机不支持 60fps(或似乎不以 60fps 录制),请更改直到合适的值,例如 30 或 24。

adb exec-out screenrecord --bit-rate=16m --output-format=h264 --size 1920x1080 -

播放器

命令mplayer -demuxer h264es - 似乎产生了最好的结果。立即启动,几乎没有延迟,并且不会像 vlc 那样发疯。

【讨论】:

  • 是的,ffplay 可以使用一些爱。
  • 为什么是 adb shell 而不是 adb exec-out ? adb shell 不适用于管道 exec-out 是专门为管道设计的,它会提供更好的结果
  • 对于未来因没有视频显示而感到困惑的人(但命令行中没有错误):我发现什么都没有显示,直到我在屏幕上造成大量移动(滚动应用程序抽屉等)。我猜它会导致一些缓冲区被填满?
  • @JosephReeve:好点。如果不需要,Android 不会生成帧。 screenrecord 命令捕获生成的帧——它不进行定期采样——所以如果屏幕上没有发生任何事情,则不会出现任何输出。视频编解码器在生成输出之前可能需要一定量的输入缓冲,因此您可能需要在出现任何内容之前进行一些屏幕更新。 (它最终会因为时钟更新而唤醒,但拖动通知栏会加快它的速度。)
  • adb shell 产生了混乱。试过adb exec-out,它解决了这个问题!
【解决方案3】:

根据上面的答案,我已经尝试了所有可能的组合,只有一个不会滞后很多,不会停止并且具有不错的视频质量,使用 ffplay:

adb shell screenrecord --bit-rate=16m --output-format=h264 --size 800x600 - | ffplay -framerate 60 -framedrop -bufsize 16M -

大小参数可以更改为任何值。

请注意,这仍然远非完美,但可以完成工作,我还通过 WiFi 进行了尝试,它足够好

【讨论】:

    【解决方案4】:

    播放器

    对于低延迟播放,mplayer 是迄今为止效果最好的。

    adb shell screenrecord --output-format=h264 - | mplayer -framedrop -fps 6000 -cache 512 -demuxer h264es -
    

    注意:以上设置 mplayer 尽快消耗帧。不过,因此,在等待新帧时播放窗口可能会变慢。

    屏幕录像有 3 分钟的时间限制“功能”。如果您对从代码重新编译它感到满意,这里是good link

    重新编译录屏后:

    adb shell screenrecord --time-limit=31000  --output-format=h264 - | mplayer -framedrop -fps 6000 -cache 512 -demuxer h264es -
    

    【讨论】:

      【解决方案5】:

      使用任何adb shell 命令都会为我生成损坏的数据。正如lord-ralf-adolfaccepted answer 的评论中所指出的那样,使用adb exec-out 解决了问题。

      我使用这个确切的命令从 Galaxy S6 获得最佳视频质量和最小延迟:

      adb exec-out screenrecord --output-format=h264 --size 540x960 - | ffplay -framerate 60 -framedrop -bufsize 16M -
      

      【讨论】:

        【解决方案6】:

        我发现这个软件(适用于 linux、windows 和 mac)允许您镜像和控制通过 adb 连接的设备:

        https://github.com/Genymobile/scrcpy

        它救了我!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-21
          • 2011-06-22
          • 2023-04-03
          • 1970-01-01
          • 2019-05-02
          • 2017-02-14
          • 1970-01-01
          相关资源
          最近更新 更多