2016-09-19 153 views
1

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

但是,如果我使用的媒体播放器经典,它与k-lite兆丰编解码器包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.我如何将QProcess的输出转发到QMediaPlayer

+0

我回答你的问题之一。请单独发布您的其他问题 - 每个帖子保留一个问题。 –

+0

好的,谢谢 – Umriyaev

回答

2

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

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

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

我发现adb exec-out screenrecord在一段时间后停止生成输出。任何想法如何预防它? – Umriyaev

+0

基于文档: - 时间限制时间\t设置最长录制时间(秒)。默认值和最大值是180(3分钟)。 https://developer.android.com/studio/command-line/adb.html#shellcommands – J4S0Nc

相关问题