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

时间:2016-09-19 09:01:49

标签: android qt adb

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

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

可能是什么问题?为什么我可以观看录制的视频,但无法观看流式视频?

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

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

1 个答案:

答案 0 :(得分:4)

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

因此,为了捕获没有损坏的文件,您应该使用

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