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

标签 android qt adb

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

但是如果我使用 media player classic,它带有 k-lite mega 编解码器包 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 接受 QMediaSourceQIODevice。我发现 QProcess 是从 QIODevice 继承的,并试图将其作为参数提供给 QMediaPlayer:::setMedia,但我的程序以错误代码 1 退出。我该如何转发QProcessQMediaPlayer 的输出?

最佳答案

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

所以为了捕获文件而不损坏你应该使用

adb exec-out screenrecord --output-format=h264 -

关于android - 将 Android 屏幕流式传输到视频播放器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39569208/

相关文章:

android - 如何通过wifi自动adb连接到设备

android - SQLite : How to join tables and present the cursor using SimpleCursorAdapter

java - 延迟发布通知

java - 运行相机应用程序时出错

android - 在 libGDX 中,我可以针对低于框架要求的 API 级别吗?

c++ - QListView中的QT4 QstringListModel

c++ - 错误 : templated copy constructor calls itself

c++ - qt qtcpserver 仅在主函数中创建时才起作用

android - ADB root 无法在模拟器上运行(无法在生产版本中以 root 身份运行)

android - 失败 [INSTALL_FAILED_USER_RESTRICTED : Invalid apk] in android