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

36

我尝试了fadden的建议来将Android屏幕镜像到PC,但是vlc播放器没有显示任何内容:

enter image description here

请问这个功能的正确命令行是什么?谢谢。


在Android SE上:http://android.stackexchange.com/questions/7686/is-there-a-way-to-see-the-devices-screen-live-on-pc-through-adb - Ciro Santilli OurBigBook.com
https://dev59.com/yWYr5IYBdhLWcg3wkK6w - Alex P.
8个回答

33

由于vlc无法播放从adb std输出的h264文件,我转而使用ffplay作为流媒体播放器,以下是它成功运行的命令:

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

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

enter image description here

谢谢!!


2
在Ubuntu上运行得非常好,谢谢!! - Gautam
3
我怎样在 VLC 中打开这个文件? - Oliver Dixon
1
当我使用“-”作为输出时,我得到了以下错误信息:“无法打开' - ':只读文件系统”,如何解决这个问题? - Wesley
2
如何在Windows上完成这个操作? - smedasn
13
使用 adb shell "while true; do screenrecord --output-format=h264 --time-limit 5 -; done" | ffplay - 可以克服180秒的限制,并在不到5秒的时间内对屏幕方向变化做出反应。 - cbix
显示剩余2条评论

28

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

VLC

如果您只将输出导入vlc --demux h264 -,似乎可以工作,但是您会逐渐落后。 添加--h264-fps=60似乎有所帮助,但是您会开始出现错误(“ES_OUT_SET_(GROUP_)PCR过于晚被调用”)。 添加--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

这个指令mplayer -demuxer h264es -似乎可以取得最佳效果。它能够快速启动,几乎没有延迟,并且不像vlc那样崩溃。


是的,ffplay 需要一些关注。 - Ciro Santilli OurBigBook.com
4
为什么要用 adb shell 而不是 adb exec-out? adb shell 不是为了管道而设计的,而 adb exec-out 则专门用于管道传输,会产生更好的结果。 - Rachid Boudjelida
1
对于未来被视频无法显示(但命令行没有错误)所困惑的人:我发现直到在屏幕上引起了大量移动(滚动应用抽屉等),才会有画面显示。我猜这可能是为了填充某种缓冲区而导致的? - Joseph Reeve
1
adb shell 产生了一堆乱码。尝试使用 adb exec-out,问题得到解决! - bgfvdu3w
@Mark 谢谢!那也解决了我的问题。尽管你可以看到它有些正确,但我几乎都是损坏的视频。 - Remolten
显示剩余4条评论

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设置为尽快消耗帧。然而,结果是,在等待新帧时,播放窗口可能会变得缓慢。
screenrecord有一个3分钟的时间限制“功能”。如果你感觉从代码重新编译它很容易,这里有一个好的链接
重新编译screenrecord之后:
adb shell screenrecord --time-limit=31000  --output-format=h264 - | mplayer -framedrop -fps 6000 -cache 512 -demuxer h264es -

3
使用任何 adb shell 命令都会使我的数据损坏。如lord-ralf-adolf被接受的答案的评论中所述,使用adb exec-out可以解决这个问题。
我使用了这个确切的命令以获得来自Galaxy S6的最佳视频质量和最小延迟:
adb exec-out screenrecord --output-format=h264 --size 540x960 - | ffplay -framerate 60 -framedrop -bufsize 16M -

3
我发现最低延迟播放可以通过以下方式实现:
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最小化直播延迟的问题,以下是翻译内容:

1

0

我使用mpv获得最佳结果:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接