使用adb screenrecord命令通过USB将Android屏幕镜像到PC

问题描述 投票:0回答:9

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

enter image description here

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

android adb screencast
9个回答
34
投票

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

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

OS X 二进制文件 ffplay 和流媒体屏幕:

enter image description here

谢谢!!


28
投票

我不记得最初测试时使用的 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-1000MS 延迟内工作;与大多数蓝牙耳机类似。 您可能会收到“考虑增加探针大小”错误,这可能会冻结流。最好重新启动屏幕录制或尝试附加
-probesize 16M

注意: ffplay 的此配置可与预先通过管道传输的以下 adb 命令配合使用。如果您正在运行 GPU 密集型任务或使用较旧的手机,则建议使用

1280x720
的大小。如果您的手机不支持 60fps(或似乎不以 60fps 录制),请更改为适当的值,例如 30 或 24。

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

mplayer

命令

mplayer -demuxer h264es -
似乎产生了最好的结果。 立即开始,很少有延迟,并且不会像 vlc 那样崩溃。


9
投票

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

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

尺寸参数可以更改为任何值。

请注意,这还远未达到完美,但已经完成了工作,我还通过 WiFi 进行了尝试,结果足够好


5
投票

mplayer

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

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

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

录屏有3分钟时间限制的“功能”。如果您愿意从代码重新编译它,这里有一个很好的链接

重新编译屏幕记录后:

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

4
投票

我发现可以通过以下方式实现最低延迟播放:

adb exec-out screenrecord --bit-rate=64m --output-format=h264 --size=1080x680 - | ffplay -framerate 60 -framedrop -fflags nobuffer -flags low_delay -strict experimental -analyzeduration 100000 -probesize 64 -sync ext -vf setpts=0 -fflags discardcorrupt -

根据如何使用 ffmpeg 最小化直播中的延迟


3
投票

使用任何

adb shell
命令都会为我生成损坏的数据。使用
adb exec-out
,如 lord-ralf-adolf 在对 已接受的答案的评论中指出的那样,解决了问题。

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

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

1
投票

我发现了这个软件(适用于linux、windows和mac),它可以让你镜像和控制通过adb连接的设备:

https://github.com/Genymobile/scrcpy

它救了我!


0
投票

使用 mpv 对我来说最好的结果:

adb shell screenrecord --bit-rate=16m --size 540x1140 --output-format=h264 - | mpv --profile=low-latency --no-correct-pts --fps=60 -

0
投票

我一直在为此进行研究,在我的许多研究和尝试中,这是我能实现的最好结果,我想说我已经通过 ADB 的屏幕记录流找到了 0 延迟流。

在我的研究过程中,我发现PIPES有一个与系统内核一起编译的内置缓冲区,然后我试图找到一种方法来避免PIPE创建的相当于4096字节的缓冲。

不管你信不信,我不太确定我做了什么,但是它正在工作,有很多命令行工具可以避免管道缓冲区,我将列出其中的一些。

  • 解除缓冲
  • stdbuf
  • pv(这个最有效)

光伏手册页

下面是我在数千次尝试中完成的 bash 脚本之一的用法,我仍然不知道为什么它使用旧的 USB 2.0 设备明显实时运行。

#!/bin/bash
#--size 848x420 \
ionice -c 2 -n 0 adb exec-out screenrecord \
    --bit-rate 4M \
    --size 848x376 \
    --time-limit 0 \
    --output-format=h264 \
    --codec-name='c2.android.avc.encoder' - | pv -B 0 |

ionice -c 2 -n 0 mplayer \
    -vo xv \
    -quiet \
    -x 848 -y 376 \
    -fps 90 \
    -fs \
    -osdlevel 0 \
    -ao null \
    -nosound \
    -nocache \
    -lavdopts fast \
    -title "Android extremely low latency" \
    -demuxer h264es -
© www.soinside.com 2019 - 2024. All rights reserved.