将 Android 屏幕流式传输到视频播放器

Umr*_*aev 2 qt android adb

我在笔记本电脑上使用 Windows 7 64 位,在三星 Galaxy S4 设备上使用 Android 5.0.1。我正在尝试使用以下代码通过 adb 流式传输我的设备屏幕: adb shell screenrecord --output-format=h264 - | vlc - 我有 vlc v2.2.4 但它没有显示任何内容。

但是,如果我使用 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用来记录我的设备屏幕,从设备中拉出它并使用经典媒体播放器打开它,那么它的视频就完全没问题了。但是,即使在这种情况下,vlc 也无法打开。

可能是什么问题?为什么我可以观看录制的视频,但不能观看流媒体视频?

还有一个后续问题。我找到了 adb-server 的命令来获取设备的屏幕截图。它是adb shell screencap命令的替代方法。我可以通过 Qt 框架中的 QTcpSocket 使用该命令。

但是,我找不到替代adb shell screenrecord. 在这种情况下,我需要使用 QProcess 来运行命令并以某种方式将输出转发到 QMediaPlayer。到目前为止,我无法成功,因为我发现QMediaPlayer::setMediaacceptsQMediaSourceQIODevice. 我发现 QProcess 是从 继承的,QIODevice并试图将其作为参数提供给QMediaPlayer:::setMedia,但我的程序退出时出现错误代码 1。如何将QProcess的输出转发到QMediaPlayer

Ale*_* P. 7

为了支持交互式adb shell命令,shell_service使用pty. 它有助于处理所有交互式用户输入,如光标键按下等。但使用的副作用pty是它会破坏进程的二进制输出。这就是为什么adb shell screenrecord在主机端捕获 的输出会导致文件损坏的原因。以前解决这个问题的唯一方法是对文件进行后处理以删除那些额外的字符。但是前段时间谷歌添加了另一个版本的shell命令,它没有交互模式,因此不需要使用pty. 他们称之为exec-out

因此,为了捕获文件而不会损坏,您应该使用

adb exec-out screenrecord --output-format=h264 -
Run Code Online (Sandbox Code Playgroud)