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

Posted

技术标签:

【中文标题】将 Android 屏幕流式传输到视频播放器【英文标题】:Stream Android screen to video player 【发布时间】:2016-09-19 09:01:48 【问题描述】:

我在笔记本电脑上使用 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 附带的 media player classic: 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

【问题讨论】:

我回答了您的一个问题。请单独发布您的其余问题 - 每个帖子保留一个问题。 【参考方案1】:

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

因此,为了不损坏文件,您应该使用

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

【讨论】:

我发现 adb exec-out screenrecord 在一段时间后停止产生输出。有什么办法可以预防吗? 基于文档: --time-limit time 设置最长录制时间,以秒为单位。默认值和最大值为 180(3 分钟)。 developer.android.com/studio/command-line/…

以上是关于将 Android 屏幕流式传输到视频播放器的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将视频从 php 服务器流式传输到 android

如何同时播放/流式传输视频并保存?

如何将视频从 Play 2 框架流式传输到 HTML5 播放器

在 android 视频视图中流式传输视频

通过 RTP 流式传输,RTMP 播放质量问题

将实时视频流式传输到浏览器(低延迟)[关闭]