本帖子旨在分享本人之前在荔枝派zero板子上移植的投屏软件:scrcpy。
scrcpy投屏的分辨率与流畅度受限于两个方面:1.图形渲染 2.解码(h264)
源项目简介:https://github.com/Genymobile/scrcpy.git
大致原理:scrcpy使用adb push一个jar包到Android手机,手机作为server抓取手机屏幕并编码压缩,开发板作为client通过adb连接server;开发板接受到h264码流后解码、渲染显示。此外,client端还可以接受本地键盘和鼠标命令控制Android手机。
硬件验证:licheepi zero开发板
软件:解码与渲染都是软件方式,效果不必期待会有多好。不过,可以拿到有GPU的树莓派上跑,效果应该不错。
scrcpy需要用到adb(不是adbd!!!,所以,你懂的:p要先移植它
先立贴,放放视频,看看是啥东东:
最近编辑记录 checkout (2019-08-02 21:36:25)
离线
牛!
离线
牛叉牛叉, V3s USB 是不是要把 adb 协议弄进去, 让 V3s 做 adb 客户端, 相当于 windows 的 adb shell ?
离线
牛得一塌糊涂!
是不是也可以用wifi来搞?类似wifi display那样...
离线
这个很好玩啊,学习了
离线
Linux 下编译方法:
https://github.com/Genymobile/scrcpy/blob/master/BUILD.md#prebuilt-server
adb -L tcp:5037 fork-server server --reply-fd 268
adb shell CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process / com.genymobile.scrcpy.Server 0 8000000 false - true true
试了一下 scrcpy Windows 64bit 版本,小巧极速, 此处下载 scrcpy-win64-v1.10.zip
貌似通过 adb 注入一个 jar文件在 android 上面跑, 执行 h.264 codec 编码,
然后电脑使用 adb 接收,并 h.264 解码?
离线
楼主大神, 我还是接着到这里来问你合适一点
https://whycan.cn/t_2760.html#p22646
你首先要分清adb和adbd的区别。adbd是手机里面跑的那种,需要支持gadget,adb是主机模式下跑的,用来连接手机
firstman 说:https://whycan.cn/files/members/1574/QQ20190820223450.png
弄了一个 adb 执行程序进去, 然而, 并不能连到我的小米手机.
总觉得还有一个协议没有勾选.
如果我的 f1c100s 里面跑一个 adb, 用来连接手机(手机里面应该跑的是 adbd???)
我需要做哪些操作, 需要在 make menuconfig 里面勾选什么协议吗?
离线
用来连接手机的话,只需要支持USB host模式就行,不需要修改其他东东。插上手机,运行adb,再执行adb devices可以看正不正常
楼主大神, 我还是接着到这里来问你合适一点
https://whycan.cn/t_2760.html#p22646
checkout 说:你首先要分清adb和adbd的区别。adbd是手机里面跑的那种,需要支持gadget,adb是主机模式下跑的,用来连接手机
firstman 说:https://whycan.cn/files/members/1574/QQ20190820223450.png
弄了一个 adb 执行程序进去, 然而, 并不能连到我的小米手机.
总觉得还有一个协议没有勾选.
如果我的 f1c100s 里面跑一个 adb, 用来连接手机(手机里面应该跑的是 adbd???)
我需要做哪些操作, 需要在 make menuconfig 里面勾选什么协议吗?
离线
翻了一下 adb 代码,使用了 libusb,这样在应用层直接驱动了,看起来不需要添加什么协议了,刚刚试了一下f1c100s 插我的手机,居然usb出错。
[ 504.633108] usb 1-1: new high-speed USB device number 6 using musb-hdrc
[ 505.223109] usb 1-1: device not accepting address 6, error -71
[ 505.373116] usb 1-1: new high-speed USB device number 7 using musb-hdrc
[ 505.523120] usb 1-1: device descriptor read/64, error -71
[ 505.793094] usb 1-1: device descriptor read/64, error -71
[ 505.913234] usb usb1-port1: attempt power cycle
[ 506.403107] usb 1-1: new high-speed USB device number 8 using musb-hdrc
[ 506.843098] usb 1-1: device not accepting address 8, error -71
[ 506.993120] usb 1-1: new high-speed USB device number 9 using musb-hdrc
[ 507.433081] usb 1-1: device not accepting address 9, error -71
[ 507.439082] usb usb1-port1: unable to enumerate USB device
回去换条线或者换个手机试一试。
离线
#
#
# [ 97.063258] usb 1-1: new high-speed USB device number 4 using musb-hdrc
# lsusb
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 004: ID 2717:ff08
#
#
# adb devices
List of devices attached
#
换了一条线 USB 连接貌似可以了, 但是 adb devices 什么都没有 ;(
离线
手机开调试模式了没?
# # # [ 97.063258] usb 1-1: new high-speed USB device number 4 using musb-hdrc # lsusb Bus 001 Device 001: ID 1d6b:0002 Bus 001 Device 004: ID 2717:ff08 # # # adb devices List of devices attached #
换了一条线 USB 连接貌似可以了, 但是 adb devices 什么都没有 ;(
离线
开了, 这个手机在 Windows 和 虚拟机Ubuntu 的 adb shell 都正常。
两个手机MI5/RedMI Note7, 两根原装的USB线, 都是一模一样的情况,
lsusb 都可以显示USB设备,内核也没有报错误,就是 adb devices 啥也没有。
最近编辑记录 超级萌新 (2019-08-21 13:55:56)
离线
开了, 这个手机在 Windows 和 虚拟机Ubuntu 的 adb shell 都正常。
两个手机MI5/RedMI Note7, 两根原装的USB线, 都是一模一样的情况,
lsusb 都可以显示USB设备,内核也没有报错误,就是 adb devices 啥也没有。
翻了一下邮箱, 我当时搞君正X1000, 参考这篇文章, 可以搞定,
https://blog.csdn.net/u010340178/article/details/72726205
首先检查 adb 相关文件:
# find / |grep adb
/tmp/adb.log
/usr/bin/adbd
/usr/bin/adb
/root/.android/adbkey.pub
/root/.android/adbkey
然后建立 /root/.android/adb_usb.ini
文件的内容是你的USB VID
0x2717
然后先kill server, 然后就正常了:
adb kill-server
adb devices
adb shell
离线
感谢 @晕哥 @checkout
终于搞定了, 今天终于可以早点下班了 ^_^
离线
mark, 牛逼
小薏科技------全志F系列芯片供应、方案开发、技术支持 QQ:610943940
离线
还有这种玩法啊, 顶起顶起!
--------------------------
试了一下, 玩摄像头, 有点丢帧, 越久越滞后。
最近编辑记录 我思故我在 (2019-09-12 16:52:05)
离线
厉害厉害!
离线
厉害,学习了,到时候试试
离线
心疼自己,没看懂投屏怎么玩的,应该是需要在板子上运行scrcpy吧。。。
萌新大佬,你的nano能投屏吗
先按你的试试,我用https://whycan.cn/t_2794.html里面晕哥提供的tf卡bin,硬件是荔枝派nano.
检测不到手机
# adb devices
error: device offline
# clear
# lsusb
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 002: ID 2d95:6007
# cat /root/.android/adb_usb.ini
0x2D95
#
# adb devices
error: device offline
#
网上搜error: device offline。说要执行
1、adb kill-server
2、adb start-server
3、adb remount
实测还是不行:
#
# adb kill-server
* server not running *
# adb start-server
# adb remount
error: device offline
#
# adb devices
error: device offline
#
你的nano是自己编译固件么/
离线
这个投屏要玩起来,是下面步骤么?
1. 交叉编译scrcpy,在开发板上运行;
2. 开发板通过OTG线,接手机;
3. 实现投屏?
离线
晕哥,是6楼吧。。。
win10下测试了,很顺利,很好玩啊。
ubtuntu16.04,编译不成功,没体验到,折腾一上午了
---
回头再研究上开发板上怎么玩,感觉只有在板子上跑,才能体会装x的快乐。。。
2,1,3 吧
可以跑下4楼的预编译文件, 直观感受一下, 还是挺好玩的。
离线
楼主,大神也,又get到新姿势了.
离线
牛的一塌糊涂
离线
这么流畅的吗?有没有wifi投屏的开源方案?USB还是有限制的
离线
有详细点的操作步骤吗?看的云里雾里的,就是感觉很牛
离线
离线
diff --git a/QtScrcpy/QtScrcpy.pro b/QtScrcpy/QtScrcpy.pro
index 0afdc4e..d0ba2cd 100644
--- a/QtScrcpy/QtScrcpy.pro
+++ b/QtScrcpy/QtScrcpy.pro
@@ -142,7 +142,7 @@ win32 {
QMAKE_POST_LINK += $$quote($$QMAKE_COPY $$WIN_FFMPEG_SRC $$WIN_DST$$escape_expand(\n\t))
# windows rc file
- RC_FILE = $$PWD/res/QtScrcpy.rc
+ #RC_FILE = $$PWD/res/QtScrcpy.rc
}
# ***********************************************************
diff --git a/QtScrcpy/adb/adbprocess.cpp b/QtScrcpy/adb/adbprocess.cpp
index ad14835..7af3685 100644
--- a/QtScrcpy/adb/adbprocess.cpp
+++ b/QtScrcpy/adb/adbprocess.cpp
@@ -1,4 +1,4 @@
-#include <QCoreApplication>
+#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <QFileInfo>
@@ -116,9 +116,9 @@ QStringList AdbProcess::getDevicesSerialFromStdOut()
{
// get devices serial by adb devices
QStringList serials;
- QStringList devicesInfoList = m_standardOutput.split(QRegExp("\r\n|\n"), Qt::SkipEmptyParts);
+ QStringList devicesInfoList = m_standardOutput.split(QRegExp("\r\n|\n"), QString::SkipEmptyParts);
for (QString deviceInfo : devicesInfoList) {
- QStringList deviceInfos = deviceInfo.split(QRegExp("\t"), Qt::SkipEmptyParts);
+ QStringList deviceInfos = deviceInfo.split(QRegExp("\t"), QString::SkipEmptyParts);
if (2 == deviceInfos.count() && 0 == deviceInfos[1].compare("device")) {
serials << deviceInfos[0];
}
diff --git a/QtScrcpy/device/controller/inputconvert/inputconvertnormal.cpp b/QtScrcpy/device/controller/inputconvert/inputconvertnormal.cpp
index 63924e1..6362231 100644
--- a/QtScrcpy/device/controller/inputconvert/inputconvertnormal.cpp
+++ b/QtScrcpy/device/controller/inputconvert/inputconvertnormal.cpp
@@ -1,4 +1,4 @@
-#include <cmath>
+#include <cmath>
#include "inputconvertnormal.h"
@@ -59,7 +59,7 @@ void InputConvertNormal::wheelEvent(const QWheelEvent *from, const QSize &frameS
qint32 vScroll = from->angleDelta().y() == 0 ? 0 : from->angleDelta().y() / abs(from->angleDelta().y()) * 2;
// pos
- QPointF pos = from->position();
+ QPointF pos = from->posF();
// convert pos
pos.setX(pos.x() * frameSize.width() / showSize.width());
pos.setY(pos.y() * frameSize.height() / showSize.height());
diff --git a/QtScrcpy/device/ui/videoform.cpp b/QtScrcpy/device/ui/videoform.cpp
index 36a6ef4..7fb9468 100644
--- a/QtScrcpy/device/ui/videoform.cpp
+++ b/QtScrcpy/device/ui/videoform.cpp
@@ -1,4 +1,4 @@
-#include <QDesktopWidget>
+#include <QDesktopWidget>
#include <QFileInfo>
#include <QLabel>
#include <QMessageBox>
@@ -611,13 +611,13 @@ void VideoForm::mouseDoubleClickEvent(QMouseEvent *event)
void VideoForm::wheelEvent(QWheelEvent *event)
{
- if (m_videoWidget->geometry().contains(event->position().toPoint())) {
+ if (m_videoWidget->geometry().contains(event->posF().toPoint())) {
if (!m_device) {
return;
}
- QPointF pos = m_videoWidget->mapFrom(this, event->position().toPoint());
+ QPointF pos = m_videoWidget->mapFrom(this, event->posF().toPoint());
QWheelEvent wheelEvent(
- pos, event->globalPosition(), event->pixelDelta(), event->angleDelta(), event->buttons(), event->modifiers(), event->phase(), event->inverted());
+ pos, event->globalPosF(), event->pixelDelta(), event->angleDelta(), event->buttons(), event->modifiers(), event->phase(), event->inverted());
emit m_device->wheelEvent(&wheelEvent, m_videoWidget->frameSize(), m_videoWidget->size());
}
}
diff --git a/QtScrcpy/dialog.cpp b/QtScrcpy/dialog.cpp
index e5f6827..d143f67 100644
--- a/QtScrcpy/dialog.cpp
+++ b/QtScrcpy/dialog.cpp
@@ -1,4 +1,4 @@
-#include <QDebug>
+#include <QDebug>
#include <QFile>
#include <QFileDialog>
#include <QKeyEvent>
@@ -137,7 +137,7 @@ void Dialog::execAdbCmd()
}
QString cmd = ui->adbCommandEdt->text().trimmed();
outLog("adb " + cmd, false);
- m_adb.execute(ui->serialBox->currentText().trimmed(), cmd.split(" ", Qt::SkipEmptyParts));
+ m_adb.execute(ui->serialBox->currentText().trimmed(), cmd.split(" ", QString::SkipEmptyParts));
}
QString Dialog::getGameScript(const QString &fileName)
Qt5.12.3 mingw64 可以编译成功 ^_^
离线
奇怪,我也编译运行成功,但是无论用哪个脚本,电脑按键事件都不能触发屏幕的点击和手势动作呢?
离线
奇怪,我也编译运行成功,但是无论用哪个脚本,电脑按键事件都不能触发屏幕的点击和手势动作呢?
看软件提示,按 ~ 可以切换
离线
没有电脑怎么开启手机的adb?
离线
离线
这个工具不错啊, 神器啊。
离线
apt 库里没有么?
离线
这个v3s 怎么交叉编译?需要依赖哪些库
离线