Skip to content

Commit

Permalink
feat: 重新梳理屏幕镜像模块
Browse files Browse the repository at this point in the history
- 默认背景为纯黑
- 更新上游scrcpycore为3.0.2
  • Loading branch information
mhduiy committed Dec 8, 2024
1 parent 781980c commit dd2be35
Show file tree
Hide file tree
Showing 14 changed files with 183 additions and 109 deletions.
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -85,4 +85,6 @@ target_link_libraries(${EXE_NAME} PRIVATE
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::WebSockets
Qt${QT_VERSION_MAJOR}::QuickControls2

QtScrcpyCore
)
3 changes: 2 additions & 1 deletion debian/control
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ Build-Depends:
mesa-common-dev,
libvulkan-dev,
libqt6opengl6-dev,
libqt6websockets6-dev
libqt6websockets6-dev,
ppmpeg

Standards-Version: 0.0.1

Expand Down
32 changes: 30 additions & 2 deletions src/cpp/imagePageTool/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,34 @@ set(IMAGE_PAGE_SRC
${CMAKE_CURRENT_SOURCE_DIR}/imagePageTool.h
)

target_sources(${EXE_NAME} PRIVATE ${IMAGE_PAGE_SRC})
# MFloat
file(GLOB_RECURSE SCRCPY_SRC ${CMAKE_CURRENT_SOURCE_DIR}/scrcpy/service/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/scrcpy/ui/*.cpp)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
target_sources(${EXE_NAME} PRIVATE ${IMAGE_PAGE_SRC} ${SCRCPY_SRC})
target_include_directories(${EXE_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/scrcpy)

set(QSC_DEPLOY_PATH ${CMAKE_BINARY_DIR}/lib)

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/scrcpy/core)

find_program(ADB_PATH adb)
if(ADB_PATH)
message(STATUS "Found adb at: ${ADB_PATH}")
else()
message(FATAL_ERROR "adb not found on your system")
endif()

if(ADB_PATH)
add_definitions(-DADB_PATH="${ADB_PATH}")
endif()

# MacOS
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
find_package(PkgConfig REQUIRED)
pkg_check_modules(FFMPEG REQUIRED libswscale)

target_include_directories(${EXE_NAME} PRIVATE ${FFMPEG_INCLUDE_DIRS})
target_link_directories(${EXE_NAME} PRIVATE ${FFMPEG_LIBRARY_DIRS})

target_link_libraries(${EXE_NAME} PRIVATE ${FFMPEG_LIBRARIES})
endif()
37 changes: 18 additions & 19 deletions src/cpp/imagePageTool/imagePageTool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
#include "src/cpp/adb/connectmanager.h"
#include "src/cpp/utils/notificationcontroller.h"
#include "src/cpp/utils/utils.hpp"
// #include "ui/util/config.h"
// #include "service/ServiceManager.h"
// #include "ui/mirror/MirrorScene.h"
// #include "service/WebSocketService.h"
#include "ui/util/config.h"
#include "service/ServiceManager.h"
#include "ui/mirror/MirrorScene.h"
#include "service/WebSocketService.h"

ImageDetailTools::ImageDetailTools(QObject *parent)
: QObject(parent)
Expand All @@ -34,25 +34,24 @@ void ImageDetailTools::shotScreen(const QString &outPath)
ImagePageTool::ImagePageTool(QObject *parent)
: QObject(parent)
{
// QString str = QCoreApplication::applicationDirPath();
// int index = str.indexOf("/.output");
// QString leftSide = str.left(index);
QString str = QCoreApplication::applicationDirPath();
int index = str.indexOf("/.output");
QString leftSide = str.left(index);

// Config::getInstance().setProjectPath(leftSide);
Config::getInstance().setProjectPath(leftSide);

// resourceService = new ResourceService(this);
// ServiceManager::getInstance().setResourceService(resourceService); // Register service to our C++ singleton
resourceService = new ResourceService(this);
ServiceManager::getInstance().setResourceService(resourceService); // Register service to our C++ singleton

// m_broadcast = new Broadcast(); // UDP broadcast to clients can find server data
// m_broadcast->start();
m_broadcast = new Broadcast(); // UDP broadcast to clients can find server data
m_broadcast->start();

// new WebSocketService(8097, this);
new WebSocketService(8097, this);

// ResourceService::declareQml();
// MirrorScene::declareQml();
// Config::declareQml();

// qmlRegisterSingletonInstance("Resource", 1, 0, "Resource", resourceService);
// qmlRegisterSingletonInstance("ImageDetailTools", 1, 0, "ImageDetailTools", ImageDetailTools::instance(this));
ResourceService::declareQml();
MirrorScene::declareQml();
Config::declareQml();

qmlRegisterSingletonInstance("Resource", 1, 0, "Resource", resourceService);
qmlRegisterSingletonInstance("ImageDetailTools", 1, 0, "ImageDetailTools", ImageDetailTools::instance(this));
}
12 changes: 6 additions & 6 deletions src/cpp/imagePageTool/imagePageTool.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
#include <qtmetamacros.h>
#include "../utils/singleton.hpp"

// #include "service/ResourceService.h"
// #include "service/udp/Broadcast.h"
#include "service/ResourceService.h"
#include "service/udp/Broadcast.h"

class ImageDetailTools : public QObject
{
Expand All @@ -16,8 +16,8 @@ class ImageDetailTools : public QObject
Q_INVOKABLE void shotScreen(const QString &outPath);

private:
// ResourceService *resourceService = nullptr;
// Broadcast *m_broadcast = nullptr;
ResourceService *resourceService = nullptr;
Broadcast *m_broadcast = nullptr;
};

class ImagePageTool : public QObject
Expand All @@ -28,6 +28,6 @@ class ImagePageTool : public QObject


private:
// ResourceService *resourceService = nullptr;
// Broadcast *m_broadcast = nullptr;
ResourceService *resourceService = nullptr;
Broadcast *m_broadcast = nullptr;
};
8 changes: 4 additions & 4 deletions src/cpp/imagePageTool/scrcpy/service/ResourceService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,10 @@ void ResourceService::qmlToolbarClick(QString request) {
device->postVolumeDown();
} else if (request == "arrow-back") {
device->postGoBack();
} else if (request == "screen-on") {
device->setScreenPowerMode(true);
} else if (request == "screen-off") {
device->setScreenPowerMode(false);
// } else if (request == "screen-on") {
// device->setScreenPowerMode(true);
// } else if (request == "screen-off") {
// device->setScreenPowerMode(false);
} else if (request == "power") {
device->postPower();
} else if (request == "expand-menu") {
Expand Down
22 changes: 10 additions & 12 deletions src/cpp/imagePageTool/scrcpy/service/WebSocketService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ void WebSocketService::qmlGenerateEvents(QString request, QString data)

void WebSocketService::onDeviceConnected(bool success, const QString &serial, const QString &deviceName, const QSize &size) {

qDebug() << "onDeviceConnected" << serial << deviceName << size.width();
qDebug() << "onDeviceConnected" << serial << deviceName << size.width() << "success:" << success;

if (success) {
responseToClents(Server::SERVER_RESPONSE::MIRROR_SUCCESS_START); // notification to users for start mirroring
Expand All @@ -212,34 +212,32 @@ void WebSocketService::requestMirrorStart() {

qDebug() << "requestMirrorStart()";

// this is ok that "original" toUshort is 0
quint16 videoSize = 1080;
qsc::DeviceParams params;
params.serial = resourceService->serial();

params.maxSize = resourceService->mirror->resolution; // 720 - 1080 - 1280 - 1920;
params.bitRate = Config::getInstance().getKBitRate() * 1000; // Mbit/s

params.maxSize = videoSize;
params.bitRate = Config::getInstance().getKBitRate() * 1000;
// on devices with Android >= 10, the capture frame rate can be limited
params.maxFps = static_cast<quint32>(Config::getInstance().getMaxFps());
params.closeScreen = false;
params.useReverse = true;
params.display = true;
params.renderExpiredFrames = false;
params.lockVideoOrientation = -1;
params.renderExpiredFrames = Config::getInstance().getRenderExpiredFrames();
params.captureOrientationLock = 1;
params.captureOrientation = 0;
params.stayAwake = false;
params.recordFile = true;
params.recordFile = false;
params.recordPath = Config::getInstance().getRecordOutPath();
qInfo() << "录制路径: " << params.recordPath;
params.recordFileFormat = "mp4";
params.serverLocalPath = Config::getInstance().getProjectPath() + "/res/scrcpy-server";
params.serverLocalPath = Config::getInstance().getProjectPath() + "/scrcpy-server";
params.serverRemotePath = Config::getInstance().getServerPath();
params.pushFilePath = Config::getInstance().getPushFilePath();
params.gameScript = "";
params.serverVersion = Config::getInstance().getServerVersion();
params.logLevel = Config::getInstance().getLogLevel();
params.codecOptions = Config::getInstance().getCodecOptions();
params.codecName = Config::getInstance().getCodecName();

params.scid = QRandomGenerator::global()->bounded(1, 10000) & 0x7FFFFFFF;
qsc::IDeviceManage::getInstance().connectDevice(params);
}

Expand Down
4 changes: 2 additions & 2 deletions src/cpp/imagePageTool/scrcpy/ui/mirror/MirrorRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
MirrorRenderer::MirrorRenderer(QObject *parent) {
Q_UNUSED(parent);
m_resourceService = ServiceManager::getInstance().resourceService();
// connect(&qsc::IDeviceManage::getInstance(), &qsc::IDeviceManage::onNewFrame, this, &MirrorRenderer::onFrame);
connect(&qsc::IDeviceManage::getInstance(), &qsc::IDeviceManage::onNewFrame, this, &MirrorRenderer::onFrame);
}

MirrorRenderer::MirrorRenderer() {
Expand Down Expand Up @@ -182,7 +182,7 @@ void MirrorRenderer::updateTextureData(const YUVData &data) {
void MirrorRenderer::paint() {

glDepthMask(true);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

if (!mTextureAlloced) {
Expand Down
19 changes: 8 additions & 11 deletions src/cpp/imagePageTool/scrcpy/ui/mirror/MirrorScene.cpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@

#include <QOpenGLFramebufferObject>
#include <QQuickWindow>
#include <QQuickFramebufferObject>
#include <qlogging.h>
#include <qpainter.h>
#include <QImage>

#include "core/include/QtScrcpyCore.h"
#include "QtScrcpyCore.h"
#include "MirrorRenderer.h"
#include "MirrorScene.h"
#include "service/ServiceManager.h"
Expand All @@ -33,8 +29,9 @@ MirrorItemRender::MirrorItemRender() : m_render(0) {
}

void MirrorItemRender::render() {
m_window->beginExternalCommands();
m_render.paint();
// m_window->resetOpenGLState();
m_window->endExternalCommands();
}

QOpenGLFramebufferObject *MirrorItemRender::createFramebufferObject(const QSize &size) {
Expand Down Expand Up @@ -73,7 +70,7 @@ MirrorScene::MirrorScene(QQuickItem *parent) : QQuickFramebufferObject(parent) {
}

void MirrorScene::declareQml() {
qmlRegisterType<MirrorScene>("App", 1, 0, "MirrorScene");
qmlRegisterType<MirrorScene>("MirrorScene", 1, 0, "MirrorScene");
}

void MirrorScene::timerEvent(QTimerEvent *event) {
Expand Down Expand Up @@ -113,11 +110,11 @@ void MirrorScene::mouseDoubleClickEvent(QMouseEvent *event) {
mouseProcess(event);
}

void MirrorScene::wheelEvent(QWheelEvent *) {
void MirrorScene::wheelEvent(QWheelEvent *event) {

// QWheelEvent wheelEvent(
// event->position(), event->globalPosition(), event->pixelDelta(), event->angleDelta(), event->angleDelta(),
// event->angleDelta(),
// event->pos(), event->globalPosF(), event->pixelDelta(), event->angleDelta(), event->delta(),
// event->orientation(),
// event->buttons(), event->modifiers(), event->phase(), event->source(), event->inverted());

// auto device = qsc::IDeviceManage::getInstance().getDevice(m_resourceService->serial());
Expand All @@ -128,4 +125,4 @@ void MirrorScene::wheelEvent(QWheelEvent *) {
// emit device->wheelEvent(&wheelEvent, m_resourceService->frameSize(), m_resourceService->portraitSize());
// else
// emit device->wheelEvent(&wheelEvent, m_resourceService->frameSize(), m_resourceService->landscapeSize());
}
}
4 changes: 2 additions & 2 deletions src/cpp/imagePageTool/scrcpy/ui/util/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
#define COMMON_PUSHFILE_DEF "/sdcard/"

#define COMMON_SERVER_VERSION_KEY "ServerVersion"
#define COMMON_SERVER_VERSION_DEF "1.24"
#define COMMON_SERVER_VERSION_DEF "3.0.2"

#define COMMON_SERVER_PATH_KEY "ServerPath"
#define COMMON_SERVER_PATH_DEF "/data/local/tmp/scrcpy-server.jar"
Expand Down Expand Up @@ -259,7 +259,7 @@ void Config::setRecordOutPath(const QString &recordOutPath)
}
QString Config::getRecordOutPath() const
{
return m_globalSetting->readConfig(GROUP_SCRCPY, COMMON_RECORD_KEY, QDir::homePath()).toString();
return m_globalSetting->readConfig(GROUP_SCRCPY, COMMON_RECORD_KEY, QDir::homePath()).toString() + "/Documents";
}

int Config::getDesktopOpenGL() {
Expand Down
28 changes: 28 additions & 0 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <QElapsedTimer>
#include <QStyleFactory>
#include <QQuickStyle>
#include <QQuickWindow>

#include "cpp/adb/connectmanager.h"
#include "cpp/infoPageTool/infopagetool.h"
Expand All @@ -17,6 +18,28 @@
#include "cpp/settingPageTools/settingPageTools.h"
#include "cpp/utils/notificationcontroller.h"

bool checkADB() {
QProcess process;
if (QSysInfo::productType() == "windows") {
process.start("where", {"adb"});
} else {
process.start("which", {"adb"});
}
process.waitForFinished();
QString output = process.readAll().simplified();

if (!output.isEmpty() && QFile::exists(output)) {
qInfo() << "find adb: " << output;

qputenv("QTSCRCPY_ADB_PATH", output.toLocal8Bit());

return true;
}

qWarning() << "can not fount adb!";
return false;
}

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Expand All @@ -26,6 +49,10 @@ int main(int argc, char *argv[])
qunsetenv("https_proxy");
#endif

if (!checkADB()) {
return 0;
}

QApplication::setStyle(QStyleFactory::create("fusion")); //应用Qt原生样式
QQuickStyle::setStyle("Fusion");
QElapsedTimer loaderTimer;
Expand Down Expand Up @@ -69,6 +96,7 @@ int main(int argc, char *argv[])
qmlRegisterSingletonInstance("NotificationController", 1, 0, "NotificationController", NotificationController::instance());
qInfo() << "load8" << loaderTimer.elapsed();

QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL);

QQmlApplicationEngine engine;
const QUrl url("qrc:/qml/Main.qml");
Expand Down
Loading

0 comments on commit dd2be35

Please sign in to comment.