Use adb screenrecord command to mirror Android screen to PC via USB

夙愿已清 提交于 2019-11-28 16:06:53
fadden

I don't remember the vlc command line that I used for the initial testing. I've tried a few different things recently, on desktop Linux (Ubuntu 15.10).

VLC

If you just pipe the output into vlc --demux h264 -, it appears to work, but you get gradually farther behind. Adding --h264-fps=60 seems to help that, but you start getting errors ("ES_OUT_SET_(GROUP_)PCR is called too late"). Adding --clock-jitter=0 seems to make the errors less traumatic, but it's still pretty messed up.

ffplay

A simple ffplay - works, but it seems to take a few seconds to decide to start, and ends up lagging well behind the entire time.

Update - January 2018

Using ffplay -framerate 60 -framedrop -bufsize 16M - gives you a decent quality that lasts for quite a while. This is due to the below command that synchronises the framerate and bitrate as the video will otherwise be trying to play at 30fps making everything look/get slower over time due to the extra frames. The bitrate will then help keep the video properly timed as best as possible. I've found it works within a 100-1000MS delay; similarly to most Bluetooth headsets. You might get a "consider increasing probesize" error that may freeze the stream. It's best to restart screenrecord or try appending -probesize 16M

Note: This configuration with ffplay works with the following adb command piped beforehand. If you're running GPU intensive tasks or using an older phone, a size of 1280x720 is a better recommendation. If your phone doesn't support 60fps (or doesn't seem to record in 60fps) change until appropriate with values such as 30 or 24.

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

mplayer

The command mplayer -demuxer h264es - seems to yield the best results. Starts immediately, very little delay, and doesn't freak out like vlc.

Since vlc can't play the h264 file from adb std output, I turn to use ffplay as stream player and it works via the following command:

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

OS X binary ffplay and streaming screens:

Thanks!!

Based on the answers above I have tried every possible combination and there is only one that is does not lag a lot, does not stop and has a decent video quality, with ffplay:

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

The size parameter can be changed to anything.

Note this is still far from perfect, but gets the work done and I also tried it over WiFi and it was good enough.

mplayer

For the low latency playback, the mplayer worked the best so far.

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

Note: the above sets the mplayer to consume frames as soon as possible. Though, as a result, the playback window may be sluggish when waiting for new frames.

The screenrecord has a 3 minutes time limit "feature". If you feel comfortable with recompiling it from code, here is a good link.

After recompiling the screenrecord:

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

Using any of the adb shell commands produced corrupted data for me. Using adb exec-out, as noted by lord-ralf-adolf in a comment on the accepted answer, fixed the problem.

I used this exact command to get optimal video quality and minimal lag from a Galaxy S6:

adb exec-out screenrecord --output-format=h264 --size 540x960 - | ffplay -framerate 60 -framedrop -bufsize 16M -
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!