我已经尝试了fadden的建议将Android屏幕镜像到PC,但vlc播放器屏幕没有显示:
此函数的正确命令行是什么?谢谢。
由于 vlc 无法从 adb std 输出播放 h264 文件,我转而使用 ffplay 作为流播放器,它通过以下命令工作:
adb shell screenrecord --output-format=h264 - | ffplay -
OS X 二进制文件 ffplay 和流媒体屏幕:
谢谢!!
我不记得最初测试时使用的 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 -
可以工作,但似乎需要几秒钟才能决定开始,并且最终远远落后于整个时间。
使用
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 那样崩溃。
根据上面的答案,我尝试了所有可能的组合,只有一个不会滞后很多,不会停止,并且具有不错的视频质量,带有 ffplay:
adb shell screenrecord --bit-rate=16m --output-format=h264 --size 800x600 - | ffplay -framerate 60 -framedrop -bufsize 16M -
尺寸参数可以更改为任何值。
请注意,这还远未达到完美,但已经完成了工作,我还通过 WiFi 进行了尝试,结果足够好。
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 -
我发现可以通过以下方式实现最低延迟播放:
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 -
使用任何
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 -
使用 mpv 对我来说最好的结果:
adb shell screenrecord --bit-rate=16m --size 540x1140 --output-format=h264 - | mpv --profile=low-latency --no-correct-pts --fps=60 -
我一直在为此进行研究,在我的许多研究和尝试中,这是我能实现的最好结果,我想说我已经通过 ADB 的屏幕记录流找到了 0 延迟流。
在我的研究过程中,我发现PIPES有一个与系统内核一起编译的内置缓冲区,然后我试图找到一种方法来避免PIPE创建的相当于4096字节的缓冲。
不管你信不信,我不太确定我做了什么,但是它正在工作,有很多命令行工具可以避免管道缓冲区,我将列出其中的一些。
下面是我在数千次尝试中完成的 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 -