将 Android 屏幕流式传输到视频播放器
Stream Android screen to video player
我在我的笔记本电脑上使用 Windows 7 64 位,在我的 Samsung Galaxy S4 设备上使用 Android 5.0.1。
我正在尝试使用以下代码通过 adb 流式传输我设备的屏幕:
adb shell screenrecord --output-format=h264 - | vlc -
我有 vlc v2.2.4
但是它什么也没有显示。
但是如果我使用 media player classic,它带有 k-lite mega codec pack v12.3.5,代码如下:
adb shell screenrecord --output-format=h264 - | "C:\Program Files (x86)\K-Lite Codec Pack\MPC-HC64\mpc-hc64_nvo.exe" -
它显示的内容与我的屏幕类似,但图像完全损坏。
如果我使用 adb shell screenrecord --output-format=h264 /sdcard/screenrecord.mp4
录制我的设备屏幕,将其从设备中拉出并使用 media player classic 打开它,那么它的视频就完全没问题了。但是,这种情况下vlc也打不开
可能是什么问题?为什么我可以观看录制的视频,但不能观看流媒体视频?
还有一个后续问题。我找到了 adb-server 的命令来获取设备的屏幕截图。它是 adb shell screencap
命令的替代方法。我可以通过 Qt 框架中的 QTcpSocket 使用该命令。
但是,我找不到替代 adb shell screenrecord
的 adb 服务器。在这种情况下,我需要使用 QProcess 来执行 运行 命令,并以某种方式将输出转发到 QMediaPlayer。到目前为止我没能成功,因为我发现 QMediaPlayer::setMedia
接受 QMediaSource
或 QIODevice
。我发现 QProcess 是从 QIODevice
继承的,并试图将其作为参数提供给 QMediaPlayer:::setMedia
,但我的程序以错误代码 1 退出。如何将 QProcess
的输出转发给 QMediaPlayer
?
为了支持交互式 adb shell
命令,shell_service
使用 pty
。它有助于处理所有交互式用户输入,如光标键按下等。但使用 pty
的副作用是它会破坏进程的二进制输出。这就是为什么在主机端捕获 adb shell screenrecord
的输出会导致文件损坏的原因。以前解决这个问题的唯一方法是 post-process 文件以删除那些额外的字符。但是前段时间Google添加了另一个版本的shell
命令,它没有交互模式,因此不需要使用pty
。他们称之为 exec-out
.
因此,为了在不损坏的情况下捕获文件,您应该使用
adb exec-out screenrecord --output-format=h264 -
我在我的笔记本电脑上使用 Windows 7 64 位,在我的 Samsung Galaxy S4 设备上使用 Android 5.0.1。
我正在尝试使用以下代码通过 adb 流式传输我设备的屏幕:
adb shell screenrecord --output-format=h264 - | vlc -
我有 vlc v2.2.4
但是它什么也没有显示。
但是如果我使用 media player classic,它带有 k-lite mega codec pack v12.3.5,代码如下:
adb shell screenrecord --output-format=h264 - | "C:\Program Files (x86)\K-Lite Codec Pack\MPC-HC64\mpc-hc64_nvo.exe" -
它显示的内容与我的屏幕类似,但图像完全损坏。
如果我使用 adb shell screenrecord --output-format=h264 /sdcard/screenrecord.mp4
录制我的设备屏幕,将其从设备中拉出并使用 media player classic 打开它,那么它的视频就完全没问题了。但是,这种情况下vlc也打不开
可能是什么问题?为什么我可以观看录制的视频,但不能观看流媒体视频?
还有一个后续问题。我找到了 adb-server 的命令来获取设备的屏幕截图。它是 adb shell screencap
命令的替代方法。我可以通过 Qt 框架中的 QTcpSocket 使用该命令。
但是,我找不到替代 adb shell screenrecord
的 adb 服务器。在这种情况下,我需要使用 QProcess 来执行 运行 命令,并以某种方式将输出转发到 QMediaPlayer。到目前为止我没能成功,因为我发现 QMediaPlayer::setMedia
接受 QMediaSource
或 QIODevice
。我发现 QProcess 是从 QIODevice
继承的,并试图将其作为参数提供给 QMediaPlayer:::setMedia
,但我的程序以错误代码 1 退出。如何将 QProcess
的输出转发给 QMediaPlayer
?
为了支持交互式 adb shell
命令,shell_service
使用 pty
。它有助于处理所有交互式用户输入,如光标键按下等。但使用 pty
的副作用是它会破坏进程的二进制输出。这就是为什么在主机端捕获 adb shell screenrecord
的输出会导致文件损坏的原因。以前解决这个问题的唯一方法是 post-process 文件以删除那些额外的字符。但是前段时间Google添加了另一个版本的shell
命令,它没有交互模式,因此不需要使用pty
。他们称之为 exec-out
.
因此,为了在不损坏的情况下捕获文件,您应该使用
adb exec-out screenrecord --output-format=h264 -