From d7e9b7809f364f30ce33954af0aacdfa4b90eae4 Mon Sep 17 00:00:00 2001 From: rankun Date: Wed, 15 Jan 2020 19:52:31 +0800 Subject: [PATCH] feat: sync scrcpy --- QtScrcpy/QtScrcpy.pro | 2 +- QtScrcpy/device/recorder/recorder.cpp | 80 ++++++++++++++++++++------ QtScrcpy/device/recorder/recorder.h | 5 ++ QtScrcpy/device/server/server.cpp | 9 +-- QtScrcpy/main.cpp | 11 +++- README.md | 4 +- README_zh.md | 4 +- docs/TODO.md | 10 +--- third_party/scrcpy-server | Bin 0 -> 26142 bytes 9 files changed, 86 insertions(+), 39 deletions(-) create mode 100644 third_party/scrcpy-server diff --git a/QtScrcpy/QtScrcpy.pro b/QtScrcpy/QtScrcpy.pro index 41e46bc..8ac2b36 100644 --- a/QtScrcpy/QtScrcpy.pro +++ b/QtScrcpy/QtScrcpy.pro @@ -140,7 +140,7 @@ macos { -L$$PWD/../third_party/ffmpeg/lib -lswscale.5 # mac bundle file - APP_SCRCPY_SERVER.files = $$files($$PWD/../third_party/scrcpy-server.jar) + APP_SCRCPY_SERVER.files = $$files($$PWD/../third_party/scrcpy-server) APP_SCRCPY_SERVER.path = Contents/MacOS QMAKE_BUNDLE_DATA += APP_SCRCPY_SERVER diff --git a/QtScrcpy/device/recorder/recorder.cpp b/QtScrcpy/device/recorder/recorder.cpp index f37d19f..b418810 100644 --- a/QtScrcpy/device/recorder/recorder.cpp +++ b/QtScrcpy/device/recorder/recorder.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "compat.h" #include "recorder.h" @@ -24,6 +25,10 @@ Recorder::RecordPacket* Recorder::packetNew(const AVPacket *packet) { if (!rec) { return Q_NULLPTR; } + + // av_packet_ref() does not initialize all fields in old FFmpeg versions + av_init_packet(&rec->packet); + if (av_packet_ref(&rec->packet, packet)) { delete rec; return Q_NULLPTR; @@ -121,6 +126,10 @@ bool Recorder::open(const AVCodec* inputCodec) m_formatCtx->oformat = (AVOutputFormat*)format; + QString comment = "Recorded by QtScrcpy " + QCoreApplication::applicationVersion(); + av_dict_set(&m_formatCtx->metadata, "comment", + comment.toUtf8(), 0); + AVStream* outStream = avformat_new_stream(m_formatCtx, inputCodec); if (!outStream) { avformat_free_context(m_formatCtx); @@ -152,7 +161,7 @@ bool Recorder::open(const AVCodec* inputCodec) avformat_free_context(m_formatCtx); m_formatCtx = Q_NULLPTR; return false; - } + } return true; } @@ -160,11 +169,17 @@ bool Recorder::open(const AVCodec* inputCodec) void Recorder::close() { if (Q_NULLPTR != m_formatCtx) { - int ret = av_write_trailer(m_formatCtx); - if (ret < 0) { - qCritical(QString("Failed to write trailer to %1").arg(m_fileName).toUtf8().toStdString().c_str()); + if (m_headerWritten) { + int ret = av_write_trailer(m_formatCtx); + if (ret < 0) { + qCritical(QString("Failed to write trailer to %1").arg(m_fileName).toUtf8().toStdString().c_str()); + m_failed = true; + } else { + qInfo(QString("success record %1").arg(m_fileName).toStdString().c_str()); + } } else { - qInfo(QString("success record %1").arg(m_fileName).toStdString().c_str()); + // the recorded file is empty + m_failed = true; } avio_close(m_formatCtx->pb); avformat_free_context(m_formatCtx); @@ -274,23 +289,53 @@ Recorder::RecorderFormat Recorder::guessRecordFormat(const QString &fileName) void Recorder::run() { for (;;) { - QMutexLocker locker(&m_mutex); - while (!m_stopped && queueIsEmpty(&m_queue)) { - m_recvDataCond.wait(&m_mutex); + RecordPacket *rec = Q_NULLPTR; + { + QMutexLocker locker(&m_mutex); + while (!m_stopped && queueIsEmpty(&m_queue)) { + m_recvDataCond.wait(&m_mutex); + } + + // if stopped is set, continue to process the remaining events (to + // finish the recording) before actually stopping + if (m_stopped && queueIsEmpty(&m_queue)) { + RecordPacket* last = m_previous; + if (last) { + // assign an arbitrary duration to the last packet + last->packet.duration = 100000; + bool ok = write(&last->packet); + if (!ok) { + // failing to write the last frame is not very serious, no + // future frame may depend on it, so the resulting file + // will still be valid + qWarning("Could not record last packet"); + } + packetDelete(last); + } + break; + } + + rec = queueTake(&m_queue); } - // if stopped is set, continue to process the remaining events (to - // finish the recording) before actually stopping - if (m_stopped && queueIsEmpty(&m_queue)) { - break; - } + // recorder->previous is only written from this thread, no need to lock + RecordPacket* previous = m_previous; + m_previous = rec; - RecordPacket *rec = queueTake(&m_queue); + if (!previous) { + // we just received the first packet + continue; + } - //mutex_unlock(recorder->mutex); + // config packets have no PTS, we must ignore them + if (rec->packet.pts != AV_NOPTS_VALUE + && previous->packet.pts != AV_NOPTS_VALUE) { + // we now know the duration of the previous packet + previous->packet.duration = rec->packet.pts - previous->packet.pts; + } - bool ok = write(&rec->packet); - packetDelete(rec); + bool ok = write(&previous->packet); + packetDelete(previous); if (!ok) { qCritical("Could not record packet"); @@ -300,7 +345,6 @@ void Recorder::run() { queueClear(&m_queue); break; } - } qDebug("Recorder thread ended"); diff --git a/QtScrcpy/device/recorder/recorder.h b/QtScrcpy/device/recorder/recorder.h index 35927cd..da9695c 100644 --- a/QtScrcpy/device/recorder/recorder.h +++ b/QtScrcpy/device/recorder/recorder.h @@ -73,6 +73,11 @@ private: bool m_stopped = false; // set on recorder_stop() by the stream reader bool m_failed = false; // set on packet write failure RecorderQueue m_queue; + // we can write a packet only once we received the next one so that we can + // set its duration (next_pts - current_pts) + // "previous" is only accessed from the recorder thread, so it does not + // need to be protected by the mutex + RecordPacket* m_previous = Q_NULLPTR; }; #endif // RECORDER_H diff --git a/QtScrcpy/device/server/server.cpp b/QtScrcpy/device/server/server.cpp index a4f3d96..f60da81 100644 --- a/QtScrcpy/device/server/server.cpp +++ b/QtScrcpy/device/server/server.cpp @@ -56,7 +56,7 @@ const QString& Server::getServerPath() m_serverPath = QString::fromLocal8Bit(qgetenv("QTSCRCPY_SERVER_PATH")); QFileInfo fileInfo(m_serverPath); if (m_serverPath.isEmpty() || !fileInfo.isFile()) { - m_serverPath = QCoreApplication::applicationDirPath() + "/scrcpy-server.jar"; + m_serverPath = QCoreApplication::applicationDirPath() + "/scrcpy-server"; } } return m_serverPath; @@ -129,10 +129,7 @@ bool Server::execute() args << "app_process"; args << "/"; // unused; args << "com.genymobile.scrcpy.Server"; - // version - QStringList versionList = QCoreApplication::applicationVersion().split("."); - QString version = versionList[0] + "." + versionList[1] + "." + versionList[2]; - args << version; + args << QCoreApplication::applicationVersion(); args << QString::number(m_params.maxSize); args << QString::number(m_params.bitRate); args << QString::number(m_params.maxFps); @@ -145,7 +142,7 @@ bool Server::execute() args << "true"; // always send frame meta (packet boundaries + timestamp) args << (m_params.control ? "true" : "false"); - // adb -s P7C0218510000537 shell CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process / com.genymobile.scrcpy.Server 0 8000000 false + // adb -s P7C0218510000537 shell CLASSPATH=/data/local/tmp/scrcpy-server app_process / com.genymobile.scrcpy.Server 0 8000000 false // mark: crop input format: "width:height:x:y" or - for no crop, for example: "100:200:0:0" // 这条adb命令是阻塞运行的,m_serverProcess进程不会退出了 m_serverProcess.execute(m_params.serial, args); diff --git a/QtScrcpy/main.cpp b/QtScrcpy/main.cpp index d123e4e..e0182a9 100644 --- a/QtScrcpy/main.cpp +++ b/QtScrcpy/main.cpp @@ -30,6 +30,11 @@ int main(int argc, char *argv[]) qDebug() << a.applicationVersion(); qDebug() << a.applicationName(); + //update version + QStringList versionList = QCoreApplication::applicationVersion().split("."); + QString version = versionList[0] + "." + versionList[1] + "." + versionList[2]; + a.setApplicationVersion(version); + installTranslator(); #if defined(Q_OS_WIN32) || defined(Q_OS_OSX) MouseTap::getInstance()->initMouseEventTap(); @@ -37,13 +42,13 @@ int main(int argc, char *argv[]) #ifdef Q_OS_WIN32 qputenv("QTSCRCPY_ADB_PATH", "../../../../third_party/adb/win/adb.exe"); - qputenv("QTSCRCPY_SERVER_PATH", "../../../../third_party/scrcpy-server.jar"); + qputenv("QTSCRCPY_SERVER_PATH", "../../../../third_party/scrcpy-server"); qputenv("QTSCRCPY_KEYMAP_PATH", "../../../../keymap"); #endif #ifdef Q_OS_LINUX qputenv("QTSCRCPY_ADB_PATH", "../../../third_party/adb/linux/adb"); - qputenv("QTSCRCPY_SERVER_PATH", "../../../third_party/scrcpy-server.jar"); + qputenv("QTSCRCPY_SERVER_PATH", "../../../third_party/scrcpy-server"); #endif //加载样式表 @@ -59,6 +64,8 @@ int main(int argc, char *argv[]) g_mainDlg = new Dialog; g_mainDlg->show(); + qInfo(QString("QtScrcpy %1 ").arg(QCoreApplication::applicationVersion()).toUtf8()); + int ret = a.exec(); #if defined(Q_OS_WIN32) || defined(Q_OS_OSX) diff --git a/README.md b/README.md index c45019e..b3e7647 100644 --- a/README.md +++ b/README.md @@ -174,11 +174,11 @@ Try to provide all the dependencies and make it easy to compile. 3. Open the project root directory all.pro with QtCreator 4. Compile and run -### Android (If you do not need to modify the requirements, you can use the built-in scrcpy-server.jar directly) +### Android (If you do not need to modify the requirements, you can use the built-in scrcpy-server directly) 1. Set up an Android development environment on the target platform 2. Open the server project in the project root directory using Android Studio 3. Build it -4. After compiling apk, rename it to scrcpy-server.jar and replace third_party/scrcpy-server.jar. +4. After compiling apk, rename it to scrcpy-server and replace third_party/scrcpy-server ## Licence Since it is based on scrcpy, respect its Licence diff --git a/README_zh.md b/README_zh.md index ff156dc..dcaaae2 100644 --- a/README_zh.md +++ b/README_zh.md @@ -182,12 +182,12 @@ Mac OS平台,你可以直接使用我编译好的可执行程序: 3. 使用QtCreator打开项目根目录all.pro 4. 编译,运行即可 -### Android端 (没有修改需求的话直接使用自带的scrcpy-server.jar即可) +### Android端 (没有修改需求的话直接使用自带的scrcpy-server即可) 1. 目标平台上搭建Android开发环境 2. 使用Android Studio打开项目根目录中的server项目 3. 第一次打开如果你没有对应版本的gradle会提示找不到gradle,是否升级gradle并创建,选择取消,取消后会弹出选择已有gradle的位置,同样取消即可(会自动下载) 4. 按需编辑代码即可,当然也可以不编辑 -4. 编译出apk以后改名为scrcpy-server.jar并替换third_party/scrcpy-server.jar即可 +4. 编译出apk以后改名为scrcpy-server并替换third_party/scrcpy-server即可 ## Licence 由于是复刻的scrcpy,尊重它的Licence diff --git a/docs/TODO.md b/docs/TODO.md index 282a69b..1dbda13 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -1,20 +1,15 @@ -最后同步scrcpy b91ecf52256da73f5c8dca04fb82c13ec826cbd7 +最后同步scrcpy 31bd95022bc525be42ca273d59a3211d964d278b # TODO ## 低优先级 - 中文输入(server需要改为apk,作为一个输入法,暂不实现)(或者有其他方式案件注入方式,例如搜狗手机输入法可以监听当前注入?) -- 鼠标事件相关系列 b35733edb6df2a00b6af9b1c98627d344c377963 - [跳过帧改为动态配置,而不是静态编译](https://github.com/Genymobile/scrcpy/commit/ebccb9f6cc111e8acfbe10d656cac5c1f1b744a0) - [单独线程统计帧率](https://github.com/Genymobile/scrcpy/commit/e2a272bf99ecf48fcb050177113f903b3fb323c4) - ui提供show touch设置 -- 隐藏手机皮肤开关 ## 中优先级 - [截屏保存为jpg](https://blog.csdn.net/m0_37684310/article/details/77950390) -- 版本号升级优化 -- linux打包以及版本号 - 自动打包脚本 -- 按键映射可配置 - 脚本 - 群控 - 配置文件 @@ -24,10 +19,9 @@ - 分辨率码率可自定义 ## 高优先级 -- 同步延迟优化 +- linux打包以及版本号 # BUG -1. 魅族手机提示cant open video stream,解决方法 https://dim.red/2019/03/03/scrcpy_usage/ # mark [ffmpeg编译参数详解](https://www.cnblogs.com/wainiwann/p/4204230.html) diff --git a/third_party/scrcpy-server b/third_party/scrcpy-server new file mode 100644 index 0000000000000000000000000000000000000000..640d0cfb10144ccad9cd78a16c9767e2e00a182f GIT binary patch literal 26142 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 L_ZHLiAM5`Bqjp!* literal 0 HcmV?d00001