mirror of
https://github.com/viarotel-org/escrcpy.git
synced 2026-06-08 02:44:02 +08:00
Deploying to docs from @ viarotel-org/escrcpy@d1c04cece7 🚀
This commit is contained in:
@@ -1 +1 @@
|
||||
import{R as p}from"./chunks/theme.CKuHDsHG.js";import{S as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as w,q as y,p as C,ac as P,ad as R,ae as b,af as S}from"./chunks/framework.DCs21iJA.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),E=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=w();return y(()=>{C(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&P(),R(),b(),n.setup&&n.setup(),()=>S(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(E)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
|
||||
import{R as p}from"./chunks/theme.DE0fjz23.js";import{S as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as w,q as y,p as C,ac as P,ad as R,ae as b,af as S}from"./chunks/framework.DCs21iJA.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),E=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=w();return y(()=>{C(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&P(),R(),b(),n.setup&&n.setup(),()=>S(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(E)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e as r,a,o as t,ag as o}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"Changelog","description":"","frontmatter":{},"headers":[],"relativePath":"changelog.md","filePath":"en/changelog.md","lastUpdated":1768410455000}'),i={name:"changelog.md"};function c(l,e,h,n,f,b){return t(),a("div",null,[...e[0]||(e[0]=[o("",693)])])}const d=r(i,[["render",c]]);export{m as __pageData,d as default};
|
||||
import{e as r,a,o as t,ag as o}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"Changelog","description":"","frontmatter":{},"headers":[],"relativePath":"changelog.md","filePath":"en/changelog.md","lastUpdated":1768410818000}'),i={name:"changelog.md"};function c(l,e,h,n,f,b){return t(),a("div",null,[...e[0]||(e[0]=[o("",693)])])}const d=r(i,[["render",c]]);export{m as __pageData,d as default};
|
||||
1
assets/chunks/@localSearchIndexroot.D2y-Z6zS.js
Normal file
1
assets/chunks/@localSearchIndexroot.D2y-Z6zS.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
assets/chunks/@localSearchIndexzhHans.BKvxOXIn.js
Normal file
1
assets/chunks/@localSearchIndexzhHans.BKvxOXIn.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e as l,a as n,o,h as t,J as e}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"en/contact.md","lastUpdated":1768410455000}'),r={name:"contact.md"};function s(c,a,i,d,m,u){return o(),n("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("Email: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("WeChat: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default};
|
||||
import{e as l,a as n,o,h as t,J as e}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"en/contact.md","lastUpdated":1768410818000}'),r={name:"contact.md"};function s(c,a,i,d,m,u){return o(),n("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("Email: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("WeChat: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as l,a as n,o,h as t,J as e}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"en/contact.md","lastUpdated":1768410455000}'),r={name:"contact.md"};function s(c,a,i,d,m,u){return o(),n("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("Email: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("WeChat: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default};
|
||||
import{e as l,a as n,o,h as t,J as e}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"en/contact.md","lastUpdated":1768410818000}'),r={name:"contact.md"};function s(c,a,i,d,m,u){return o(),n("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("Email: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("WeChat: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as t,a,o as r,ag as o}from"./chunks/framework.DCs21iJA.js";const _=JSON.parse('{"title":"Donate Project ♥️","description":"","frontmatter":{},"headers":[],"relativePath":"donate.md","filePath":"en/donate.md","lastUpdated":1768410455000}'),l={name:"donate.md"};function n(s,e,i,p,d,c){return r(),a("div",null,[...e[0]||(e[0]=[o('<h1 id="donate-project-♥️" tabindex="-1">Donate Project ♥️ <a class="header-anchor" href="#donate-project-♥️" aria-label="Permalink to "Donate Project ♥️""></a></h1><p>If this project has helped you, you can buy me a coffee to keep me energized and improving the project! 😛</p><div style="display:flex;margin-left:-1.5%;"><img src="https://cdn.jsdelivr.net/gh/viarotel/resources@latest/donate/viarotel-wepay.png" alt="viarotel-wepay" width="30%" style="flex:1;"><img src="https://cdn.jsdelivr.net/gh/viarotel/resources@latest/donate/viarotel-alipay.png" alt="viarotel-alipay" width="30%" style="flex:1;"><a href="https://www.paypal.com/paypalme/viarotel" target="_blank" rel="noopener noreferrer" width="30%" style="flex:1;"><img src="https://cdn.jsdelivr.net/gh/viarotel/resources@latest/donate/viarotel-paypal.png" alt="viarotel-paypal"></a></div>',3)])])}const f=t(l,[["render",n]]);export{_ as __pageData,f as default};
|
||||
import{e as t,a,o as r,ag as o}from"./chunks/framework.DCs21iJA.js";const _=JSON.parse('{"title":"Donate Project ♥️","description":"","frontmatter":{},"headers":[],"relativePath":"donate.md","filePath":"en/donate.md","lastUpdated":1768410818000}'),l={name:"donate.md"};function n(s,e,i,p,d,c){return r(),a("div",null,[...e[0]||(e[0]=[o('<h1 id="donate-project-♥️" tabindex="-1">Donate Project ♥️ <a class="header-anchor" href="#donate-project-♥️" aria-label="Permalink to "Donate Project ♥️""></a></h1><p>If this project has helped you, you can buy me a coffee to keep me energized and improving the project! 😛</p><div style="display:flex;margin-left:-1.5%;"><img src="https://cdn.jsdelivr.net/gh/viarotel/resources@latest/donate/viarotel-wepay.png" alt="viarotel-wepay" width="30%" style="flex:1;"><img src="https://cdn.jsdelivr.net/gh/viarotel/resources@latest/donate/viarotel-alipay.png" alt="viarotel-alipay" width="30%" style="flex:1;"><a href="https://www.paypal.com/paypalme/viarotel" target="_blank" rel="noopener noreferrer" width="30%" style="flex:1;"><img src="https://cdn.jsdelivr.net/gh/viarotel/resources@latest/donate/viarotel-paypal.png" alt="viarotel-paypal"></a></div>',3)])])}const f=t(l,[["render",n]]);export{_ as __pageData,f as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as t,a,o as r,ag as o}from"./chunks/framework.DCs21iJA.js";const _=JSON.parse('{"title":"Donate Project ♥️","description":"","frontmatter":{},"headers":[],"relativePath":"donate.md","filePath":"en/donate.md","lastUpdated":1768410455000}'),l={name:"donate.md"};function n(s,e,i,p,d,c){return r(),a("div",null,[...e[0]||(e[0]=[o("",3)])])}const f=t(l,[["render",n]]);export{_ as __pageData,f as default};
|
||||
import{e as t,a,o as r,ag as o}from"./chunks/framework.DCs21iJA.js";const _=JSON.parse('{"title":"Donate Project ♥️","description":"","frontmatter":{},"headers":[],"relativePath":"donate.md","filePath":"en/donate.md","lastUpdated":1768410818000}'),l={name:"donate.md"};function n(s,e,i,p,d,c){return r(),a("div",null,[...e[0]||(e[0]=[o("",3)])])}const f=t(l,[["render",n]]);export{_ as __pageData,f as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e as i,a,o as r,ag as o}from"./chunks/framework.DCs21iJA.js";const h=JSON.parse('{"title":"Guide","description":"","frontmatter":{"title":"Guide"},"headers":[],"relativePath":"guide/index.md","filePath":"en/guide/index.md","lastUpdated":1768410455000}'),t={name:"guide/index.md"};function n(l,e,s,c,d,p){return r(),a("div",null,[...e[0]||(e[0]=[o("",28)])])}const m=i(t,[["render",n]]);export{h as __pageData,m as default};
|
||||
import{e as i,a,o as r,ag as o}from"./chunks/framework.DCs21iJA.js";const h=JSON.parse('{"title":"Guide","description":"","frontmatter":{"title":"Guide"},"headers":[],"relativePath":"guide/index.md","filePath":"en/guide/index.md","lastUpdated":1768410818000}'),t={name:"guide/index.md"};function n(l,e,s,c,d,p){return r(),a("div",null,[...e[0]||(e[0]=[o("",28)])])}const m=i(t,[["render",n]]);export{h as __pageData,m as default};
|
||||
@@ -1 +1 @@
|
||||
import{e,a as l,o as t,ag as o}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"Milestones","description":"","frontmatter":{"title":"Milestones"},"headers":[],"relativePath":"guide/milestones.md","filePath":"en/guide/milestones.md","lastUpdated":1768410455000}'),n={name:"guide/milestones.md"};function r(a,i,s,d,c,u){return t(),l("div",null,[...i[0]||(i[0]=[o('<h1 id="milestones" tabindex="-1">Milestones <a class="header-anchor" href="#milestones" aria-label="Permalink to "Milestones""></a></h1><p>Priority from high to low:</p><ul><li>Improved logo ✅</li><li>Software update feature ✅</li><li>Record and save audio/video ✅</li><li>Device quick interaction control bar ✅</li><li>Custom Adb and Scrcpy dependencies ✅</li><li>Custom device names ✅</li><li>Export and import preferences ✅</li><li>Individual device configuration ✅</li><li>macOS and Linux support ✅</li><li>Internationalization ✅</li><li>Dark mode ✅</li><li>Reverse tethering (Gnirehtet) ✅</li><li>Camera mirroring ✅</li><li>Multi-screen collaboration ✅</li><li>File push, screen rotation, audio control ✅</li><li>Batch connect historical devices ✅</li><li>Built-in terminal ✅</li><li>Auto-execute mirroring ✅</li><li>Flexible mirroring launch ✅</li><li>Batch processing ✅</li><li>Scheduled tasks ✅</li><li>Graphical file manager ✅</li><li>Floating control bar ✅</li><li>Enhanced recording ✅</li><li>Start APP(Multi-threaded) ✅</li><li>Main window edge hidden ✅</li><li>Group devices (by filtering remarks) ✅</li><li>Improved history device connection experience ✅</li><li>File management supports uploading directories ✅</li><li>Support adding open APP to desktop shortcut (Windows only) ✅</li><li>Support batch startup of devices ✅</li><li>Supports controlling the window layout of each device through visual orchestration tools ✅</li><li>Integrate different connection methods and configurations of the same device to improve user experience ✅</li><li>Enhanced device file manager ✅</li><li>Integrate AutoGLM to control your Android device using natural language without scripting ✅</li></ul>',3)])])}const h=e(n,[["render",r]]);export{m as __pageData,h as default};
|
||||
import{e,a as l,o as t,ag as o}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"Milestones","description":"","frontmatter":{"title":"Milestones"},"headers":[],"relativePath":"guide/milestones.md","filePath":"en/guide/milestones.md","lastUpdated":1768410818000}'),n={name:"guide/milestones.md"};function r(a,i,s,d,c,u){return t(),l("div",null,[...i[0]||(i[0]=[o('<h1 id="milestones" tabindex="-1">Milestones <a class="header-anchor" href="#milestones" aria-label="Permalink to "Milestones""></a></h1><p>Priority from high to low:</p><ul><li>Improved logo ✅</li><li>Software update feature ✅</li><li>Record and save audio/video ✅</li><li>Device quick interaction control bar ✅</li><li>Custom Adb and Scrcpy dependencies ✅</li><li>Custom device names ✅</li><li>Export and import preferences ✅</li><li>Individual device configuration ✅</li><li>macOS and Linux support ✅</li><li>Internationalization ✅</li><li>Dark mode ✅</li><li>Reverse tethering (Gnirehtet) ✅</li><li>Camera mirroring ✅</li><li>Multi-screen collaboration ✅</li><li>File push, screen rotation, audio control ✅</li><li>Batch connect historical devices ✅</li><li>Built-in terminal ✅</li><li>Auto-execute mirroring ✅</li><li>Flexible mirroring launch ✅</li><li>Batch processing ✅</li><li>Scheduled tasks ✅</li><li>Graphical file manager ✅</li><li>Floating control bar ✅</li><li>Enhanced recording ✅</li><li>Start APP(Multi-threaded) ✅</li><li>Main window edge hidden ✅</li><li>Group devices (by filtering remarks) ✅</li><li>Improved history device connection experience ✅</li><li>File management supports uploading directories ✅</li><li>Support adding open APP to desktop shortcut (Windows only) ✅</li><li>Support batch startup of devices ✅</li><li>Supports controlling the window layout of each device through visual orchestration tools ✅</li><li>Integrate different connection methods and configurations of the same device to improve user experience ✅</li><li>Enhanced device file manager ✅</li><li>Integrate AutoGLM to control your Android device using natural language without scripting ✅</li></ul>',3)])])}const h=e(n,[["render",r]]);export{m as __pageData,h as default};
|
||||
@@ -1 +1 @@
|
||||
import{e,a as l,o as t,ag as o}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"Milestones","description":"","frontmatter":{"title":"Milestones"},"headers":[],"relativePath":"guide/milestones.md","filePath":"en/guide/milestones.md","lastUpdated":1768410455000}'),n={name:"guide/milestones.md"};function r(a,i,s,d,c,u){return t(),l("div",null,[...i[0]||(i[0]=[o("",3)])])}const h=e(n,[["render",r]]);export{m as __pageData,h as default};
|
||||
import{e,a as l,o as t,ag as o}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"Milestones","description":"","frontmatter":{"title":"Milestones"},"headers":[],"relativePath":"guide/milestones.md","filePath":"en/guide/milestones.md","lastUpdated":1768410818000}'),n={name:"guide/milestones.md"};function r(a,i,s,d,c,u){return t(),l("div",null,[...i[0]||(i[0]=[o("",3)])])}const h=e(n,[["render",r]]);export{m as __pageData,h as default};
|
||||
@@ -1 +1 @@
|
||||
import{e,a,o as l,ag as t}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"Operation","description":"","frontmatter":{"title":"Operation"},"headers":[],"relativePath":"guide/operation.md","filePath":"en/guide/operation.md","lastUpdated":1768410455000}'),o={name:"guide/operation.md"};function r(n,i,c,d,s,h){return l(),a("div",null,[...i[0]||(i[0]=[t('<h1 id="device-operation" tabindex="-1">Device Operation <a class="header-anchor" href="#device-operation" aria-label="Permalink to "Device Operation""></a></h1><h2 id="batch-processing" tabindex="-1">Batch Processing <a class="header-anchor" href="#batch-processing" aria-label="Permalink to "Batch Processing""></a></h2><ul><li>Batch mirroring</li><li>Batch Interception Screen</li><li>Batch Installation Application</li><li>Batch File Management</li><li>Batch Execution Script</li><li>Batch Scheduled Task</li></ul><h2 id="control-model" tabindex="-1">Control Model <a class="header-anchor" href="#control-model" aria-label="Permalink to "Control Model""></a></h2><ul><li>Mirror</li><li>Recording</li><li>Recording Camera</li><li>Recording Audio</li><li>Camera</li><li>Custom</li><li>OTG</li></ul><h2 id="device-interaction-bar" tabindex="-1">Device Interaction Bar <a class="header-anchor" href="#device-interaction-bar" aria-label="Permalink to "Device Interaction Bar""></a></h2><ul><li>Automatic Control (AutoGLM)</li><li>Switch</li><li>Home</li><li>Back</li><li>Start APP (Mirror Group)</li><li>Turn off screen (experimental)</li><li>Notification</li><li>Power</li><li>Rotation</li><li>Volume</li><li>Screenshot</li><li>Reboot</li><li>Install APP</li><li>File Manager</li><li>Execution Script</li><li>Scheduled Task</li><li>Gnirehtet</li></ul>',7)])])}const m=e(o,[["render",r]]);export{p as __pageData,m as default};
|
||||
import{e,a,o as l,ag as t}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"Operation","description":"","frontmatter":{"title":"Operation"},"headers":[],"relativePath":"guide/operation.md","filePath":"en/guide/operation.md","lastUpdated":1768410818000}'),o={name:"guide/operation.md"};function r(n,i,c,d,s,h){return l(),a("div",null,[...i[0]||(i[0]=[t('<h1 id="device-operation" tabindex="-1">Device Operation <a class="header-anchor" href="#device-operation" aria-label="Permalink to "Device Operation""></a></h1><h2 id="batch-processing" tabindex="-1">Batch Processing <a class="header-anchor" href="#batch-processing" aria-label="Permalink to "Batch Processing""></a></h2><ul><li>Batch mirroring</li><li>Batch Interception Screen</li><li>Batch Installation Application</li><li>Batch File Management</li><li>Batch Execution Script</li><li>Batch Scheduled Task</li></ul><h2 id="control-model" tabindex="-1">Control Model <a class="header-anchor" href="#control-model" aria-label="Permalink to "Control Model""></a></h2><ul><li>Mirror</li><li>Recording</li><li>Recording Camera</li><li>Recording Audio</li><li>Camera</li><li>Custom</li><li>OTG</li></ul><h2 id="device-interaction-bar" tabindex="-1">Device Interaction Bar <a class="header-anchor" href="#device-interaction-bar" aria-label="Permalink to "Device Interaction Bar""></a></h2><ul><li>Automatic Control (AutoGLM)</li><li>Switch</li><li>Home</li><li>Back</li><li>Start APP (Mirror Group)</li><li>Turn off screen (experimental)</li><li>Notification</li><li>Power</li><li>Rotation</li><li>Volume</li><li>Screenshot</li><li>Reboot</li><li>Install APP</li><li>File Manager</li><li>Execution Script</li><li>Scheduled Task</li><li>Gnirehtet</li></ul>',7)])])}const m=e(o,[["render",r]]);export{p as __pageData,m as default};
|
||||
@@ -1 +1 @@
|
||||
import{e,a,o as l,ag as t}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"Operation","description":"","frontmatter":{"title":"Operation"},"headers":[],"relativePath":"guide/operation.md","filePath":"en/guide/operation.md","lastUpdated":1768410455000}'),o={name:"guide/operation.md"};function r(n,i,c,d,s,h){return l(),a("div",null,[...i[0]||(i[0]=[t("",7)])])}const m=e(o,[["render",r]]);export{p as __pageData,m as default};
|
||||
import{e,a,o as l,ag as t}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"Operation","description":"","frontmatter":{"title":"Operation"},"headers":[],"relativePath":"guide/operation.md","filePath":"en/guide/operation.md","lastUpdated":1768410818000}'),o={name:"guide/operation.md"};function r(n,i,c,d,s,h){return l(),a("div",null,[...i[0]||(i[0]=[t("",7)])])}const m=e(o,[["render",r]]);export{p as __pageData,m as default};
|
||||
@@ -1 +1 @@
|
||||
import{e,a as l,o,ag as r}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"Preferences","description":"","frontmatter":{"title":"Preferences"},"headers":[],"relativePath":"guide/preferences.md","filePath":"en/guide/preferences.md","lastUpdated":1768410455000}'),a={name:"guide/preferences.md"};function t(n,i,d,c,u,s){return o(),l("div",null,[...i[0]||(i[0]=[r('<h1 id="preferences" tabindex="-1">Preferences <a class="header-anchor" href="#preferences" aria-label="Permalink to "Preferences""></a></h1><p>Continuously improving. Currently supports the following common configurations</p><h2 id="general" tabindex="-1">General <a class="header-anchor" href="#general" aria-label="Permalink to "General""></a></h2><ul><li>Theme</li><li>Language</li><li>File storage path</li><li>Adb path</li><li>Scrcpy path</li><li>Gnirehtet path</li><li>Scrcpy parameters</li><li>Gnirehtet parameters</li><li>Auto-connect device</li><li>Auto-execute mirroring</li><li>Gnirehtet fix</li><li>Debug</li><li>Floating control bar</li><li>Use system terminal</li><li>Preferred terminal</li><li>Concurrency limit</li></ul><h2 id="video-control" tabindex="-1">Video Control <a class="header-anchor" href="#video-control" aria-label="Permalink to "Video Control""></a></h2><ul><li>Disable video forwarding</li><li>Maximum size</li><li>Video bitrate</li><li>Refresh rate</li><li>Video codec</li><li>Display orientation</li><li>Rotation angle</li><li>Screen cropping</li><li>Monitor</li><li>Video buffer</li><li>Receiver (v4l2) buffer</li></ul><h2 id="device-control" tabindex="-1">Device Control <a class="header-anchor" href="#device-control" aria-label="Permalink to "Device Control""></a></h2><ul><li>Show touch points</li><li>Keep awake</li><li>Turn off screen during control</li><li>Turn off screen after control</li><li>Disable auto screen on during control</li><li>Simulate auxiliary display</li></ul><h2 id="window-control" tabindex="-1">Window Control <a class="header-anchor" href="#window-control" aria-label="Permalink to "Window Control""></a></h2><ul><li>Window width</li><li>Window height</li><li>Window X-coordinate</li><li>Window Y-coordinate</li><li>Borderless mode</li><li>Fullscreen mode</li><li>Always on top</li><li>Disable screensaver</li></ul><h2 id="audio-control" tabindex="-1">Audio Control <a class="header-anchor" href="#audio-control" aria-label="Permalink to "Audio Control""></a></h2><ul><li>Disable audio forwarding</li><li>Keep device audio</li><li>Audio source</li><li>Audio codec</li><li>Audio bitrate</li><li>Audio buffer</li><li>Audio output buffer</li></ul><h2 id="audio-video-recording" tabindex="-1">Audio/Video Recording <a class="header-anchor" href="#audio-video-recording" aria-label="Permalink to "Audio/Video Recording""></a></h2><ul><li>Record video format</li><li>Record video orientation</li><li>Recording duration</li><li>Disable video playback</li><li>Disable audio playback</li></ul><h2 id="input-control" tabindex="-1">Input Control <a class="header-anchor" href="#input-control" aria-label="Permalink to "Input Control""></a></h2><ul><li>Mouse mode</li><li>Mouse binding</li><li>Keyboard mode</li><li>Keyboard injection method</li><li>Gamepad</li></ul><h2 id="camera-control" tabindex="-1">Camera Control <a class="header-anchor" href="#camera-control" aria-label="Permalink to "Camera Control""></a></h2><ul><li>Camera source</li><li>Camera size</li><li>Camera ratio</li><li>Camera frame rate</li></ul>',18)])])}const m=e(a,[["render",t]]);export{f as __pageData,m as default};
|
||||
import{e,a as l,o,ag as r}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"Preferences","description":"","frontmatter":{"title":"Preferences"},"headers":[],"relativePath":"guide/preferences.md","filePath":"en/guide/preferences.md","lastUpdated":1768410818000}'),a={name:"guide/preferences.md"};function t(n,i,d,c,u,s){return o(),l("div",null,[...i[0]||(i[0]=[r('<h1 id="preferences" tabindex="-1">Preferences <a class="header-anchor" href="#preferences" aria-label="Permalink to "Preferences""></a></h1><p>Continuously improving. Currently supports the following common configurations</p><h2 id="general" tabindex="-1">General <a class="header-anchor" href="#general" aria-label="Permalink to "General""></a></h2><ul><li>Theme</li><li>Language</li><li>File storage path</li><li>Adb path</li><li>Scrcpy path</li><li>Gnirehtet path</li><li>Scrcpy parameters</li><li>Gnirehtet parameters</li><li>Auto-connect device</li><li>Auto-execute mirroring</li><li>Gnirehtet fix</li><li>Debug</li><li>Floating control bar</li><li>Use system terminal</li><li>Preferred terminal</li><li>Concurrency limit</li></ul><h2 id="video-control" tabindex="-1">Video Control <a class="header-anchor" href="#video-control" aria-label="Permalink to "Video Control""></a></h2><ul><li>Disable video forwarding</li><li>Maximum size</li><li>Video bitrate</li><li>Refresh rate</li><li>Video codec</li><li>Display orientation</li><li>Rotation angle</li><li>Screen cropping</li><li>Monitor</li><li>Video buffer</li><li>Receiver (v4l2) buffer</li></ul><h2 id="device-control" tabindex="-1">Device Control <a class="header-anchor" href="#device-control" aria-label="Permalink to "Device Control""></a></h2><ul><li>Show touch points</li><li>Keep awake</li><li>Turn off screen during control</li><li>Turn off screen after control</li><li>Disable auto screen on during control</li><li>Simulate auxiliary display</li></ul><h2 id="window-control" tabindex="-1">Window Control <a class="header-anchor" href="#window-control" aria-label="Permalink to "Window Control""></a></h2><ul><li>Window width</li><li>Window height</li><li>Window X-coordinate</li><li>Window Y-coordinate</li><li>Borderless mode</li><li>Fullscreen mode</li><li>Always on top</li><li>Disable screensaver</li></ul><h2 id="audio-control" tabindex="-1">Audio Control <a class="header-anchor" href="#audio-control" aria-label="Permalink to "Audio Control""></a></h2><ul><li>Disable audio forwarding</li><li>Keep device audio</li><li>Audio source</li><li>Audio codec</li><li>Audio bitrate</li><li>Audio buffer</li><li>Audio output buffer</li></ul><h2 id="audio-video-recording" tabindex="-1">Audio/Video Recording <a class="header-anchor" href="#audio-video-recording" aria-label="Permalink to "Audio/Video Recording""></a></h2><ul><li>Record video format</li><li>Record video orientation</li><li>Recording duration</li><li>Disable video playback</li><li>Disable audio playback</li></ul><h2 id="input-control" tabindex="-1">Input Control <a class="header-anchor" href="#input-control" aria-label="Permalink to "Input Control""></a></h2><ul><li>Mouse mode</li><li>Mouse binding</li><li>Keyboard mode</li><li>Keyboard injection method</li><li>Gamepad</li></ul><h2 id="camera-control" tabindex="-1">Camera Control <a class="header-anchor" href="#camera-control" aria-label="Permalink to "Camera Control""></a></h2><ul><li>Camera source</li><li>Camera size</li><li>Camera ratio</li><li>Camera frame rate</li></ul>',18)])])}const m=e(a,[["render",t]]);export{f as __pageData,m as default};
|
||||
@@ -1 +1 @@
|
||||
import{e,a as l,o,ag as r}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"Preferences","description":"","frontmatter":{"title":"Preferences"},"headers":[],"relativePath":"guide/preferences.md","filePath":"en/guide/preferences.md","lastUpdated":1768410455000}'),a={name:"guide/preferences.md"};function t(n,i,d,c,u,s){return o(),l("div",null,[...i[0]||(i[0]=[r("",18)])])}const m=e(a,[["render",t]]);export{f as __pageData,m as default};
|
||||
import{e,a as l,o,ag as r}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"Preferences","description":"","frontmatter":{"title":"Preferences"},"headers":[],"relativePath":"guide/preferences.md","filePath":"en/guide/preferences.md","lastUpdated":1768410818000}'),a={name:"guide/preferences.md"};function t(n,i,d,c,u,s){return o(),l("div",null,[...i[0]||(i[0]=[r("",18)])])}const m=e(a,[["render",t]]);export{f as __pageData,m as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e as a,a as t,o as n,ag as r}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"Quick Start","description":"","frontmatter":{"title":"Quick Start"},"headers":[],"relativePath":"guide/started.md","filePath":"en/guide/started.md","lastUpdated":1768410455000}'),o={name:"guide/started.md"};function i(l,e,c,s,d,h){return n(),t("div",null,[...e[0]||(e[0]=[r("",23)])])}const g=a(o,[["render",i]]);export{p as __pageData,g as default};
|
||||
import{e as a,a as t,o as n,ag as r}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"Quick Start","description":"","frontmatter":{"title":"Quick Start"},"headers":[],"relativePath":"guide/started.md","filePath":"en/guide/started.md","lastUpdated":1768410818000}'),o={name:"guide/started.md"};function i(l,e,c,s,d,h){return n(),t("div",null,[...e[0]||(e[0]=[r("",23)])])}const g=a(o,[["render",i]]);export{p as __pageData,g as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e as i,a as o,o as n,ag as a}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"Window Arrangement","description":"","frontmatter":{"title":"Window Arrangement"},"headers":[],"relativePath":"guide/window-arrangement.md","filePath":"en/guide/window-arrangement.md","lastUpdated":1768410455000}'),t={name:"guide/window-arrangement.md"};function r(l,e,d,s,c,u){return n(),o("div",null,[...e[0]||(e[0]=[a("",55)])])}const h=i(t,[["render",r]]);export{m as __pageData,h as default};
|
||||
import{e as i,a as o,o as n,ag as a}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"Window Arrangement","description":"","frontmatter":{"title":"Window Arrangement"},"headers":[],"relativePath":"guide/window-arrangement.md","filePath":"en/guide/window-arrangement.md","lastUpdated":1768410818000}'),t={name:"guide/window-arrangement.md"};function r(l,e,d,s,c,u){return n(),o("div",null,[...e[0]||(e[0]=[a("",55)])])}const h=i(t,[["render",r]]);export{m as __pageData,h as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e as t,a as o,o as a,ag as i}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"Escrcpy","description":"","frontmatter":{"title":"Escrcpy"},"headers":[],"relativePath":"help/escrcpy.md","filePath":"en/help/escrcpy.md","lastUpdated":1768410455000}'),n={name:"help/escrcpy.md"};function r(s,e,c,l,d,h){return a(),o("div",null,[...e[0]||(e[0]=[i("",44)])])}const g=t(n,[["render",r]]);export{p as __pageData,g as default};
|
||||
import{e as t,a as o,o as a,ag as i}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"Escrcpy","description":"","frontmatter":{"title":"Escrcpy"},"headers":[],"relativePath":"help/escrcpy.md","filePath":"en/help/escrcpy.md","lastUpdated":1768410818000}'),n={name:"help/escrcpy.md"};function r(s,e,c,l,d,h){return a(),o("div",null,[...e[0]||(e[0]=[i("",44)])])}const g=t(n,[["render",r]]);export{p as __pageData,g as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as t,a as l,o as a,h as e,J as n}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"Help","description":"","frontmatter":{"title":"Help"},"headers":[],"relativePath":"help/index.md","filePath":"en/help/index.md","lastUpdated":1768410455000}'),s={name:"help/index.md"};function p(c,r,o,i,d,h){return a(),l("div",null,[...r[0]||(r[0]=[e("h1",{id:"help-center",tabindex:"-1"},[n("Help Center "),e("a",{class:"header-anchor",href:"#help-center","aria-label":'Permalink to "Help Center"'},"")],-1),e("p",null,"This section provides solutions to common problems for Escrcpy and Scrcpy users.",-1),e("ul",null,[e("li",null,[e("a",{href:"/help/escrcpy"},"Escrcpy")]),e("li",null,[e("a",{href:"/help/scrcpy"},"Scrcpy")])],-1)])])}const u=t(s,[["render",p]]);export{f as __pageData,u as default};
|
||||
import{e as t,a as l,o as a,h as e,J as n}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"Help","description":"","frontmatter":{"title":"Help"},"headers":[],"relativePath":"help/index.md","filePath":"en/help/index.md","lastUpdated":1768410818000}'),s={name:"help/index.md"};function p(c,r,o,i,d,h){return a(),l("div",null,[...r[0]||(r[0]=[e("h1",{id:"help-center",tabindex:"-1"},[n("Help Center "),e("a",{class:"header-anchor",href:"#help-center","aria-label":'Permalink to "Help Center"'},"")],-1),e("p",null,"This section provides solutions to common problems for Escrcpy and Scrcpy users.",-1),e("ul",null,[e("li",null,[e("a",{href:"/help/escrcpy"},"Escrcpy")]),e("li",null,[e("a",{href:"/help/scrcpy"},"Scrcpy")])],-1)])])}const u=t(s,[["render",p]]);export{f as __pageData,u as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as t,a as l,o as a,h as e,J as n}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"Help","description":"","frontmatter":{"title":"Help"},"headers":[],"relativePath":"help/index.md","filePath":"en/help/index.md","lastUpdated":1768410455000}'),s={name:"help/index.md"};function p(c,r,o,i,d,h){return a(),l("div",null,[...r[0]||(r[0]=[e("h1",{id:"help-center",tabindex:"-1"},[n("Help Center "),e("a",{class:"header-anchor",href:"#help-center","aria-label":'Permalink to "Help Center"'},"")],-1),e("p",null,"This section provides solutions to common problems for Escrcpy and Scrcpy users.",-1),e("ul",null,[e("li",null,[e("a",{href:"/help/escrcpy"},"Escrcpy")]),e("li",null,[e("a",{href:"/help/scrcpy"},"Scrcpy")])],-1)])])}const u=t(s,[["render",p]]);export{f as __pageData,u as default};
|
||||
import{e as t,a as l,o as a,h as e,J as n}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"Help","description":"","frontmatter":{"title":"Help"},"headers":[],"relativePath":"help/index.md","filePath":"en/help/index.md","lastUpdated":1768410818000}'),s={name:"help/index.md"};function p(c,r,o,i,d,h){return a(),l("div",null,[...r[0]||(r[0]=[e("h1",{id:"help-center",tabindex:"-1"},[n("Help Center "),e("a",{class:"header-anchor",href:"#help-center","aria-label":'Permalink to "Help Center"'},"")],-1),e("p",null,"This section provides solutions to common problems for Escrcpy and Scrcpy users.",-1),e("ul",null,[e("li",null,[e("a",{href:"/help/escrcpy"},"Escrcpy")]),e("li",null,[e("a",{href:"/help/scrcpy"},"Scrcpy")])],-1)])])}const u=t(s,[["render",p]]);export{f as __pageData,u as default};
|
||||
@@ -1,4 +1,4 @@
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const u=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"help/scrcpy.md","filePath":"en/help/scrcpy.md","lastUpdated":1768410455000}'),o={name:"help/scrcpy.md"};function n(r,e,c,d,l,h){return i(),s("div",null,[...e[0]||(e[0]=[t(`<h1 id="scrcpy" tabindex="-1">Scrcpy <a class="header-anchor" href="#scrcpy" aria-label="Permalink to "Scrcpy""></a></h1><p>Here are the common reported problems and their status.</p><p>If you encounter any error, the first step is to upgrade to the latest version.</p><h2 id="adb-and-usb-issues" tabindex="-1"><code>adb</code> and USB issues <a class="header-anchor" href="#adb-and-usb-issues" aria-label="Permalink to "\`adb\` and USB issues""></a></h2><p><code>scrcpy</code> execute <code>adb</code> commands to initialize the connection with the device. If <code>adb</code> fails, then scrcpy will not work.</p><p>This is typically not a bug in <em>scrcpy</em>, but a problem in your environment.</p><h3 id="adb-not-found" tabindex="-1"><code>adb</code> not found <a class="header-anchor" href="#adb-not-found" aria-label="Permalink to "\`adb\` not found""></a></h3><p>You need <code>adb</code> accessible from your <code>PATH</code>.</p><p>On Windows, the current directory is in your <code>PATH</code>, and <code>adb.exe</code> is included in the release, so it should work out-of-the-box.</p><h3 id="device-not-detected" tabindex="-1">Device not detected <a class="header-anchor" href="#device-not-detected" aria-label="Permalink to "Device not detected""></a></h3><blockquote><pre><code>ERROR: Could not find any ADB device
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const u=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"help/scrcpy.md","filePath":"en/help/scrcpy.md","lastUpdated":1768410818000}'),o={name:"help/scrcpy.md"};function n(r,e,c,d,l,h){return i(),s("div",null,[...e[0]||(e[0]=[t(`<h1 id="scrcpy" tabindex="-1">Scrcpy <a class="header-anchor" href="#scrcpy" aria-label="Permalink to "Scrcpy""></a></h1><p>Here are the common reported problems and their status.</p><p>If you encounter any error, the first step is to upgrade to the latest version.</p><h2 id="adb-and-usb-issues" tabindex="-1"><code>adb</code> and USB issues <a class="header-anchor" href="#adb-and-usb-issues" aria-label="Permalink to "\`adb\` and USB issues""></a></h2><p><code>scrcpy</code> execute <code>adb</code> commands to initialize the connection with the device. If <code>adb</code> fails, then scrcpy will not work.</p><p>This is typically not a bug in <em>scrcpy</em>, but a problem in your environment.</p><h3 id="adb-not-found" tabindex="-1"><code>adb</code> not found <a class="header-anchor" href="#adb-not-found" aria-label="Permalink to "\`adb\` not found""></a></h3><p>You need <code>adb</code> accessible from your <code>PATH</code>.</p><p>On Windows, the current directory is in your <code>PATH</code>, and <code>adb.exe</code> is included in the release, so it should work out-of-the-box.</p><h3 id="device-not-detected" tabindex="-1">Device not detected <a class="header-anchor" href="#device-not-detected" aria-label="Permalink to "Device not detected""></a></h3><blockquote><pre><code>ERROR: Could not find any ADB device
|
||||
</code></pre></blockquote><p>Check that you correctly enabled <a href="https://developer.android.com/studio/command-line/adb.html#Enabling" target="_blank" rel="noreferrer">adb debugging</a>.</p><p>Your device must be detected by <code>adb</code>:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>adb devices</span></span></code></pre></div><p>If your device is not detected, you may need some <a href="https://developer.android.com/studio/run/oem-usb.html" target="_blank" rel="noreferrer">drivers</a> (on Windows). There is a separate <a href="https://developer.android.com/studio/run/win-usb" target="_blank" rel="noreferrer">USB driver for Google devices</a>.</p><h3 id="device-unauthorized" tabindex="-1">Device unauthorized <a class="header-anchor" href="#device-unauthorized" aria-label="Permalink to "Device unauthorized""></a></h3><blockquote><pre><code>ERROR: Device is unauthorized:
|
||||
ERROR: --> (usb) 0123456789abcdef unauthorized
|
||||
ERROR: A popup should open on the device to request authorization.
|
||||
@@ -1 +1 @@
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const u=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"help/scrcpy.md","filePath":"en/help/scrcpy.md","lastUpdated":1768410455000}'),o={name:"help/scrcpy.md"};function n(r,e,c,d,l,h){return i(),s("div",null,[...e[0]||(e[0]=[t("",66)])])}const b=a(o,[["render",n]]);export{u as __pageData,b as default};
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const u=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"help/scrcpy.md","filePath":"en/help/scrcpy.md","lastUpdated":1768410818000}'),o={name:"help/scrcpy.md"};function n(r,e,c,d,l,h){return i(),s("div",null,[...e[0]||(e[0]=[t("",66)])])}const b=a(o,[["render",n]]);export{u as __pageData,b as default};
|
||||
@@ -1 +1 @@
|
||||
import{e,a as t,o as i}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Escrcpy","text":"Display and control your Android device graphically with scrcpy","tagline":"Powered by electron.","image":{"src":"/images/logo@1024x1024.png","alt":"Escrcpy"},"actions":[{"theme":"brand","text":"Get Started 👉","link":"/guide/started"},{"theme":"alt","text":"Help","link":"/help/escrcpy"},{"theme":"alt","text":"Github","link":"https://github.com/viarotel-org/escrcpy"}]},"features":[{"icon":"🤖","title":"Intelligent Control","details":"Natural-language commands powered by AutoGLM for smart control of Android devices"},{"icon":"🏃","title":"Automation & Efficiency","details":"Automated workflow execution with support for parallel operations across multiple devices"},{"icon":"🪟","title":"Multi-Device Management","details":"Visual window orchestration for centralized management of multiple devices"},{"icon":"📡","title":"Connectivity & Networking","details":"Wireless connections with Gnirehtet reverse tethering support"},{"icon":"⚡️","title":"Scrcpy Core","details":"High-performance, low-latency screen mirroring based on Scrcpy"}]},"headers":[],"relativePath":"index.md","filePath":"en/index.md","lastUpdated":1768410455000}'),o={name:"index.md"};function r(a,n,c,l,s,d){return i(),t("div")}const u=e(o,[["render",r]]);export{m as __pageData,u as default};
|
||||
import{e,a as t,o as i}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Escrcpy","text":"Display and control your Android device graphically with scrcpy","tagline":"Powered by electron.","image":{"src":"/images/logo@1024x1024.png","alt":"Escrcpy"},"actions":[{"theme":"brand","text":"Get Started 👉","link":"/guide/started"},{"theme":"alt","text":"Help","link":"/help/escrcpy"},{"theme":"alt","text":"Github","link":"https://github.com/viarotel-org/escrcpy"}]},"features":[{"icon":"🤖","title":"Intelligent Control","details":"Natural-language commands powered by AutoGLM for smart control of Android devices"},{"icon":"🏃","title":"Automation & Efficiency","details":"Automated workflow execution with support for parallel operations across multiple devices"},{"icon":"🪟","title":"Multi-Device Management","details":"Visual window orchestration for centralized management of multiple devices"},{"icon":"📡","title":"Connectivity & Networking","details":"Wireless connections with Gnirehtet reverse tethering support"},{"icon":"⚡️","title":"Scrcpy Core","details":"High-performance, low-latency screen mirroring based on Scrcpy"}]},"headers":[],"relativePath":"index.md","filePath":"en/index.md","lastUpdated":1768410818000}'),o={name:"index.md"};function r(a,n,c,l,s,d){return i(),t("div")}const u=e(o,[["render",r]]);export{m as __pageData,u as default};
|
||||
@@ -1 +1 @@
|
||||
import{e,a as t,o as i}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Escrcpy","text":"Display and control your Android device graphically with scrcpy","tagline":"Powered by electron.","image":{"src":"/images/logo@1024x1024.png","alt":"Escrcpy"},"actions":[{"theme":"brand","text":"Get Started 👉","link":"/guide/started"},{"theme":"alt","text":"Help","link":"/help/escrcpy"},{"theme":"alt","text":"Github","link":"https://github.com/viarotel-org/escrcpy"}]},"features":[{"icon":"🤖","title":"Intelligent Control","details":"Natural-language commands powered by AutoGLM for smart control of Android devices"},{"icon":"🏃","title":"Automation & Efficiency","details":"Automated workflow execution with support for parallel operations across multiple devices"},{"icon":"🪟","title":"Multi-Device Management","details":"Visual window orchestration for centralized management of multiple devices"},{"icon":"📡","title":"Connectivity & Networking","details":"Wireless connections with Gnirehtet reverse tethering support"},{"icon":"⚡️","title":"Scrcpy Core","details":"High-performance, low-latency screen mirroring based on Scrcpy"}]},"headers":[],"relativePath":"index.md","filePath":"en/index.md","lastUpdated":1768410455000}'),o={name:"index.md"};function r(a,n,c,l,s,d){return i(),t("div")}const u=e(o,[["render",r]]);export{m as __pageData,u as default};
|
||||
import{e,a as t,o as i}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Escrcpy","text":"Display and control your Android device graphically with scrcpy","tagline":"Powered by electron.","image":{"src":"/images/logo@1024x1024.png","alt":"Escrcpy"},"actions":[{"theme":"brand","text":"Get Started 👉","link":"/guide/started"},{"theme":"alt","text":"Help","link":"/help/escrcpy"},{"theme":"alt","text":"Github","link":"https://github.com/viarotel-org/escrcpy"}]},"features":[{"icon":"🤖","title":"Intelligent Control","details":"Natural-language commands powered by AutoGLM for smart control of Android devices"},{"icon":"🏃","title":"Automation & Efficiency","details":"Automated workflow execution with support for parallel operations across multiple devices"},{"icon":"🪟","title":"Multi-Device Management","details":"Visual window orchestration for centralized management of multiple devices"},{"icon":"📡","title":"Connectivity & Networking","details":"Wireless connections with Gnirehtet reverse tethering support"},{"icon":"⚡️","title":"Scrcpy Core","details":"High-performance, low-latency screen mirroring based on Scrcpy"}]},"headers":[],"relativePath":"index.md","filePath":"en/index.md","lastUpdated":1768410818000}'),o={name:"index.md"};function r(a,n,c,l,s,d){return i(),t("div")}const u=e(o,[["render",r]]);export{m as __pageData,u as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e as i,a as e,o as a,ag as t}from"./chunks/framework.DCs21iJA.js";const g=JSON.parse('{"title":"API","description":"","frontmatter":{"title":"API"},"headers":[],"relativePath":"reference/gnirehtet/api.md","filePath":"en/reference/gnirehtet/api.md","lastUpdated":1768410455000}'),n={name:"reference/gnirehtet/api.md"};function p(h,s,l,r,d,o){return a(),e("div",null,[...s[0]||(s[0]=[t("",98)])])}const k=i(n,[["render",p]]);export{g as __pageData,k as default};
|
||||
import{e as i,a as e,o as a,ag as t}from"./chunks/framework.DCs21iJA.js";const g=JSON.parse('{"title":"API","description":"","frontmatter":{"title":"API"},"headers":[],"relativePath":"reference/gnirehtet/api.md","filePath":"en/reference/gnirehtet/api.md","lastUpdated":1768410818000}'),n={name:"reference/gnirehtet/api.md"};function p(h,s,l,r,d,o){return a(),e("div",null,[...s[0]||(s[0]=[t("",98)])])}const k=i(n,[["render",p]]);export{g as __pageData,k as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e as a,a as i,o as t,ag as s}from"./chunks/framework.DCs21iJA.js";const g=JSON.parse('{"title":"Gnirehtet","description":"","frontmatter":{"title":"Gnirehtet"},"headers":[],"relativePath":"reference/gnirehtet/index.md","filePath":"en/reference/gnirehtet/index.md","lastUpdated":1768410455000}'),n={name:"reference/gnirehtet/index.md"};function l(r,e,o,h,p,d){return t(),i("div",null,[...e[0]||(e[0]=[s("",89)])])}const u=a(n,[["render",l]]);export{g as __pageData,u as default};
|
||||
import{e as a,a as i,o as t,ag as s}from"./chunks/framework.DCs21iJA.js";const g=JSON.parse('{"title":"Gnirehtet","description":"","frontmatter":{"title":"Gnirehtet"},"headers":[],"relativePath":"reference/gnirehtet/index.md","filePath":"en/reference/gnirehtet/index.md","lastUpdated":1768410818000}'),n={name:"reference/gnirehtet/index.md"};function l(r,e,o,h,p,d){return t(),i("div",null,[...e[0]||(e[0]=[s("",89)])])}const u=a(n,[["render",l]]);export{g as __pageData,u as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as n,a as t,o as a,h as e,J as c}from"./chunks/framework.DCs21iJA.js";const h=JSON.parse('{"title":"Reference","description":"","frontmatter":{"title":"Reference"},"headers":[],"relativePath":"reference/index.md","filePath":"en/reference/index.md","lastUpdated":1768410455000}'),l={name:"reference/index.md"};function i(o,r,s,d,f,p){return a(),t("div",null,[...r[0]||(r[0]=[e("h1",{id:"reference",tabindex:"-1"},[c("Reference "),e("a",{class:"header-anchor",href:"#reference","aria-label":'Permalink to "Reference"'},"")],-1),e("p",null,"Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.",-1),e("ul",null,[e("li",null,[e("a",{href:"/reference/scrcpy/"},"Scrcpy")]),e("li",null,[e("a",{href:"/reference/gnirehtet/"},"Gnirehtet")])],-1)])])}const m=n(l,[["render",i]]);export{h as __pageData,m as default};
|
||||
import{e as n,a as t,o as a,h as e,J as c}from"./chunks/framework.DCs21iJA.js";const h=JSON.parse('{"title":"Reference","description":"","frontmatter":{"title":"Reference"},"headers":[],"relativePath":"reference/index.md","filePath":"en/reference/index.md","lastUpdated":1768410818000}'),l={name:"reference/index.md"};function i(o,r,s,d,f,p){return a(),t("div",null,[...r[0]||(r[0]=[e("h1",{id:"reference",tabindex:"-1"},[c("Reference "),e("a",{class:"header-anchor",href:"#reference","aria-label":'Permalink to "Reference"'},"")],-1),e("p",null,"Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.",-1),e("ul",null,[e("li",null,[e("a",{href:"/reference/scrcpy/"},"Scrcpy")]),e("li",null,[e("a",{href:"/reference/gnirehtet/"},"Gnirehtet")])],-1)])])}const m=n(l,[["render",i]]);export{h as __pageData,m as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as n,a as t,o as a,h as e,J as c}from"./chunks/framework.DCs21iJA.js";const h=JSON.parse('{"title":"Reference","description":"","frontmatter":{"title":"Reference"},"headers":[],"relativePath":"reference/index.md","filePath":"en/reference/index.md","lastUpdated":1768410455000}'),l={name:"reference/index.md"};function i(o,r,s,d,f,p){return a(),t("div",null,[...r[0]||(r[0]=[e("h1",{id:"reference",tabindex:"-1"},[c("Reference "),e("a",{class:"header-anchor",href:"#reference","aria-label":'Permalink to "Reference"'},"")],-1),e("p",null,"Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.",-1),e("ul",null,[e("li",null,[e("a",{href:"/reference/scrcpy/"},"Scrcpy")]),e("li",null,[e("a",{href:"/reference/gnirehtet/"},"Gnirehtet")])],-1)])])}const m=n(l,[["render",i]]);export{h as __pageData,m as default};
|
||||
import{e as n,a as t,o as a,h as e,J as c}from"./chunks/framework.DCs21iJA.js";const h=JSON.parse('{"title":"Reference","description":"","frontmatter":{"title":"Reference"},"headers":[],"relativePath":"reference/index.md","filePath":"en/reference/index.md","lastUpdated":1768410818000}'),l={name:"reference/index.md"};function i(o,r,s,d,f,p){return a(),t("div",null,[...r[0]||(r[0]=[e("h1",{id:"reference",tabindex:"-1"},[c("Reference "),e("a",{class:"header-anchor",href:"#reference","aria-label":'Permalink to "Reference"'},"")],-1),e("p",null,"Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.",-1),e("ul",null,[e("li",null,[e("a",{href:"/reference/scrcpy/"},"Scrcpy")]),e("li",null,[e("a",{href:"/reference/gnirehtet/"},"Gnirehtet")])],-1)])])}const m=n(l,[["render",i]]);export{h as __pageData,m as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e as a,a as i,o as s,ag as o}from"./chunks/framework.DCs21iJA.js";const u=JSON.parse('{"title":"Audio","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/audio.md","filePath":"en/reference/scrcpy/audio.md","lastUpdated":1768410455000}'),t={name:"reference/scrcpy/audio.md"};function d(n,e,r,c,p,l){return s(),i("div",null,[...e[0]||(e[0]=[o("",57)])])}const k=a(t,[["render",d]]);export{u as __pageData,k as default};
|
||||
import{e as a,a as i,o as s,ag as o}from"./chunks/framework.DCs21iJA.js";const u=JSON.parse('{"title":"Audio","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/audio.md","filePath":"en/reference/scrcpy/audio.md","lastUpdated":1768410818000}'),t={name:"reference/scrcpy/audio.md"};function d(n,e,r,c,p,l){return s(),i("div",null,[...e[0]||(e[0]=[o("",57)])])}const k=a(t,[["render",d]]);export{u as __pageData,k as default};
|
||||
@@ -1,4 +1,4 @@
|
||||
import{e as i,a,o as e,ag as n}from"./chunks/framework.DCs21iJA.js";const c=JSON.parse('{"title":"Build scrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/build.md","filePath":"en/reference/scrcpy/build.md","lastUpdated":1768410455000}'),l={name:"reference/scrcpy/build.md"};function t(h,s,p,r,k,d){return e(),a("div",null,[...s[0]||(s[0]=[n(`<h1 id="build-scrcpy" tabindex="-1">Build scrcpy <a class="header-anchor" href="#build-scrcpy" aria-label="Permalink to "Build scrcpy""></a></h1><p>Here are the instructions to build <em>scrcpy</em> (client and server).</p><p>If you just want to build and install the latest release, follow the simplified process described in <a href="/reference/scrcpy/linux">doc/linux.md</a>.</p><h2 id="branches" tabindex="-1">Branches <a class="header-anchor" href="#branches" aria-label="Permalink to "Branches""></a></h2><p>There are two main branches:</p><ul><li><code>master</code>: contains the latest release. It is the home page of the project on GitHub.</li><li><code>dev</code>: the current development branch. Every commit present in <code>dev</code> will be in the next release.</li></ul><p>If you want to contribute code, please base your commits on the latest <code>dev</code> branch.</p><h2 id="requirements" tabindex="-1">Requirements <a class="header-anchor" href="#requirements" aria-label="Permalink to "Requirements""></a></h2><p>You need <a href="https://developer.android.com/studio/command-line/adb.html" target="_blank" rel="noreferrer">adb</a>. It is available in the <a href="https://developer.android.com/studio/releases/platform-tools.html" target="_blank" rel="noreferrer">Android SDK platform tools</a>, or packaged in your distribution (<code>adb</code>).</p><p>On Windows, download the <a href="https://dl.google.com/android/repository/platform-tools-latest-windows.zip" target="_blank" rel="noreferrer">platform-tools</a> and extract the following files to a directory accessible from your <code>PATH</code>:</p><ul><li><code>adb.exe</code></li><li><code>AdbWinApi.dll</code></li><li><code>AdbWinUsbApi.dll</code></li></ul><p>It is also available in scrcpy releases.</p><p>The client requires <a href="https://en.wikipedia.org/wiki/FFmpeg" target="_blank" rel="noreferrer">FFmpeg</a> and <a href="https://en.wikipedia.org/wiki/Simple_DirectMedia_Layer" target="_blank" rel="noreferrer">LibSDL2</a>. Just follow the instructions.</p><h2 id="system-specific-steps" tabindex="-1">System-specific steps <a class="header-anchor" href="#system-specific-steps" aria-label="Permalink to "System-specific steps""></a></h2><h3 id="linux" tabindex="-1">Linux <a class="header-anchor" href="#linux" aria-label="Permalink to "Linux""></a></h3><p>Install the required packages from your package manager.</p><h4 id="debian-ubuntu" tabindex="-1">Debian/Ubuntu <a class="header-anchor" href="#debian-ubuntu" aria-label="Permalink to "Debian/Ubuntu""></a></h4><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># runtime dependencies</span></span>
|
||||
import{e as i,a,o as e,ag as n}from"./chunks/framework.DCs21iJA.js";const c=JSON.parse('{"title":"Build scrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/build.md","filePath":"en/reference/scrcpy/build.md","lastUpdated":1768410818000}'),l={name:"reference/scrcpy/build.md"};function t(h,s,p,r,k,d){return e(),a("div",null,[...s[0]||(s[0]=[n(`<h1 id="build-scrcpy" tabindex="-1">Build scrcpy <a class="header-anchor" href="#build-scrcpy" aria-label="Permalink to "Build scrcpy""></a></h1><p>Here are the instructions to build <em>scrcpy</em> (client and server).</p><p>If you just want to build and install the latest release, follow the simplified process described in <a href="/reference/scrcpy/linux">doc/linux.md</a>.</p><h2 id="branches" tabindex="-1">Branches <a class="header-anchor" href="#branches" aria-label="Permalink to "Branches""></a></h2><p>There are two main branches:</p><ul><li><code>master</code>: contains the latest release. It is the home page of the project on GitHub.</li><li><code>dev</code>: the current development branch. Every commit present in <code>dev</code> will be in the next release.</li></ul><p>If you want to contribute code, please base your commits on the latest <code>dev</code> branch.</p><h2 id="requirements" tabindex="-1">Requirements <a class="header-anchor" href="#requirements" aria-label="Permalink to "Requirements""></a></h2><p>You need <a href="https://developer.android.com/studio/command-line/adb.html" target="_blank" rel="noreferrer">adb</a>. It is available in the <a href="https://developer.android.com/studio/releases/platform-tools.html" target="_blank" rel="noreferrer">Android SDK platform tools</a>, or packaged in your distribution (<code>adb</code>).</p><p>On Windows, download the <a href="https://dl.google.com/android/repository/platform-tools-latest-windows.zip" target="_blank" rel="noreferrer">platform-tools</a> and extract the following files to a directory accessible from your <code>PATH</code>:</p><ul><li><code>adb.exe</code></li><li><code>AdbWinApi.dll</code></li><li><code>AdbWinUsbApi.dll</code></li></ul><p>It is also available in scrcpy releases.</p><p>The client requires <a href="https://en.wikipedia.org/wiki/FFmpeg" target="_blank" rel="noreferrer">FFmpeg</a> and <a href="https://en.wikipedia.org/wiki/Simple_DirectMedia_Layer" target="_blank" rel="noreferrer">LibSDL2</a>. Just follow the instructions.</p><h2 id="system-specific-steps" tabindex="-1">System-specific steps <a class="header-anchor" href="#system-specific-steps" aria-label="Permalink to "System-specific steps""></a></h2><h3 id="linux" tabindex="-1">Linux <a class="header-anchor" href="#linux" aria-label="Permalink to "Linux""></a></h3><p>Install the required packages from your package manager.</p><h4 id="debian-ubuntu" tabindex="-1">Debian/Ubuntu <a class="header-anchor" href="#debian-ubuntu" aria-label="Permalink to "Debian/Ubuntu""></a></h4><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># runtime dependencies</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ffmpeg</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libsdl2-2.0-0</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> adb</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libusb-1.0-0</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># client build dependencies</span></span>
|
||||
@@ -1 +1 @@
|
||||
import{e as i,a,o as e,ag as n}from"./chunks/framework.DCs21iJA.js";const c=JSON.parse('{"title":"Build scrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/build.md","filePath":"en/reference/scrcpy/build.md","lastUpdated":1768410455000}'),l={name:"reference/scrcpy/build.md"};function t(h,s,p,r,k,d){return e(),a("div",null,[...s[0]||(s[0]=[n("",72)])])}const F=i(l,[["render",t]]);export{c as __pageData,F as default};
|
||||
import{e as i,a,o as e,ag as n}from"./chunks/framework.DCs21iJA.js";const c=JSON.parse('{"title":"Build scrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/build.md","filePath":"en/reference/scrcpy/build.md","lastUpdated":1768410818000}'),l={name:"reference/scrcpy/build.md"};function t(h,s,p,r,k,d){return e(),a("div",null,[...s[0]||(s[0]=[n("",72)])])}const F=i(l,[["render",t]]);export{c as __pageData,F as default};
|
||||
@@ -1,4 +1,4 @@
|
||||
import{e as a,a as e,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Camera","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/camera.md","filePath":"en/reference/scrcpy/camera.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/camera.md"};function p(r,s,h,l,c,d){return i(),e("div",null,[...s[0]||(s[0]=[t(`<h1 id="camera" tabindex="-1">Camera <a class="header-anchor" href="#camera" aria-label="Permalink to "Camera""></a></h1><p>Camera mirroring is supported for devices with Android 12 or higher.</p><p>To capture the camera instead of the device screen:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>scrcpy --video-source=camera</span></span></code></pre></div><p>By default, it automatically switches <a href="/reference/scrcpy/audio#source">audio source</a> to microphone (as if <code>--audio-source=mic</code> were also passed).</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --video-source=display</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # default is --audio-source=output</span></span>
|
||||
import{e as a,a as e,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Camera","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/camera.md","filePath":"en/reference/scrcpy/camera.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/camera.md"};function p(r,s,h,l,c,d){return i(),e("div",null,[...s[0]||(s[0]=[t(`<h1 id="camera" tabindex="-1">Camera <a class="header-anchor" href="#camera" aria-label="Permalink to "Camera""></a></h1><p>Camera mirroring is supported for devices with Android 12 or higher.</p><p>To capture the camera instead of the device screen:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>scrcpy --video-source=camera</span></span></code></pre></div><p>By default, it automatically switches <a href="/reference/scrcpy/audio#source">audio source</a> to microphone (as if <code>--audio-source=mic</code> were also passed).</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --video-source=display</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # default is --audio-source=output</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --video-source=camera</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # default is --audio-source=mic</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --video-source=display</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --audio-source=mic</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # force display AND microphone</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --video-source=camera</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --audio-source=output</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # force camera AND device audio output</span></span></code></pre></div><p>Audio can be disabled:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># audio not captured at all</span></span>
|
||||
@@ -1 +1 @@
|
||||
import{e as a,a as e,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Camera","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/camera.md","filePath":"en/reference/scrcpy/camera.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/camera.md"};function p(r,s,h,l,c,d){return i(),e("div",null,[...s[0]||(s[0]=[t("",49)])])}const g=a(n,[["render",p]]);export{k as __pageData,g as default};
|
||||
import{e as a,a as e,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Camera","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/camera.md","filePath":"en/reference/scrcpy/camera.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/camera.md"};function p(r,s,h,l,c,d){return i(),e("div",null,[...s[0]||(s[0]=[t("",49)])])}const g=a(n,[["render",p]]);export{k as __pageData,g as default};
|
||||
@@ -1,4 +1,4 @@
|
||||
import{e as i,a,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Connection","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/connection.md","filePath":"en/reference/scrcpy/connection.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/connection.md"};function l(p,s,h,c,o,d){return e(),a("div",null,[...s[0]||(s[0]=[t(`<h1 id="connection" tabindex="-1">Connection <a class="header-anchor" href="#connection" aria-label="Permalink to "Connection""></a></h1><h2 id="selection" tabindex="-1">Selection <a class="header-anchor" href="#selection" aria-label="Permalink to "Selection""></a></h2><p>If exactly one device is connected (i.e. listed by <code>adb devices</code>), then it is automatically selected.</p><p>However, if there are multiple devices connected, you must specify the one to use in one of 4 ways:</p><ul><li><p>by its serial:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --serial=0123456789abcdef</span></span>
|
||||
import{e as i,a,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Connection","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/connection.md","filePath":"en/reference/scrcpy/connection.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/connection.md"};function l(p,s,h,c,o,d){return e(),a("div",null,[...s[0]||(s[0]=[t(`<h1 id="connection" tabindex="-1">Connection <a class="header-anchor" href="#connection" aria-label="Permalink to "Connection""></a></h1><h2 id="selection" tabindex="-1">Selection <a class="header-anchor" href="#selection" aria-label="Permalink to "Selection""></a></h2><p>If exactly one device is connected (i.e. listed by <code>adb devices</code>), then it is automatically selected.</p><p>However, if there are multiple devices connected, you must specify the one to use in one of 4 ways:</p><ul><li><p>by its serial:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --serial=0123456789abcdef</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -s</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 0123456789abcdef</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # short version</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># the serial is the ip:port if connected over TCP/IP (same behavior as adb)</span></span>
|
||||
@@ -1 +1 @@
|
||||
import{e as i,a,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Connection","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/connection.md","filePath":"en/reference/scrcpy/connection.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/connection.md"};function l(p,s,h,c,o,d){return e(),a("div",null,[...s[0]||(s[0]=[t("",27)])])}const g=i(n,[["render",l]]);export{k as __pageData,g as default};
|
||||
import{e as i,a,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Connection","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/connection.md","filePath":"en/reference/scrcpy/connection.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/connection.md"};function l(p,s,h,c,o,d){return e(),a("div",null,[...s[0]||(s[0]=[t("",27)])])}const g=i(n,[["render",l]]);export{k as __pageData,g as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e as a,a as i,o as s,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Control","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/control.md","filePath":"en/reference/scrcpy/control.md","lastUpdated":1768410455000}'),o={name:"reference/scrcpy/control.md"};function n(d,e,l,r,p,h){return s(),i("div",null,[...e[0]||(e[0]=[t("",46)])])}const b=a(o,[["render",n]]);export{k as __pageData,b as default};
|
||||
import{e as a,a as i,o as s,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Control","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/control.md","filePath":"en/reference/scrcpy/control.md","lastUpdated":1768410818000}'),o={name:"reference/scrcpy/control.md"};function n(d,e,l,r,p,h){return s(),i("div",null,[...e[0]||(e[0]=[t("",46)])])}const b=a(o,[["render",n]]);export{k as __pageData,b as default};
|
||||
@@ -1,4 +1,4 @@
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"scrcpy for developers","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/develop.md","filePath":"en/reference/scrcpy/develop.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/develop.md"};function r(o,e,c,l,d,h){return i(),s("div",null,[...e[0]||(e[0]=[t(`<h1 id="scrcpy-for-developers" tabindex="-1">scrcpy for developers <a class="header-anchor" href="#scrcpy-for-developers" aria-label="Permalink to "scrcpy for developers""></a></h1><h2 id="overview" tabindex="-1">Overview <a class="header-anchor" href="#overview" aria-label="Permalink to "Overview""></a></h2><p>This application is composed of two parts:</p><ul><li>the server (<code>scrcpy-server</code>), to be executed on the device,</li><li>the client (the <code>scrcpy</code> binary), executed on the host computer.</li></ul><p>The client is responsible to push the server to the device and start its execution.</p><p>The client and the server establish communication using separate sockets for video, audio and controls. Any of them may be disabled (but not all), so there are 1, 2 or 3 socket(s).</p><p>The server initially sends the device name on the first socket (it is used for the scrcpy window title), then each socket is used for its own purpose. All reads and writes are performed from a dedicated thread for each socket, both on the client and on the server.</p><p>If video is enabled, then the server sends a raw video stream (H.264 by default) of the device screen, with some additional headers for each packet. The client decodes the video frames, and displays them as soon as possible, without buffering (unless <code>--video-buffer=delay</code> is specified) to minimize latency. The client is not aware of the device rotation (which is handled by the server), it just knows the dimensions of the video frames it receives.</p><p>Similarly, if audio is enabled, then the server sends a raw audio stream (OPUS by default) of the device audio output (or the microphone if <code>--audio-source=mic</code> is specified), with some additional headers for each packet. The client decodes the stream, attempts to keep a minimal latency by maintaining an average buffering. The <a href="https://blog.rom1v.com/2023/03/scrcpy-2-0-with-audio/" target="_blank" rel="noreferrer">blog post</a> of the scrcpy v2.0 release gives more details about the audio feature.</p><p>If control is enabled, then the client captures relevant keyboard and mouse events, that it transmits to the server, which injects them to the device. This is the only socket which is used in both direction: input events are sent from the client to the device, and when the device clipboard changes, the new content is sent from the device to the client to support seamless copy-paste.</p><p>Note that the client-server roles are expressed at the application level:</p><ul><li>the server <em>serves</em> video and audio streams, and handle requests from the client,</li><li>the client <em>controls</em> the device through the server.</li></ul><p>However, by default (when <code>--force-adb-forward</code> is not set), the roles are reversed at the network level:</p><ul><li>the client opens a server socket and listen on a port before starting the server,</li><li>the server connects to the client.</li></ul><p>This role inversion guarantees that the connection will not fail due to race conditions without polling.</p><h2 id="server" tabindex="-1">Server <a class="header-anchor" href="#server" aria-label="Permalink to "Server""></a></h2><h3 id="privileges" tabindex="-1">Privileges <a class="header-anchor" href="#privileges" aria-label="Permalink to "Privileges""></a></h3><p>Capturing the screen requires some privileges, which are granted to <code>shell</code>.</p><p>The server is a Java application (with a <a href="https://github.com/Genymobile/scrcpy/blob/a3cdf1a6b86ea22786e1f7d09b9c202feabc6949/server/src/main/java/com/genymobile/scrcpy/Server.java#L193" target="_blank" rel="noreferrer"><code>public static void main(String... args)</code></a> method), compiled against the Android framework, and executed as <code>shell</code> on the Android device.</p><p>To run such a Java application, the classes must be <a href="https://en.wikipedia.org/wiki/Dalvik_(software)" target="_blank" rel="noreferrer"><em>dexed</em></a> (typically, to <code>classes.dex</code>). If <code>my.package.MainClass</code> is the main class, compiled to <code>classes.dex</code>, pushed to the device in <code>/data/local/tmp</code>, then it can be run with:</p><pre><code>adb shell CLASSPATH=/data/local/tmp/classes.dex app_process / my.package.MainClass
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"scrcpy for developers","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/develop.md","filePath":"en/reference/scrcpy/develop.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/develop.md"};function r(o,e,c,l,d,h){return i(),s("div",null,[...e[0]||(e[0]=[t(`<h1 id="scrcpy-for-developers" tabindex="-1">scrcpy for developers <a class="header-anchor" href="#scrcpy-for-developers" aria-label="Permalink to "scrcpy for developers""></a></h1><h2 id="overview" tabindex="-1">Overview <a class="header-anchor" href="#overview" aria-label="Permalink to "Overview""></a></h2><p>This application is composed of two parts:</p><ul><li>the server (<code>scrcpy-server</code>), to be executed on the device,</li><li>the client (the <code>scrcpy</code> binary), executed on the host computer.</li></ul><p>The client is responsible to push the server to the device and start its execution.</p><p>The client and the server establish communication using separate sockets for video, audio and controls. Any of them may be disabled (but not all), so there are 1, 2 or 3 socket(s).</p><p>The server initially sends the device name on the first socket (it is used for the scrcpy window title), then each socket is used for its own purpose. All reads and writes are performed from a dedicated thread for each socket, both on the client and on the server.</p><p>If video is enabled, then the server sends a raw video stream (H.264 by default) of the device screen, with some additional headers for each packet. The client decodes the video frames, and displays them as soon as possible, without buffering (unless <code>--video-buffer=delay</code> is specified) to minimize latency. The client is not aware of the device rotation (which is handled by the server), it just knows the dimensions of the video frames it receives.</p><p>Similarly, if audio is enabled, then the server sends a raw audio stream (OPUS by default) of the device audio output (or the microphone if <code>--audio-source=mic</code> is specified), with some additional headers for each packet. The client decodes the stream, attempts to keep a minimal latency by maintaining an average buffering. The <a href="https://blog.rom1v.com/2023/03/scrcpy-2-0-with-audio/" target="_blank" rel="noreferrer">blog post</a> of the scrcpy v2.0 release gives more details about the audio feature.</p><p>If control is enabled, then the client captures relevant keyboard and mouse events, that it transmits to the server, which injects them to the device. This is the only socket which is used in both direction: input events are sent from the client to the device, and when the device clipboard changes, the new content is sent from the device to the client to support seamless copy-paste.</p><p>Note that the client-server roles are expressed at the application level:</p><ul><li>the server <em>serves</em> video and audio streams, and handle requests from the client,</li><li>the client <em>controls</em> the device through the server.</li></ul><p>However, by default (when <code>--force-adb-forward</code> is not set), the roles are reversed at the network level:</p><ul><li>the client opens a server socket and listen on a port before starting the server,</li><li>the server connects to the client.</li></ul><p>This role inversion guarantees that the connection will not fail due to race conditions without polling.</p><h2 id="server" tabindex="-1">Server <a class="header-anchor" href="#server" aria-label="Permalink to "Server""></a></h2><h3 id="privileges" tabindex="-1">Privileges <a class="header-anchor" href="#privileges" aria-label="Permalink to "Privileges""></a></h3><p>Capturing the screen requires some privileges, which are granted to <code>shell</code>.</p><p>The server is a Java application (with a <a href="https://github.com/Genymobile/scrcpy/blob/a3cdf1a6b86ea22786e1f7d09b9c202feabc6949/server/src/main/java/com/genymobile/scrcpy/Server.java#L193" target="_blank" rel="noreferrer"><code>public static void main(String... args)</code></a> method), compiled against the Android framework, and executed as <code>shell</code> on the Android device.</p><p>To run such a Java application, the classes must be <a href="https://en.wikipedia.org/wiki/Dalvik_(software)" target="_blank" rel="noreferrer"><em>dexed</em></a> (typically, to <code>classes.dex</code>). If <code>my.package.MainClass</code> is the main class, compiled to <code>classes.dex</code>, pushed to the device in <code>/data/local/tmp</code>, then it can be run with:</p><pre><code>adb shell CLASSPATH=/data/local/tmp/classes.dex app_process / my.package.MainClass
|
||||
</code></pre><p><em>The path <code>/data/local/tmp</code> is a good candidate to push the server, since it's readable and writable by <code>shell</code>, but not world-writable, so a malicious application may not replace the server just before the client executes it.</em></p><p>Instead of a raw <em>dex</em> file, <code>app_process</code> accepts a <em>jar</em> containing <code>classes.dex</code> (e.g. an <a href="https://en.wikipedia.org/wiki/Android_application_package" target="_blank" rel="noreferrer">APK</a>). For simplicity, and to benefit from the gradle build system, the server is built to an (unsigned) APK (renamed to <code>scrcpy-server.jar</code>).</p><h3 id="hidden-methods" tabindex="-1">Hidden methods <a class="header-anchor" href="#hidden-methods" aria-label="Permalink to "Hidden methods""></a></h3><p>Although compiled against the Android framework, <a href="https://stackoverflow.com/a/31908373/1987178" target="_blank" rel="noreferrer">hidden</a> methods and classes are not directly accessible (and they may differ from one Android version to another).</p><p>They can be called using reflection though. The communication with hidden components is provided by <a href="https://github.com/Genymobile/scrcpy/tree/master/server/src/main/java/com/genymobile/scrcpy/wrappers" target="_blank" rel="noreferrer"><em>wrappers</em> classes</a> and <a href="https://github.com/Genymobile/scrcpy/tree/master/server/src/main/aidl" target="_blank" rel="noreferrer">aidl</a>.</p><h3 id="execution" tabindex="-1">Execution <a class="header-anchor" href="#execution" aria-label="Permalink to "Execution""></a></h3><p>The server is started by the client basically by executing the following commands:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">adb</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> push</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> scrcpy-server</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /data/local/tmp/scrcpy-server.jar</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">adb</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> forward</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> tcp:27183</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> localabstract:scrcpy</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">adb</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> shell</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> CLASSPATH=/data/local/tmp/scrcpy-server.jar</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> app_process</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> com.genymobile.scrcpy.Server</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 2.1</span></span></code></pre></div><p>The first argument (<code>2.1</code> in the example) is the client scrcpy version. The server fails if the client and the server do not have the exact same version. The protocol between the client and the server may change from version to version (see <a href="#protocol">protocol</a> below), and there is no backward or forward compatibility (there is no point to use different client and server versions). This check allows to detect misconfiguration (running an older or newer server by mistake).</p><p>It is followed by any number of arguments, in the form of <code>key=value</code> pairs. Their order is irrelevant. The possible keys and associated value types can be found in the <a href="https://github.com/Genymobile/scrcpy/blob/a3cdf1a6b86ea22786e1f7d09b9c202feabc6949/server/src/main/java/com/genymobile/scrcpy/Options.java#L181" target="_blank" rel="noreferrer">server</a> and <a href="https://github.com/Genymobile/scrcpy/blob/a3cdf1a6b86ea22786e1f7d09b9c202feabc6949/app/src/server.c#L226" target="_blank" rel="noreferrer">client</a> code.</p><p>For example, if we execute <code>scrcpy -m1920 --no-audio</code>, then the server execution will look like this:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># scid is a random number to identify different clients running on the same device</span></span>
|
||||
@@ -1 +1 @@
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"scrcpy for developers","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/develop.md","filePath":"en/reference/scrcpy/develop.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/develop.md"};function r(o,e,c,l,d,h){return i(),s("div",null,[...e[0]||(e[0]=[t("",119)])])}const b=a(n,[["render",r]]);export{m as __pageData,b as default};
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"scrcpy for developers","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/develop.md","filePath":"en/reference/scrcpy/develop.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/develop.md"};function r(o,e,c,l,d,h){return i(),s("div",null,[...e[0]||(e[0]=[t("",119)])])}const b=a(n,[["render",r]]);export{m as __pageData,b as default};
|
||||
@@ -1,4 +1,4 @@
|
||||
import{e as a,a as i,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Device","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/device.md","filePath":"en/reference/scrcpy/device.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/device.md"};function p(l,s,h,o,d,r){return e(),i("div",null,[...s[0]||(s[0]=[t(`<h1 id="device" tabindex="-1">Device <a class="header-anchor" href="#device" aria-label="Permalink to "Device""></a></h1><p>Some command line arguments perform actions on the device itself while scrcpy is running.</p><h2 id="stay-awake" tabindex="-1">Stay awake <a class="header-anchor" href="#stay-awake" aria-label="Permalink to "Stay awake""></a></h2><p>To prevent the device from sleeping after a delay <strong>when the device is plugged in</strong>:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --stay-awake</span></span>
|
||||
import{e as a,a as i,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Device","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/device.md","filePath":"en/reference/scrcpy/device.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/device.md"};function p(l,s,h,o,d,r){return e(),i("div",null,[...s[0]||(s[0]=[t(`<h1 id="device" tabindex="-1">Device <a class="header-anchor" href="#device" aria-label="Permalink to "Device""></a></h1><p>Some command line arguments perform actions on the device itself while scrcpy is running.</p><h2 id="stay-awake" tabindex="-1">Stay awake <a class="header-anchor" href="#stay-awake" aria-label="Permalink to "Stay awake""></a></h2><p>To prevent the device from sleeping after a delay <strong>when the device is plugged in</strong>:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --stay-awake</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -w</span></span></code></pre></div><p>The initial state is restored when <em>scrcpy</em> is closed.</p><p>If the device is not plugged in (i.e. only connected over TCP/IP), <code>--stay-awake</code> has no effect (this is the Android behavior).</p><p>This changes the value of <a href="https://developer.android.com/reference/android/provider/Settings.Global#STAY_ON_WHILE_PLUGGED_IN" target="_blank" rel="noreferrer"><code>stay_on_while_plugged_in</code></a>, setting which can be changed manually:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># get the current show_touches value</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">adb</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> shell</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> settings</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> get</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> global</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> stay_on_while_plugged_in</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># enable for AC/USB/wireless chargers</span></span>
|
||||
@@ -1 +1 @@
|
||||
import{e as a,a as i,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Device","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/device.md","filePath":"en/reference/scrcpy/device.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/device.md"};function p(l,s,h,o,d,r){return e(),i("div",null,[...s[0]||(s[0]=[t("",54)])])}const g=a(n,[["render",p]]);export{k as __pageData,g as default};
|
||||
import{e as a,a as i,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Device","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/device.md","filePath":"en/reference/scrcpy/device.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/device.md"};function p(l,s,h,o,d,r){return e(),i("div",null,[...s[0]||(s[0]=[t("",54)])])}const g=a(n,[["render",p]]);export{k as __pageData,g as default};
|
||||
@@ -1,2 +1,2 @@
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"Gamepad","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/gamepad.md","filePath":"en/reference/scrcpy/gamepad.md","lastUpdated":1768410455000}'),o={name:"reference/scrcpy/gamepad.md"};function d(r,e,p,n,l,h){return i(),s("div",null,[...e[0]||(e[0]=[t(`<h1 id="gamepad" tabindex="-1">Gamepad <a class="header-anchor" href="#gamepad" aria-label="Permalink to "Gamepad""></a></h1><p>Several gamepad input modes are available:</p><ul><li><code>--gamepad=disabled</code> (default)</li><li><code>--gamepad=uhid</code> (or <code>-G</code>): simulates physical HID gamepads using the UHID kernel module on the device</li><li><code>--gamepad=aoa</code>: simulates physical HID gamepads using the AOAv2 protocol</li></ul><h2 id="physical-gamepad-simulation" tabindex="-1">Physical gamepad simulation <a class="header-anchor" href="#physical-gamepad-simulation" aria-label="Permalink to "Physical gamepad simulation""></a></h2><p>Two modes allow to simulate physical HID gamepads on the device, one for each physical gamepad plugged into the computer.</p><h3 id="uhid" tabindex="-1">UHID <a class="header-anchor" href="#uhid" aria-label="Permalink to "UHID""></a></h3><p>This mode simulates physical HID gamepads using the <a href="https://kernel.org/doc/Documentation/hid/uhid.txt" target="_blank" rel="noreferrer">UHID</a> kernel module on the device.</p><p>To enable UHID gamepads, use:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --gamepad=uhid</span></span>
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"Gamepad","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/gamepad.md","filePath":"en/reference/scrcpy/gamepad.md","lastUpdated":1768410818000}'),o={name:"reference/scrcpy/gamepad.md"};function d(r,e,p,n,l,h){return i(),s("div",null,[...e[0]||(e[0]=[t(`<h1 id="gamepad" tabindex="-1">Gamepad <a class="header-anchor" href="#gamepad" aria-label="Permalink to "Gamepad""></a></h1><p>Several gamepad input modes are available:</p><ul><li><code>--gamepad=disabled</code> (default)</li><li><code>--gamepad=uhid</code> (or <code>-G</code>): simulates physical HID gamepads using the UHID kernel module on the device</li><li><code>--gamepad=aoa</code>: simulates physical HID gamepads using the AOAv2 protocol</li></ul><h2 id="physical-gamepad-simulation" tabindex="-1">Physical gamepad simulation <a class="header-anchor" href="#physical-gamepad-simulation" aria-label="Permalink to "Physical gamepad simulation""></a></h2><p>Two modes allow to simulate physical HID gamepads on the device, one for each physical gamepad plugged into the computer.</p><h3 id="uhid" tabindex="-1">UHID <a class="header-anchor" href="#uhid" aria-label="Permalink to "UHID""></a></h3><p>This mode simulates physical HID gamepads using the <a href="https://kernel.org/doc/Documentation/hid/uhid.txt" target="_blank" rel="noreferrer">UHID</a> kernel module on the device.</p><p>To enable UHID gamepads, use:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --gamepad=uhid</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -G</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # short version</span></span></code></pre></div><p>Note: UHID may not work on old Android versions due to permission errors.</p><h3 id="aoa" tabindex="-1">AOA <a class="header-anchor" href="#aoa" aria-label="Permalink to "AOA""></a></h3><p>This mode simulates physical HID gamepads using the <a href="https://source.android.com/devices/accessories/aoa2#hid-support" target="_blank" rel="noreferrer">AOAv2</a> protocol.</p><p>To enable AOA gamepads, use:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --gamepad=aoa</span></span></code></pre></div><p>Contrary to the other mode, it works at the USB level directly (so it only works over USB).</p><p>It does not use the scrcpy server, and does not require <code>adb</code> (USB debugging). Therefore, it is possible to control the device (but not mirror) even with USB debugging disabled (see <a href="/reference/scrcpy/otg">OTG</a>).</p><p>Note: For some reason, in this mode, Android detects multiple physical gamepads as a single misbehaving one. Use UHID if you need multiple gamepads.</p><p>Note: On Windows, it may only work in <a href="/reference/scrcpy/otg">OTG mode</a>, not while mirroring (it is not possible to open a USB device if it is already open by another process like the <em>adb daemon</em>).</p>`,18)])])}const g=a(o,[["render",d]]);export{m as __pageData,g as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"Gamepad","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/gamepad.md","filePath":"en/reference/scrcpy/gamepad.md","lastUpdated":1768410455000}'),o={name:"reference/scrcpy/gamepad.md"};function d(r,e,p,n,l,h){return i(),s("div",null,[...e[0]||(e[0]=[t("",18)])])}const g=a(o,[["render",d]]);export{m as __pageData,g as default};
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"Gamepad","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/gamepad.md","filePath":"en/reference/scrcpy/gamepad.md","lastUpdated":1768410818000}'),o={name:"reference/scrcpy/gamepad.md"};function d(r,e,p,n,l,h){return i(),s("div",null,[...e[0]||(e[0]=[t("",18)])])}const g=a(o,[["render",d]]);export{m as __pageData,g as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e as a,a as s,o as i,ag as r}from"./chunks/framework.DCs21iJA.js";const u=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"reference/scrcpy/index.md","filePath":"en/reference/scrcpy/index.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/index.md"};function t(o,e,l,c,p,h){return i(),s("div",null,[...e[0]||(e[0]=[r("",43)])])}const g=a(n,[["render",t]]);export{u as __pageData,g as default};
|
||||
import{e as a,a as s,o as i,ag as r}from"./chunks/framework.DCs21iJA.js";const u=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"reference/scrcpy/index.md","filePath":"en/reference/scrcpy/index.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/index.md"};function t(o,e,l,c,p,h){return i(),s("div",null,[...e[0]||(e[0]=[r("",43)])])}const g=a(n,[["render",t]]);export{u as __pageData,g as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e as a,a as s,o as t,ag as i}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Keyboard","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/keyboard.md","filePath":"en/reference/scrcpy/keyboard.md","lastUpdated":1768410455000}'),o={name:"reference/scrcpy/keyboard.md"};function r(n,e,d,l,c,h){return t(),s("div",null,[...e[0]||(e[0]=[i("",41)])])}const y=a(o,[["render",r]]);export{k as __pageData,y as default};
|
||||
import{e as a,a as s,o as t,ag as i}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Keyboard","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/keyboard.md","filePath":"en/reference/scrcpy/keyboard.md","lastUpdated":1768410818000}'),o={name:"reference/scrcpy/keyboard.md"};function r(n,e,d,l,c,h){return t(),s("div",null,[...e[0]||(e[0]=[i("",41)])])}const y=a(o,[["render",r]]);export{k as __pageData,y as default};
|
||||
@@ -1,4 +1,4 @@
|
||||
import{e as a,a as e,o as i,ag as l}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"On Linux","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/linux.md","filePath":"en/reference/scrcpy/linux.md","lastUpdated":1768410455000}'),t={name:"reference/scrcpy/linux.md"};function n(r,s,p,h,o,c){return i(),e("div",null,[...s[0]||(s[0]=[l(`<h1 id="on-linux" tabindex="-1">On Linux <a class="header-anchor" href="#on-linux" aria-label="Permalink to "On Linux""></a></h1><h2 id="install" tabindex="-1">Install <a class="header-anchor" href="#install" aria-label="Permalink to "Install""></a></h2><h3 id="from-the-official-release" tabindex="-1">From the official release <a class="header-anchor" href="#from-the-official-release" aria-label="Permalink to "From the official release""></a></h3><p>Download a static build of the <a href="https://github.com/Genymobile/scrcpy/releases/latest" target="_blank" rel="noreferrer">latest release</a>:</p><ul><li><a href="https://github.com/Genymobile/scrcpy/releases/download/v3.2/scrcpy-linux-x86_64-v3.2.tar.gz" target="_blank" rel="noreferrer"><code>scrcpy-linux-x86_64-v3.2.tar.gz</code></a> (x86_64) <sub>SHA-256: <code>df6cf000447428fcde322022848d655ff0211d98688d0f17cbbf21be9c1272be</code></sub></li></ul><p>and extract it.</p><p><em>Static builds of scrcpy for Linux are still experimental.</em></p><h3 id="from-your-package-manager" tabindex="-1">From your package manager <a class="header-anchor" href="#from-your-package-manager" aria-label="Permalink to "From your package manager""></a></h3><p><a href="https://repology.org/project/scrcpy/versions"><img src="https://repology.org/badge/vertical-allrepos/scrcpy.svg" alt="Packaging status" align="right"></a></p><p>Scrcpy is packaged in several distributions and package managers:</p><ul><li>Debian/Ubuntu: <s><code>apt install scrcpy</code></s> <em>(obsolete version)</em></li><li>Arch Linux: <code>pacman -S scrcpy</code></li><li>Fedora: <code>dnf copr enable zeno/scrcpy && dnf install scrcpy</code></li><li>Gentoo: <code>emerge scrcpy</code></li><li>Snap: <code>snap install scrcpy</code></li><li>… (see <a href="https://repology.org/project/scrcpy/versions" target="_blank" rel="noreferrer">repology</a>)</li></ul><h3 id="from-an-install-script" tabindex="-1">From an install script <a class="header-anchor" href="#from-an-install-script" aria-label="Permalink to "From an install script""></a></h3><p>To install the latest release from <code>master</code>, follow this simplified process.</p><p>First, you need to install the required packages:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># for Debian/Ubuntu</span></span>
|
||||
import{e as a,a as e,o as i,ag as l}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"On Linux","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/linux.md","filePath":"en/reference/scrcpy/linux.md","lastUpdated":1768410818000}'),t={name:"reference/scrcpy/linux.md"};function n(r,s,p,h,o,c){return i(),e("div",null,[...s[0]||(s[0]=[l(`<h1 id="on-linux" tabindex="-1">On Linux <a class="header-anchor" href="#on-linux" aria-label="Permalink to "On Linux""></a></h1><h2 id="install" tabindex="-1">Install <a class="header-anchor" href="#install" aria-label="Permalink to "Install""></a></h2><h3 id="from-the-official-release" tabindex="-1">From the official release <a class="header-anchor" href="#from-the-official-release" aria-label="Permalink to "From the official release""></a></h3><p>Download a static build of the <a href="https://github.com/Genymobile/scrcpy/releases/latest" target="_blank" rel="noreferrer">latest release</a>:</p><ul><li><a href="https://github.com/Genymobile/scrcpy/releases/download/v3.2/scrcpy-linux-x86_64-v3.2.tar.gz" target="_blank" rel="noreferrer"><code>scrcpy-linux-x86_64-v3.2.tar.gz</code></a> (x86_64) <sub>SHA-256: <code>df6cf000447428fcde322022848d655ff0211d98688d0f17cbbf21be9c1272be</code></sub></li></ul><p>and extract it.</p><p><em>Static builds of scrcpy for Linux are still experimental.</em></p><h3 id="from-your-package-manager" tabindex="-1">From your package manager <a class="header-anchor" href="#from-your-package-manager" aria-label="Permalink to "From your package manager""></a></h3><p><a href="https://repology.org/project/scrcpy/versions"><img src="https://repology.org/badge/vertical-allrepos/scrcpy.svg" alt="Packaging status" align="right"></a></p><p>Scrcpy is packaged in several distributions and package managers:</p><ul><li>Debian/Ubuntu: <s><code>apt install scrcpy</code></s> <em>(obsolete version)</em></li><li>Arch Linux: <code>pacman -S scrcpy</code></li><li>Fedora: <code>dnf copr enable zeno/scrcpy && dnf install scrcpy</code></li><li>Gentoo: <code>emerge scrcpy</code></li><li>Snap: <code>snap install scrcpy</code></li><li>… (see <a href="https://repology.org/project/scrcpy/versions" target="_blank" rel="noreferrer">repology</a>)</li></ul><h3 id="from-an-install-script" tabindex="-1">From an install script <a class="header-anchor" href="#from-an-install-script" aria-label="Permalink to "From an install script""></a></h3><p>To install the latest release from <code>master</code>, follow this simplified process.</p><p>First, you need to install the required packages:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># for Debian/Ubuntu</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ffmpeg</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libsdl2-2.0-0</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> adb</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> wget</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
|
||||
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> gcc</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> pkg-config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> meson</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ninja-build</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libsdl2-dev</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
|
||||
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libavcodec-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libavdevice-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libavformat-dev</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> libavutil-dev</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span>
|
||||
@@ -1 +1 @@
|
||||
import{e as a,a as e,o as i,ag as l}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"On Linux","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/linux.md","filePath":"en/reference/scrcpy/linux.md","lastUpdated":1768410455000}'),t={name:"reference/scrcpy/linux.md"};function n(r,s,p,h,o,c){return i(),e("div",null,[...s[0]||(s[0]=[l("",31)])])}const g=a(t,[["render",n]]);export{k as __pageData,g as default};
|
||||
import{e as a,a as e,o as i,ag as l}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"On Linux","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/linux.md","filePath":"en/reference/scrcpy/linux.md","lastUpdated":1768410818000}'),t={name:"reference/scrcpy/linux.md"};function n(r,s,p,h,o,c){return i(),e("div",null,[...s[0]||(s[0]=[l("",31)])])}const g=a(t,[["render",n]]);export{k as __pageData,g as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const b=JSON.parse('{"title":"On macOS","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/macos.md","filePath":"en/reference/scrcpy/macos.md","lastUpdated":1768410455000}'),r={name:"reference/scrcpy/macos.md"};function l(c,a,n,o,p,h){return i(),s("div",null,[...a[0]||(a[0]=[t("",23)])])}const k=e(r,[["render",l]]);export{b as __pageData,k as default};
|
||||
import{e,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const b=JSON.parse('{"title":"On macOS","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/macos.md","filePath":"en/reference/scrcpy/macos.md","lastUpdated":1768410818000}'),r={name:"reference/scrcpy/macos.md"};function l(c,a,n,o,p,h){return i(),s("div",null,[...a[0]||(a[0]=[t("",23)])])}const k=e(r,[["render",l]]);export{b as __pageData,k as default};
|
||||
@@ -1,4 +1,4 @@
|
||||
import{e as s,a,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const u=JSON.parse('{"title":"Mouse","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/mouse.md","filePath":"en/reference/scrcpy/mouse.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/mouse.md"};function o(l,e,d,c,h,p){return i(),a("div",null,[...e[0]||(e[0]=[t(`<h1 id="mouse" tabindex="-1">Mouse <a class="header-anchor" href="#mouse" aria-label="Permalink to "Mouse""></a></h1><p>Several mouse input modes are available:</p><ul><li><code>--mouse=sdk</code> (default)</li><li><code>--mouse=uhid</code> (or <code>-M</code>): simulates a physical HID mouse using the UHID kernel module on the device</li><li><code>--mouse=aoa</code>: simulates a physical HID mouse using the AOAv2 protocol</li><li><code>--mouse=disabled</code></li></ul><h2 id="sdk-mouse" tabindex="-1">SDK mouse <a class="header-anchor" href="#sdk-mouse" aria-label="Permalink to "SDK mouse""></a></h2><p>In this mode (<code>--mouse=sdk</code>, or if the parameter is omitted), mouse input events are injected at the Android API level with absolute coordinates.</p><p>Note that on some devices, an additional option must be enabled in developer options for this mouse mode to work. See <a href="/reference/scrcpy/#prerequisites">prerequisites</a>.</p><h3 id="mouse-hover" tabindex="-1">Mouse hover <a class="header-anchor" href="#mouse-hover" aria-label="Permalink to "Mouse hover""></a></h3><p>By default, mouse hover (mouse motion without any clicks) events are forwarded to the device. This can be disabled with:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>scrcpy --no-mouse-hover</span></span></code></pre></div><h2 id="physical-mouse-simulation" tabindex="-1">Physical mouse simulation <a class="header-anchor" href="#physical-mouse-simulation" aria-label="Permalink to "Physical mouse simulation""></a></h2><p>Two modes allow to simulate a physical HID mouse on the device.</p><p>In these modes, the computer mouse is "captured": the mouse pointer disappears from the computer and appears on the Android device instead.</p><p>The <a href="/reference/scrcpy/shortcuts">shortcut mod</a> (either <kbd>Alt</kbd> or <kbd>Super</kbd> by default) toggle (disable or enable) the mouse capture. Use one of them to give the control of the mouse back to the computer.</p><h3 id="uhid" tabindex="-1">UHID <a class="header-anchor" href="#uhid" aria-label="Permalink to "UHID""></a></h3><p>This mode simulates a physical HID mouse using the <a href="https://kernel.org/doc/Documentation/hid/uhid.txt" target="_blank" rel="noreferrer">UHID</a> kernel module on the device.</p><p>To enable UHID mouse, use:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --mouse=uhid</span></span>
|
||||
import{e as s,a,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const u=JSON.parse('{"title":"Mouse","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/mouse.md","filePath":"en/reference/scrcpy/mouse.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/mouse.md"};function o(l,e,d,c,h,p){return i(),a("div",null,[...e[0]||(e[0]=[t(`<h1 id="mouse" tabindex="-1">Mouse <a class="header-anchor" href="#mouse" aria-label="Permalink to "Mouse""></a></h1><p>Several mouse input modes are available:</p><ul><li><code>--mouse=sdk</code> (default)</li><li><code>--mouse=uhid</code> (or <code>-M</code>): simulates a physical HID mouse using the UHID kernel module on the device</li><li><code>--mouse=aoa</code>: simulates a physical HID mouse using the AOAv2 protocol</li><li><code>--mouse=disabled</code></li></ul><h2 id="sdk-mouse" tabindex="-1">SDK mouse <a class="header-anchor" href="#sdk-mouse" aria-label="Permalink to "SDK mouse""></a></h2><p>In this mode (<code>--mouse=sdk</code>, or if the parameter is omitted), mouse input events are injected at the Android API level with absolute coordinates.</p><p>Note that on some devices, an additional option must be enabled in developer options for this mouse mode to work. See <a href="/reference/scrcpy/#prerequisites">prerequisites</a>.</p><h3 id="mouse-hover" tabindex="-1">Mouse hover <a class="header-anchor" href="#mouse-hover" aria-label="Permalink to "Mouse hover""></a></h3><p>By default, mouse hover (mouse motion without any clicks) events are forwarded to the device. This can be disabled with:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>scrcpy --no-mouse-hover</span></span></code></pre></div><h2 id="physical-mouse-simulation" tabindex="-1">Physical mouse simulation <a class="header-anchor" href="#physical-mouse-simulation" aria-label="Permalink to "Physical mouse simulation""></a></h2><p>Two modes allow to simulate a physical HID mouse on the device.</p><p>In these modes, the computer mouse is "captured": the mouse pointer disappears from the computer and appears on the Android device instead.</p><p>The <a href="/reference/scrcpy/shortcuts">shortcut mod</a> (either <kbd>Alt</kbd> or <kbd>Super</kbd> by default) toggle (disable or enable) the mouse capture. Use one of them to give the control of the mouse back to the computer.</p><h3 id="uhid" tabindex="-1">UHID <a class="header-anchor" href="#uhid" aria-label="Permalink to "UHID""></a></h3><p>This mode simulates a physical HID mouse using the <a href="https://kernel.org/doc/Documentation/hid/uhid.txt" target="_blank" rel="noreferrer">UHID</a> kernel module on the device.</p><p>To enable UHID mouse, use:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --mouse=uhid</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -M</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # short version</span></span></code></pre></div><p>Note: UHID may not work on old Android versions due to permission errors.</p><h3 id="aoa" tabindex="-1">AOA <a class="header-anchor" href="#aoa" aria-label="Permalink to "AOA""></a></h3><p>This mode simulates a physical HID mouse using the <a href="https://source.android.com/devices/accessories/aoa2#hid-support" target="_blank" rel="noreferrer">AOAv2</a> protocol.</p><p>To enable AOA mouse, use:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --mouse=aoa</span></span></code></pre></div><p>Contrary to the other modes, it works at the USB level directly (so it only works over USB).</p><p>It does not use the scrcpy server, and does not require <code>adb</code> (USB debugging). Therefore, it is possible to control the device (but not mirror) even with USB debugging disabled (see <a href="/reference/scrcpy/otg">OTG</a>).</p><p>Note: On Windows, it may only work in <a href="/reference/scrcpy/otg">OTG mode</a>, not while mirroring (it is not possible to open a USB device if it is already open by another process like the <em>adb daemon</em>).</p><h2 id="mouse-bindings" tabindex="-1">Mouse bindings <a class="header-anchor" href="#mouse-bindings" aria-label="Permalink to "Mouse bindings""></a></h2><p>By default, with SDK mouse:</p><ul><li>right-click triggers <code>BACK</code> (or <code>POWER</code> on)</li><li>middle-click triggers <code>HOME</code></li><li>the 4th click triggers <code>APP_SWITCH</code></li><li>the 5th click expands the notification panel</li></ul><p>The secondary clicks may be forwarded to the device instead by pressing the <kbd>Shift</kbd> key (e.g. <kbd>Shift</kbd>+right-click injects a right click to the device).</p><p>In AOA and UHID mouse modes, the default bindings are reversed: all clicks are forwarded by default, and pressing <kbd>Shift</kbd> gives access to the shortcuts (since the cursor is handled on the device side, it makes more sense to forward all mouse buttons by default in these modes).</p><p>The shortcuts can be configured using <code>--mouse-bind=xxxx:xxxx</code> for any mouse mode. The argument must be one or two sequences (separated by <code>:</code>) of exactly 4 characters, one for each secondary click:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span> .---- Shift + right click</span></span>
|
||||
<span class="line"><span> SECONDARY |.--- Shift + middle click</span></span>
|
||||
<span class="line"><span> BINDINGS ||.-- Shift + 4th click</span></span>
|
||||
@@ -1 +1 @@
|
||||
import{e as s,a,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const u=JSON.parse('{"title":"Mouse","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/mouse.md","filePath":"en/reference/scrcpy/mouse.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/mouse.md"};function o(l,e,d,c,h,p){return i(),a("div",null,[...e[0]||(e[0]=[t("",38)])])}const k=s(n,[["render",o]]);export{u as __pageData,k as default};
|
||||
import{e as s,a,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const u=JSON.parse('{"title":"Mouse","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/mouse.md","filePath":"en/reference/scrcpy/mouse.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/mouse.md"};function o(l,e,d,c,h,p){return i(),a("div",null,[...e[0]||(e[0]=[t("",38)])])}const k=s(n,[["render",o]]);export{u as __pageData,k as default};
|
||||
@@ -1,4 +1,4 @@
|
||||
import{e as a,a as e,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"OTG","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/otg.md","filePath":"en/reference/scrcpy/otg.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/otg.md"};function o(p,s,l,h,d,r){return i(),e("div",null,[...s[0]||(s[0]=[t(`<h1 id="otg" tabindex="-1">OTG <a class="header-anchor" href="#otg" aria-label="Permalink to "OTG""></a></h1><p>By default, <em>scrcpy</em> injects input events at the Android API level. As an alternative, it is possible to send HID events, so that scrcpy behaves as if it was a <a href="/reference/scrcpy/keyboard#physical-keyboard-simulation">physical keyboard</a> and/or a <a href="/reference/scrcpy/mouse#physical-mouse-simulation">physical mouse</a> connected to the Android device (see <a href="/reference/scrcpy/keyboard">keyboard</a> and <a href="/reference/scrcpy/mouse">mouse</a>).</p><p>A special mode (OTG) allows to control the device using AOA <a href="/reference/scrcpy/keyboard#aoa">keyboard</a>, <a href="/reference/scrcpy/mouse#aoa">mouse</a> and <a href="/reference/scrcpy/gamepad#aoa">gamepad</a>, without using <em>adb</em> at all (so USB debugging is not necessary). In this mode, video and audio are disabled, and <code>--keyboard=aoa</code> and <code>--mouse=aoa</code> are implicitly set. However, gamepads are disabled by default, so <code>--gamepad=aoa</code> (or <code>-G</code> in OTG mode) must be explicitly set.</p><p>Therefore, it is possible to run <em>scrcpy</em> with only physical keyboard, mouse and gamepad simulation, as if the computer keyboard, mouse and gamepads were plugged directly to the device via an OTG cable.</p><p>To enable OTG mode:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --otg</span></span>
|
||||
import{e as a,a as e,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"OTG","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/otg.md","filePath":"en/reference/scrcpy/otg.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/otg.md"};function o(p,s,l,h,d,r){return i(),e("div",null,[...s[0]||(s[0]=[t(`<h1 id="otg" tabindex="-1">OTG <a class="header-anchor" href="#otg" aria-label="Permalink to "OTG""></a></h1><p>By default, <em>scrcpy</em> injects input events at the Android API level. As an alternative, it is possible to send HID events, so that scrcpy behaves as if it was a <a href="/reference/scrcpy/keyboard#physical-keyboard-simulation">physical keyboard</a> and/or a <a href="/reference/scrcpy/mouse#physical-mouse-simulation">physical mouse</a> connected to the Android device (see <a href="/reference/scrcpy/keyboard">keyboard</a> and <a href="/reference/scrcpy/mouse">mouse</a>).</p><p>A special mode (OTG) allows to control the device using AOA <a href="/reference/scrcpy/keyboard#aoa">keyboard</a>, <a href="/reference/scrcpy/mouse#aoa">mouse</a> and <a href="/reference/scrcpy/gamepad#aoa">gamepad</a>, without using <em>adb</em> at all (so USB debugging is not necessary). In this mode, video and audio are disabled, and <code>--keyboard=aoa</code> and <code>--mouse=aoa</code> are implicitly set. However, gamepads are disabled by default, so <code>--gamepad=aoa</code> (or <code>-G</code> in OTG mode) must be explicitly set.</p><p>Therefore, it is possible to run <em>scrcpy</em> with only physical keyboard, mouse and gamepad simulation, as if the computer keyboard, mouse and gamepads were plugged directly to the device via an OTG cable.</p><p>To enable OTG mode:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --otg</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Pass the serial if several USB devices are available</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --otg</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -s</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 0123456789abcdef</span></span></code></pre></div><p>It is possible to disable keyboard or mouse:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --otg</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --keyboard=disabled</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --otg</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --mouse=disabled</span></span></code></pre></div><p>and to enable gamepads:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --otg</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --gamepad=aoa</span></span>
|
||||
@@ -1 +1 @@
|
||||
import{e as a,a as e,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"OTG","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/otg.md","filePath":"en/reference/scrcpy/otg.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/otg.md"};function o(p,s,l,h,d,r){return i(),e("div",null,[...s[0]||(s[0]=[t("",19)])])}const y=a(n,[["render",o]]);export{k as __pageData,y as default};
|
||||
import{e as a,a as e,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"OTG","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/otg.md","filePath":"en/reference/scrcpy/otg.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/otg.md"};function o(p,s,l,h,d,r){return i(),e("div",null,[...s[0]||(s[0]=[t("",19)])])}const y=a(n,[["render",o]]);export{k as __pageData,y as default};
|
||||
@@ -1,4 +1,4 @@
|
||||
import{e as a,a as s,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Recording","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/recording.md","filePath":"en/reference/scrcpy/recording.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/recording.md"};function l(p,i,o,d,r,h){return e(),s("div",null,[...i[0]||(i[0]=[t(`<h1 id="recording" tabindex="-1">Recording <a class="header-anchor" href="#recording" aria-label="Permalink to "Recording""></a></h1><p>To record video and audio streams while mirroring:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --record=file.mp4</span></span>
|
||||
import{e as a,a as s,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Recording","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/recording.md","filePath":"en/reference/scrcpy/recording.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/recording.md"};function l(p,i,o,d,r,h){return e(),s("div",null,[...i[0]||(i[0]=[t(`<h1 id="recording" tabindex="-1">Recording <a class="header-anchor" href="#recording" aria-label="Permalink to "Recording""></a></h1><p>To record video and audio streams while mirroring:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --record=file.mp4</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -r</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> file.mkv</span></span></code></pre></div><p>To record only the video:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --no-audio</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --record=file.mp4</span></span></code></pre></div><p>To record only the audio:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --no-video</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --record=file.opus</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --no-video</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --audio-codec=aac</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --record=file.aac</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --no-video</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --audio-codec=flac</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --record=file.flac</span></span>
|
||||
@@ -1 +1 @@
|
||||
import{e as a,a as s,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Recording","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/recording.md","filePath":"en/reference/scrcpy/recording.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/recording.md"};function l(p,i,o,d,r,h){return e(),s("div",null,[...i[0]||(i[0]=[t("",28)])])}const g=a(n,[["render",l]]);export{k as __pageData,g as default};
|
||||
import{e as a,a as s,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Recording","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/recording.md","filePath":"en/reference/scrcpy/recording.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/recording.md"};function l(p,i,o,d,r,h){return e(),s("div",null,[...i[0]||(i[0]=[t("",28)])])}const g=a(n,[["render",l]]);export{k as __pageData,g as default};
|
||||
@@ -1,4 +1,4 @@
|
||||
import{e,a as d,o as l,ag as r}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"Shortcuts","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/shortcuts.md","filePath":"en/reference/scrcpy/shortcuts.md","lastUpdated":1768410455000}'),s={name:"reference/scrcpy/shortcuts.md"};function k(i,t,b,a,o,n){return l(),d("div",null,[...t[0]||(t[0]=[r(`<h1 id="shortcuts" tabindex="-1">Shortcuts <a class="header-anchor" href="#shortcuts" aria-label="Permalink to "Shortcuts""></a></h1><p>Actions can be performed on the scrcpy window using keyboard and mouse shortcuts.</p><p>In the following list, <kbd>MOD</kbd> is the shortcut modifier. By default, it's (left) <kbd>Alt</kbd> or (left) <kbd>Super</kbd>.</p><p>It can be changed using <code>--shortcut-mod</code>. Possible keys are <code>lctrl</code>, <code>rctrl</code>, <code>lalt</code>, <code>ralt</code>, <code>lsuper</code> and <code>rsuper</code>. For example:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># use RCtrl for shortcuts</span></span>
|
||||
import{e,a as d,o as l,ag as r}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"Shortcuts","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/shortcuts.md","filePath":"en/reference/scrcpy/shortcuts.md","lastUpdated":1768410818000}'),s={name:"reference/scrcpy/shortcuts.md"};function k(i,t,b,a,o,n){return l(),d("div",null,[...t[0]||(t[0]=[r(`<h1 id="shortcuts" tabindex="-1">Shortcuts <a class="header-anchor" href="#shortcuts" aria-label="Permalink to "Shortcuts""></a></h1><p>Actions can be performed on the scrcpy window using keyboard and mouse shortcuts.</p><p>In the following list, <kbd>MOD</kbd> is the shortcut modifier. By default, it's (left) <kbd>Alt</kbd> or (left) <kbd>Super</kbd>.</p><p>It can be changed using <code>--shortcut-mod</code>. Possible keys are <code>lctrl</code>, <code>rctrl</code>, <code>lalt</code>, <code>ralt</code>, <code>lsuper</code> and <code>rsuper</code>. For example:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># use RCtrl for shortcuts</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --shortcut-mod=rctrl</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># use either LCtrl or LSuper for shortcuts</span></span>
|
||||
@@ -1 +1 @@
|
||||
import{e,a as d,o as l,ag as r}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"Shortcuts","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/shortcuts.md","filePath":"en/reference/scrcpy/shortcuts.md","lastUpdated":1768410455000}'),s={name:"reference/scrcpy/shortcuts.md"};function k(i,t,b,a,o,n){return l(),d("div",null,[...t[0]||(t[0]=[r("",11)])])}const h=e(s,[["render",k]]);export{p as __pageData,h as default};
|
||||
import{e,a as d,o as l,ag as r}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"Shortcuts","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/shortcuts.md","filePath":"en/reference/scrcpy/shortcuts.md","lastUpdated":1768410818000}'),s={name:"reference/scrcpy/shortcuts.md"};function k(i,t,b,a,o,n){return l(),d("div",null,[...t[0]||(t[0]=[r("",11)])])}const h=e(s,[["render",k]]);export{p as __pageData,h as default};
|
||||
@@ -1,4 +1,4 @@
|
||||
import{e as i,a,o as e,ag as n}from"./chunks/framework.DCs21iJA.js";const c=JSON.parse('{"title":"Tunnels","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/tunnels.md","filePath":"en/reference/scrcpy/tunnels.md","lastUpdated":1768410455000}'),t={name:"reference/scrcpy/tunnels.md"};function l(h,s,p,k,r,d){return e(),a("div",null,[...s[0]||(s[0]=[n(`<h1 id="tunnels" tabindex="-1">Tunnels <a class="header-anchor" href="#tunnels" aria-label="Permalink to "Tunnels""></a></h1><p>Scrcpy is designed to mirror local Android devices. Tunnels allow to connect to a remote device (e.g. over the Internet).</p><p>To connect to a remote device, it is possible to connect a local <code>adb</code> client to a remote <code>adb</code> server (provided they use the same version of the <em>adb</em> protocol).</p><h2 id="remote-adb-server" tabindex="-1">Remote ADB server <a class="header-anchor" href="#remote-adb-server" aria-label="Permalink to "Remote ADB server""></a></h2><p>To connect to a remote <em>adb server</em>, make the server listen on all interfaces:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">adb</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> kill-server</span></span>
|
||||
import{e as i,a,o as e,ag as n}from"./chunks/framework.DCs21iJA.js";const c=JSON.parse('{"title":"Tunnels","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/tunnels.md","filePath":"en/reference/scrcpy/tunnels.md","lastUpdated":1768410818000}'),t={name:"reference/scrcpy/tunnels.md"};function l(h,s,p,k,r,d){return e(),a("div",null,[...s[0]||(s[0]=[n(`<h1 id="tunnels" tabindex="-1">Tunnels <a class="header-anchor" href="#tunnels" aria-label="Permalink to "Tunnels""></a></h1><p>Scrcpy is designed to mirror local Android devices. Tunnels allow to connect to a remote device (e.g. over the Internet).</p><p>To connect to a remote device, it is possible to connect a local <code>adb</code> client to a remote <code>adb</code> server (provided they use the same version of the <em>adb</em> protocol).</p><h2 id="remote-adb-server" tabindex="-1">Remote ADB server <a class="header-anchor" href="#remote-adb-server" aria-label="Permalink to "Remote ADB server""></a></h2><p>To connect to a remote <em>adb server</em>, make the server listen on all interfaces:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">adb</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> kill-server</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">adb</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -a</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> nodaemon</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> server</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> start</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># keep this open</span></span></code></pre></div><p><strong>Warning: all communications between clients and the <em>adb server</em> are unencrypted.</strong></p><p>Suppose that this server is accessible at 192.168.1.2. Then, from another terminal, run <code>scrcpy</code>:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># in bash</span></span>
|
||||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ADB_SERVER_SOCKET</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">tcp:192.168.1.2:5037</span></span>
|
||||
@@ -1 +1 @@
|
||||
import{e as i,a,o as e,ag as n}from"./chunks/framework.DCs21iJA.js";const c=JSON.parse('{"title":"Tunnels","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/tunnels.md","filePath":"en/reference/scrcpy/tunnels.md","lastUpdated":1768410455000}'),t={name:"reference/scrcpy/tunnels.md"};function l(h,s,p,k,r,d){return e(),a("div",null,[...s[0]||(s[0]=[n("",29)])])}const g=i(t,[["render",l]]);export{c as __pageData,g as default};
|
||||
import{e as i,a,o as e,ag as n}from"./chunks/framework.DCs21iJA.js";const c=JSON.parse('{"title":"Tunnels","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/tunnels.md","filePath":"en/reference/scrcpy/tunnels.md","lastUpdated":1768410818000}'),t={name:"reference/scrcpy/tunnels.md"};function l(h,s,p,k,r,d){return e(),a("div",null,[...s[0]||(s[0]=[n("",29)])])}const g=i(t,[["render",l]]);export{c as __pageData,g as default};
|
||||
@@ -1,4 +1,4 @@
|
||||
import{e,a as i,o as a,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Video4Linux","description":"","frontmatter":{"title":"Video4Linux"},"headers":[],"relativePath":"reference/scrcpy/v4l2.md","filePath":"en/reference/scrcpy/v4l2.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/v4l2.md"};function l(p,s,o,d,h,c){return a(),i("div",null,[...s[0]||(s[0]=[t(`<h1 id="video4linux" tabindex="-1">Video4Linux <a class="header-anchor" href="#video4linux" aria-label="Permalink to "Video4Linux""></a></h1><p>On Linux, it is possible to send the video stream to a <a href="https://en.wikipedia.org/wiki/Video4Linux" target="_blank" rel="noreferrer">v4l2</a> loopback device, so that the Android device can be opened like a webcam by any v4l2-capable tool.</p><p>The module <code>v4l2loopback</code> must be installed:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> v4l2loopback-dkms</span></span></code></pre></div><p>To create a v4l2 device:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> modprobe</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> v4l2loopback</span></span></code></pre></div><p>This will create a new video device in <code>/dev/videoN</code>, where <code>N</code> is an integer (more <a href="https://github.com/umlaeute/v4l2loopback#options" target="_blank" rel="noreferrer">options</a> are available to create several devices or devices with specific IDs).</p><p>If you encounter problems detecting your device with Chrome/WebRTC, you can try <code>exclusive_caps</code> mode:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>sudo modprobe v4l2loopback exclusive_caps=1</span></span></code></pre></div><p>To list the enabled devices:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># requires v4l-utils package</span></span>
|
||||
import{e,a as i,o as a,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Video4Linux","description":"","frontmatter":{"title":"Video4Linux"},"headers":[],"relativePath":"reference/scrcpy/v4l2.md","filePath":"en/reference/scrcpy/v4l2.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/v4l2.md"};function l(p,s,o,d,h,c){return a(),i("div",null,[...s[0]||(s[0]=[t(`<h1 id="video4linux" tabindex="-1">Video4Linux <a class="header-anchor" href="#video4linux" aria-label="Permalink to "Video4Linux""></a></h1><p>On Linux, it is possible to send the video stream to a <a href="https://en.wikipedia.org/wiki/Video4Linux" target="_blank" rel="noreferrer">v4l2</a> loopback device, so that the Android device can be opened like a webcam by any v4l2-capable tool.</p><p>The module <code>v4l2loopback</code> must be installed:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> v4l2loopback-dkms</span></span></code></pre></div><p>To create a v4l2 device:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> modprobe</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> v4l2loopback</span></span></code></pre></div><p>This will create a new video device in <code>/dev/videoN</code>, where <code>N</code> is an integer (more <a href="https://github.com/umlaeute/v4l2loopback#options" target="_blank" rel="noreferrer">options</a> are available to create several devices or devices with specific IDs).</p><p>If you encounter problems detecting your device with Chrome/WebRTC, you can try <code>exclusive_caps</code> mode:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>sudo modprobe v4l2loopback exclusive_caps=1</span></span></code></pre></div><p>To list the enabled devices:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># requires v4l-utils package</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">v4l2-ctl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --list-devices</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># simple but might be sufficient</span></span>
|
||||
@@ -1 +1 @@
|
||||
import{e,a as i,o as a,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Video4Linux","description":"","frontmatter":{"title":"Video4Linux"},"headers":[],"relativePath":"reference/scrcpy/v4l2.md","filePath":"en/reference/scrcpy/v4l2.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/v4l2.md"};function l(p,s,o,d,h,c){return a(),i("div",null,[...s[0]||(s[0]=[t("",21)])])}const v=e(n,[["render",l]]);export{k as __pageData,v as default};
|
||||
import{e,a as i,o as a,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Video4Linux","description":"","frontmatter":{"title":"Video4Linux"},"headers":[],"relativePath":"reference/scrcpy/v4l2.md","filePath":"en/reference/scrcpy/v4l2.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/v4l2.md"};function l(p,s,o,d,h,c){return a(),i("div",null,[...s[0]||(s[0]=[t("",21)])])}const v=e(n,[["render",l]]);export{k as __pageData,v as default};
|
||||
@@ -1,4 +1,4 @@
|
||||
import{e as i,a,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Video","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/video.md","filePath":"en/reference/scrcpy/video.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/video.md"};function p(l,s,h,r,o,d){return e(),a("div",null,[...s[0]||(s[0]=[t(`<h1 id="video" tabindex="-1">Video <a class="header-anchor" href="#video" aria-label="Permalink to "Video""></a></h1><h2 id="source" tabindex="-1">Source <a class="header-anchor" href="#source" aria-label="Permalink to "Source""></a></h2><p>By default, scrcpy mirrors the device screen.</p><p>It is possible to capture the device camera instead.</p><p>See the dedicated <a href="/reference/scrcpy/camera">camera</a> page.</p><h2 id="size" tabindex="-1">Size <a class="header-anchor" href="#size" aria-label="Permalink to "Size""></a></h2><p>By default, scrcpy attempts to mirror at the Android device resolution.</p><p>It might be useful to mirror at a lower definition to increase performance. To limit both width and height to some maximum value (here 1024):</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --max-size=1024</span></span>
|
||||
import{e as i,a,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Video","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/video.md","filePath":"en/reference/scrcpy/video.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/video.md"};function p(l,s,h,r,o,d){return e(),a("div",null,[...s[0]||(s[0]=[t(`<h1 id="video" tabindex="-1">Video <a class="header-anchor" href="#video" aria-label="Permalink to "Video""></a></h1><h2 id="source" tabindex="-1">Source <a class="header-anchor" href="#source" aria-label="Permalink to "Source""></a></h2><p>By default, scrcpy mirrors the device screen.</p><p>It is possible to capture the device camera instead.</p><p>See the dedicated <a href="/reference/scrcpy/camera">camera</a> page.</p><h2 id="size" tabindex="-1">Size <a class="header-anchor" href="#size" aria-label="Permalink to "Size""></a></h2><p>By default, scrcpy attempts to mirror at the Android device resolution.</p><p>It might be useful to mirror at a lower definition to increase performance. To limit both width and height to some maximum value (here 1024):</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --max-size=1024</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -m</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 1024</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # short version</span></span></code></pre></div><p>The other dimension is computed so that the Android device aspect ratio is preserved. That way, a device in 1920×1080 will be mirrored at 1024×576.</p><p>If encoding fails, scrcpy automatically tries again with a lower definition (unless <code>--no-downsize-on-error</code> is enabled).</p><p>For camera mirroring, the <code>--max-size</code> value is used to select the camera source size instead (among the available resolutions).</p><h2 id="bit-rate" tabindex="-1">Bit rate <a class="header-anchor" href="#bit-rate" aria-label="Permalink to "Bit rate""></a></h2><p>The default video bit rate is 8 Mbps. To change it:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --video-bit-rate=2M</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --video-bit-rate=2000000</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # equivalent</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -b</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 2M</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # short version</span></span></code></pre></div><h2 id="frame-rate" tabindex="-1">Frame rate <a class="header-anchor" href="#frame-rate" aria-label="Permalink to "Frame rate""></a></h2><p>The capture frame rate can be limited:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --max-fps=15</span></span></code></pre></div><p>The actual capture frame rate may be printed to the console:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>scrcpy --print-fps</span></span></code></pre></div><p>It may also be enabled or disabled at anytime with <kbd>MOD</kbd>+<kbd>i</kbd> (see <a href="/reference/scrcpy/shortcuts">shortcuts</a>).</p><p>The frame rate is intrinsically variable: a new frame is produced only when the screen content changes. For example, if you play a fullscreen video at 24fps on your device, you should not get more than 24 frames per second in scrcpy.</p><h2 id="codec" tabindex="-1">Codec <a class="header-anchor" href="#codec" aria-label="Permalink to "Codec""></a></h2><p>The video codec can be selected. The possible values are <code>h264</code> (default), <code>h265</code> and <code>av1</code>:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --video-codec=h264</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # default</span></span>
|
||||
@@ -1 +1 @@
|
||||
import{e as i,a,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Video","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/video.md","filePath":"en/reference/scrcpy/video.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/video.md"};function p(l,s,h,r,o,d){return e(),a("div",null,[...s[0]||(s[0]=[t("",80)])])}const y=i(n,[["render",p]]);export{k as __pageData,y as default};
|
||||
import{e as i,a,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Video","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/video.md","filePath":"en/reference/scrcpy/video.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/video.md"};function p(l,s,h,r,o,d){return e(),a("div",null,[...s[0]||(s[0]=[t("",80)])])}const y=i(n,[["render",p]]);export{k as __pageData,y as default};
|
||||
@@ -1,4 +1,4 @@
|
||||
import{e as s,a as i,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const y=JSON.parse('{"title":"Virtual display","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/virtual_display.md","filePath":"en/reference/scrcpy/virtual_display.md","lastUpdated":1768410455000}'),l={name:"reference/scrcpy/virtual_display.md"};function p(n,a,d,r,o,h){return e(),i("div",null,[...a[0]||(a[0]=[t(`<h1 id="virtual-display" tabindex="-1">Virtual display <a class="header-anchor" href="#virtual-display" aria-label="Permalink to "Virtual display""></a></h1><h2 id="new-display" tabindex="-1">New display <a class="header-anchor" href="#new-display" aria-label="Permalink to "New display""></a></h2><p>To mirror a new virtual display instead of the device screen:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --new-display=1920x1080</span></span>
|
||||
import{e as s,a as i,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const y=JSON.parse('{"title":"Virtual display","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/virtual_display.md","filePath":"en/reference/scrcpy/virtual_display.md","lastUpdated":1768410818000}'),l={name:"reference/scrcpy/virtual_display.md"};function p(n,a,d,r,o,h){return e(),i("div",null,[...a[0]||(a[0]=[t(`<h1 id="virtual-display" tabindex="-1">Virtual display <a class="header-anchor" href="#virtual-display" aria-label="Permalink to "Virtual display""></a></h1><h2 id="new-display" tabindex="-1">New display <a class="header-anchor" href="#new-display" aria-label="Permalink to "New display""></a></h2><p>To mirror a new virtual display instead of the device screen:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --new-display=1920x1080</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --new-display=1920x1080/420</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # force 420 dpi</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --new-display</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # use the main display size and density</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --new-display=/240</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # use the main display size and 240 dpi</span></span></code></pre></div><p>The new virtual display is destroyed on exit.</p><h2 id="start-app" tabindex="-1">Start app <a class="header-anchor" href="#start-app" aria-label="Permalink to "Start app""></a></h2><p>On some devices, a launcher is available in the virtual display.</p><p>When no launcher is available (or if is explicitly disabled by <a href="#system-decorations"><code>--no-vd-system-decorations</code></a>), the virtual display is empty. In that case, you must <a href="/reference/scrcpy/device#start-android-app">start an Android app</a>.</p><p>For example:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --new-display=1920x1080</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --start-app=org.videolan.vlc</span></span></code></pre></div><p>The app may itself be a launcher. For example, to run the open source <a href="https://f-droid.org/en/packages/org.fossify.home/" target="_blank" rel="noreferrer">Fossify Launcher</a>:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --new-display=1920x1080</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --no-vd-system-decorations</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --start-app=org.fossify.home</span></span></code></pre></div><h2 id="system-decorations" tabindex="-1">System decorations <a class="header-anchor" href="#system-decorations" aria-label="Permalink to "System decorations""></a></h2><p>By default, virtual display system decorations are enabled. To disable them, use <code>--no-vd-system-decorations</code>:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>scrcpy --new-display --no-vd-system-decorations</span></span></code></pre></div><p>This is useful for some devices which might display a broken UI, or to disable any default launcher UI available in virtual displays.</p><p>Note that if no app is started, no content will be rendered, so no video frame will be produced at all.</p><h2 id="destroy-on-close" tabindex="-1">Destroy on close <a class="header-anchor" href="#destroy-on-close" aria-label="Permalink to "Destroy on close""></a></h2><p>By default, when the virtual display is closed, the running apps are destroyed.</p><p>To move them to the main display instead, use:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>scrcpy --new-display --no-vd-destroy-content</span></span></code></pre></div><h2 id="display-ime-policy" tabindex="-1">Display IME policy <a class="header-anchor" href="#display-ime-policy" aria-label="Permalink to "Display IME policy""></a></h2><p>By default, the virtual display IME appears on the default display.</p><p>To make it appear on the local display, use <code>--display-ime-policy=local</code>:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --display-id=1</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --display-ime-policy=local</span></span>
|
||||
@@ -1 +1 @@
|
||||
import{e as s,a as i,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const y=JSON.parse('{"title":"Virtual display","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/virtual_display.md","filePath":"en/reference/scrcpy/virtual_display.md","lastUpdated":1768410455000}'),l={name:"reference/scrcpy/virtual_display.md"};function p(n,a,d,r,o,h){return e(),i("div",null,[...a[0]||(a[0]=[t("",25)])])}const k=s(l,[["render",p]]);export{y as __pageData,k as default};
|
||||
import{e as s,a as i,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const y=JSON.parse('{"title":"Virtual display","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/virtual_display.md","filePath":"en/reference/scrcpy/virtual_display.md","lastUpdated":1768410818000}'),l={name:"reference/scrcpy/virtual_display.md"};function p(n,a,d,r,o,h){return e(),i("div",null,[...a[0]||(a[0]=[t("",25)])])}const k=s(l,[["render",p]]);export{y as __pageData,k as default};
|
||||
@@ -1,3 +1,3 @@
|
||||
import{e as a,a as e,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Window","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/window.md","filePath":"en/reference/scrcpy/window.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/window.md"};function l(h,s,d,p,o,r){return i(),e("div",null,[...s[0]||(s[0]=[t(`<h1 id="window" tabindex="-1">Window <a class="header-anchor" href="#window" aria-label="Permalink to "Window""></a></h1><h2 id="disable-window" tabindex="-1">Disable window <a class="header-anchor" href="#disable-window" aria-label="Permalink to "Disable window""></a></h2><p>To disable window (may be useful for recording or for playing audio only):</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --no-window</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --record=file.mp4</span></span>
|
||||
import{e as a,a as e,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Window","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/window.md","filePath":"en/reference/scrcpy/window.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/window.md"};function l(h,s,d,p,o,r){return i(),e("div",null,[...s[0]||(s[0]=[t(`<h1 id="window" tabindex="-1">Window <a class="header-anchor" href="#window" aria-label="Permalink to "Window""></a></h1><h2 id="disable-window" tabindex="-1">Disable window <a class="header-anchor" href="#disable-window" aria-label="Permalink to "Disable window""></a></h2><p>To disable window (may be useful for recording or for playing audio only):</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --no-window</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --record=file.mp4</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Ctrl+C to interrupt</span></span></code></pre></div><h2 id="title" tabindex="-1">Title <a class="header-anchor" href="#title" aria-label="Permalink to "Title""></a></h2><p>By default, the window title is the device model. It can be changed:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --window-title=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'My device'</span></span></code></pre></div><h2 id="position-and-size" tabindex="-1">Position and size <a class="header-anchor" href="#position-and-size" aria-label="Permalink to "Position and size""></a></h2><p>The initial window position and size may be specified:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --window-x=100</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --window-y=100</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --window-width=800</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --window-height=600</span></span></code></pre></div><h2 id="borderless" tabindex="-1">Borderless <a class="header-anchor" href="#borderless" aria-label="Permalink to "Borderless""></a></h2><p>To disable window decorations:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --window-borderless</span></span></code></pre></div><h2 id="always-on-top" tabindex="-1">Always on top <a class="header-anchor" href="#always-on-top" aria-label="Permalink to "Always on top""></a></h2><p>To keep the window always on top:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --always-on-top</span></span></code></pre></div><h2 id="fullscreen" tabindex="-1">Fullscreen <a class="header-anchor" href="#fullscreen" aria-label="Permalink to "Fullscreen""></a></h2><p>The app may be started directly in fullscreen:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --fullscreen</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -f</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # short version</span></span></code></pre></div><p>Fullscreen mode can then be toggled dynamically with <kbd>MOD</kbd>+<kbd>f</kbd> (see <a href="/reference/scrcpy/shortcuts">shortcuts</a>).</p><h2 id="disable-screensaver" tabindex="-1">Disable screensaver <a class="header-anchor" href="#disable-screensaver" aria-label="Permalink to "Disable screensaver""></a></h2><p>By default, <em>scrcpy</em> does not prevent the screensaver from running on the computer. To disable it:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --disable-screensaver</span></span></code></pre></div>`,23)])])}const b=a(n,[["render",l]]);export{k as __pageData,b as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as a,a as e,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Window","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/window.md","filePath":"en/reference/scrcpy/window.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/window.md"};function l(h,s,d,p,o,r){return i(),e("div",null,[...s[0]||(s[0]=[t("",23)])])}const b=a(n,[["render",l]]);export{k as __pageData,b as default};
|
||||
import{e as a,a as e,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"Window","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/window.md","filePath":"en/reference/scrcpy/window.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/window.md"};function l(h,s,d,p,o,r){return i(),e("div",null,[...s[0]||(s[0]=[t("",23)])])}const b=a(n,[["render",l]]);export{k as __pageData,b as default};
|
||||
@@ -1,3 +1,3 @@
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"On Windows","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/windows.md","filePath":"en/reference/scrcpy/windows.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/windows.md"};function o(l,e,r,c,p,h){return i(),s("div",null,[...e[0]||(e[0]=[t(`<h1 id="on-windows" tabindex="-1">On Windows <a class="header-anchor" href="#on-windows" aria-label="Permalink to "On Windows""></a></h1><h2 id="install" tabindex="-1">Install <a class="header-anchor" href="#install" aria-label="Permalink to "Install""></a></h2><h3 id="from-the-official-release" tabindex="-1">From the official release <a class="header-anchor" href="#from-the-official-release" aria-label="Permalink to "From the official release""></a></h3><p>Download the <a href="https://github.com/Genymobile/scrcpy/releases/latest" target="_blank" rel="noreferrer">latest release</a>:</p><ul><li><a href="https://github.com/Genymobile/scrcpy/releases/download/v3.2/scrcpy-win64-v3.2.zip" target="_blank" rel="noreferrer"><code>scrcpy-win64-v3.2.zip</code></a> (64-bit) <sub>SHA-256: <code>eaa27133e0520979873ba57ad651560a4cc2618373bd05450b23a84d32beafd0</code></sub></li><li><a href="https://github.com/Genymobile/scrcpy/releases/download/v3.2/scrcpy-win32-v3.2.zip" target="_blank" rel="noreferrer"><code>scrcpy-win32-v3.2.zip</code></a> (32-bit) <sub>SHA-256: <code>4a3407d7f0c2c8a03e22a12cf0b5e1e585a5056fe23c8e5cf3252207c6fa8357</code></sub></li></ul><p>and extract it.</p><h3 id="from-a-package-manager" tabindex="-1">From a package manager <a class="header-anchor" href="#from-a-package-manager" aria-label="Permalink to "From a package manager""></a></h3><p>From <a href="https://github.com/microsoft/winget-cli" target="_blank" rel="noreferrer">WinGet</a> (ADB and other dependencies will be installed alongside scrcpy):</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">winget</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --exact</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Genymobile.scrcpy</span></span></code></pre></div><p>From <a href="https://chocolatey.org/" target="_blank" rel="noreferrer">Chocolatey</a>:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">choco</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> scrcpy</span></span>
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"On Windows","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/windows.md","filePath":"en/reference/scrcpy/windows.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/windows.md"};function o(l,e,r,c,p,h){return i(),s("div",null,[...e[0]||(e[0]=[t(`<h1 id="on-windows" tabindex="-1">On Windows <a class="header-anchor" href="#on-windows" aria-label="Permalink to "On Windows""></a></h1><h2 id="install" tabindex="-1">Install <a class="header-anchor" href="#install" aria-label="Permalink to "Install""></a></h2><h3 id="from-the-official-release" tabindex="-1">From the official release <a class="header-anchor" href="#from-the-official-release" aria-label="Permalink to "From the official release""></a></h3><p>Download the <a href="https://github.com/Genymobile/scrcpy/releases/latest" target="_blank" rel="noreferrer">latest release</a>:</p><ul><li><a href="https://github.com/Genymobile/scrcpy/releases/download/v3.2/scrcpy-win64-v3.2.zip" target="_blank" rel="noreferrer"><code>scrcpy-win64-v3.2.zip</code></a> (64-bit) <sub>SHA-256: <code>eaa27133e0520979873ba57ad651560a4cc2618373bd05450b23a84d32beafd0</code></sub></li><li><a href="https://github.com/Genymobile/scrcpy/releases/download/v3.2/scrcpy-win32-v3.2.zip" target="_blank" rel="noreferrer"><code>scrcpy-win32-v3.2.zip</code></a> (32-bit) <sub>SHA-256: <code>4a3407d7f0c2c8a03e22a12cf0b5e1e585a5056fe23c8e5cf3252207c6fa8357</code></sub></li></ul><p>and extract it.</p><h3 id="from-a-package-manager" tabindex="-1">From a package manager <a class="header-anchor" href="#from-a-package-manager" aria-label="Permalink to "From a package manager""></a></h3><p>From <a href="https://github.com/microsoft/winget-cli" target="_blank" rel="noreferrer">WinGet</a> (ADB and other dependencies will be installed alongside scrcpy):</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">winget</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --exact</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Genymobile.scrcpy</span></span></code></pre></div><p>From <a href="https://chocolatey.org/" target="_blank" rel="noreferrer">Chocolatey</a>:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">choco</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> scrcpy</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">choco</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> adb</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # if you don't have it yet</span></span></code></pre></div><p>From <a href="https://scoop.sh" target="_blank" rel="noreferrer">Scoop</a>:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scoop</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> scrcpy</span></span>
|
||||
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scoop</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> adb</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # if you don't have it yet</span></span></code></pre></div><p><em>See <a href="/reference/scrcpy/build">build.md</a> to build and install the app manually.</em></p><h2 id="run" tabindex="-1">Run <a class="header-anchor" href="#run" aria-label="Permalink to "Run""></a></h2><p><em>Make sure that your device meets the <a href="/reference/scrcpy/#prerequisites">prerequisites</a>.</em></p><p>Scrcpy is a command line application: it is mainly intended to be executed from a terminal with command line arguments.</p><p>To open a terminal at the expected location, double-click on <code>open_a_terminal_here.bat</code> in your scrcpy directory, then type your command. For example, without arguments:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span></span></code></pre></div><p>or with arguments (here to disable audio and record to <code>file.mkv</code>):</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>scrcpy --no-audio --record=file.mkv</span></span></code></pre></div><p>Documentation for command line arguments is available:</p><ul><li><code>scrcpy --help</code></li><li>on <a href="/reference/scrcpy/">github</a></li></ul><p>To start scrcpy directly without opening a terminal, double-click on one of these files:</p><ul><li><code>scrcpy-console.bat</code>: start with a terminal open (it will close when scrcpy terminates, unless an error occurs);</li><li><code>scrcpy-noconsole.vbs</code>: start without a terminal (but you won't see any error message).</li></ul><p><em>Avoid double-clicking on <code>scrcpy.exe</code> directly: on error, the terminal would close immediately and you won't have time to read any error message (this executable is intended to be run from the terminal). Use <code>scrcpy-console.bat</code> instead.</em></p><p>If you plan to always use the same arguments, create a file <code>myscrcpy.bat</code> (enable <a href="https://www.howtogeek.com/205086/beginner-how-to-make-windows-show-file-extensions/" target="_blank" rel="noreferrer">show file extensions</a> to avoid confusion) containing your command, For example:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">scrcpy</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --prefer-text</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --turn-screen-off</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --stay-awake</span></span></code></pre></div><p>Then just double-click on that file.</p><p>You could also edit (a copy of) <code>scrcpy-console.bat</code> or <code>scrcpy-noconsole.vbs</code> to add some arguments.</p>`,30)])])}const u=a(n,[["render",o]]);export{k as __pageData,u as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"On Windows","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/windows.md","filePath":"en/reference/scrcpy/windows.md","lastUpdated":1768410455000}'),n={name:"reference/scrcpy/windows.md"};function o(l,e,r,c,p,h){return i(),s("div",null,[...e[0]||(e[0]=[t("",30)])])}const u=a(n,[["render",o]]);export{k as __pageData,u as default};
|
||||
import{e as a,a as s,o as i,ag as t}from"./chunks/framework.DCs21iJA.js";const k=JSON.parse('{"title":"On Windows","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/windows.md","filePath":"en/reference/scrcpy/windows.md","lastUpdated":1768410818000}'),n={name:"reference/scrcpy/windows.md"};function o(l,e,r,c,p,h){return i(),s("div",null,[...e[0]||(e[0]=[t("",30)])])}const u=a(n,[["render",o]]);export{k as __pageData,u as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e as r,a,o as t,ag as o}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"更新日志","description":"","frontmatter":{"title":"更新日志"},"headers":[],"relativePath":"zhHans/changelog.md","filePath":"zhHans/changelog.md","lastUpdated":1768410455000}'),i={name:"zhHans/changelog.md"};function c(l,e,h,n,f,b){return t(),a("div",null,[...e[0]||(e[0]=[o("",693)])])}const d=r(i,[["render",c]]);export{m as __pageData,d as default};
|
||||
import{e as r,a,o as t,ag as o}from"./chunks/framework.DCs21iJA.js";const m=JSON.parse('{"title":"更新日志","description":"","frontmatter":{"title":"更新日志"},"headers":[],"relativePath":"zhHans/changelog.md","filePath":"zhHans/changelog.md","lastUpdated":1768410818000}'),i={name:"zhHans/changelog.md"};function c(l,e,h,n,f,b){return t(),a("div",null,[...e[0]||(e[0]=[o("",693)])])}const d=r(i,[["render",c]]);export{m as __pageData,d as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as l,a as n,o,h as t,J as e}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"联系我们","description":"","frontmatter":{"title":"联系我们"},"headers":[],"relativePath":"zhHans/contact.md","filePath":"zhHans/contact.md","lastUpdated":1768410455000}'),r={name:"zhHans/contact.md"};function s(c,a,i,d,u,m){return o(),n("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("邮箱: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("微信: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default};
|
||||
import{e as l,a as n,o,h as t,J as e}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"联系我们","description":"","frontmatter":{"title":"联系我们"},"headers":[],"relativePath":"zhHans/contact.md","filePath":"zhHans/contact.md","lastUpdated":1768410818000}'),r={name:"zhHans/contact.md"};function s(c,a,i,d,u,m){return o(),n("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("邮箱: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("微信: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as l,a as n,o,h as t,J as e}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"联系我们","description":"","frontmatter":{"title":"联系我们"},"headers":[],"relativePath":"zhHans/contact.md","filePath":"zhHans/contact.md","lastUpdated":1768410455000}'),r={name:"zhHans/contact.md"};function s(c,a,i,d,u,m){return o(),n("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("邮箱: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("微信: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default};
|
||||
import{e as l,a as n,o,h as t,J as e}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"联系我们","description":"","frontmatter":{"title":"联系我们"},"headers":[],"relativePath":"zhHans/contact.md","filePath":"zhHans/contact.md","lastUpdated":1768410818000}'),r={name:"zhHans/contact.md"};function s(c,a,i,d,u,m){return o(),n("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("邮箱: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("微信: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as t,a,o as r,ag as l}from"./chunks/framework.DCs21iJA.js";const _=JSON.parse('{"title":"捐赠项目","description":"","frontmatter":{"title":"捐赠项目"},"headers":[],"relativePath":"zhHans/donate.md","filePath":"zhHans/donate.md","lastUpdated":1768410455000}'),s={name:"zhHans/donate.md"};function o(n,e,i,d,p,c){return r(),a("div",null,[...e[0]||(e[0]=[l('<h1 id="捐赠项目♥️" tabindex="-1">捐赠项目♥️ <a class="header-anchor" href="#捐赠项目♥️" aria-label="Permalink to "捐赠项目♥️""></a></h1><p>如果该项目帮到你的话,可以请我喝杯咖啡,让我更有精神完善该项目 😛</p><div style="display:flex;margin-left:-1.5%;"><img src="https://cdn.jsdelivr.net/gh/viarotel/resources@latest/donate/viarotel-wepay.png" alt="viarotel-wepay" width="30%" style="flex:1;"><img src="https://cdn.jsdelivr.net/gh/viarotel/resources@latest/donate/viarotel-alipay.png" alt="viarotel-alipay" width="30%" style="flex:1;"><a href="https://www.paypal.com/paypalme/viarotel" target="_blank" rel="noopener noreferrer" width="30%" style="flex:1;"><img src="https://cdn.jsdelivr.net/gh/viarotel/resources@latest/donate/viarotel-paypal.png" alt="viarotel-paypal"></a></div>',3)])])}const v=t(s,[["render",o]]);export{_ as __pageData,v as default};
|
||||
import{e as t,a,o as r,ag as l}from"./chunks/framework.DCs21iJA.js";const _=JSON.parse('{"title":"捐赠项目","description":"","frontmatter":{"title":"捐赠项目"},"headers":[],"relativePath":"zhHans/donate.md","filePath":"zhHans/donate.md","lastUpdated":1768410818000}'),s={name:"zhHans/donate.md"};function o(n,e,i,d,p,c){return r(),a("div",null,[...e[0]||(e[0]=[l('<h1 id="捐赠项目♥️" tabindex="-1">捐赠项目♥️ <a class="header-anchor" href="#捐赠项目♥️" aria-label="Permalink to "捐赠项目♥️""></a></h1><p>如果该项目帮到你的话,可以请我喝杯咖啡,让我更有精神完善该项目 😛</p><div style="display:flex;margin-left:-1.5%;"><img src="https://cdn.jsdelivr.net/gh/viarotel/resources@latest/donate/viarotel-wepay.png" alt="viarotel-wepay" width="30%" style="flex:1;"><img src="https://cdn.jsdelivr.net/gh/viarotel/resources@latest/donate/viarotel-alipay.png" alt="viarotel-alipay" width="30%" style="flex:1;"><a href="https://www.paypal.com/paypalme/viarotel" target="_blank" rel="noopener noreferrer" width="30%" style="flex:1;"><img src="https://cdn.jsdelivr.net/gh/viarotel/resources@latest/donate/viarotel-paypal.png" alt="viarotel-paypal"></a></div>',3)])])}const v=t(s,[["render",o]]);export{_ as __pageData,v as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as t,a,o as r,ag as l}from"./chunks/framework.DCs21iJA.js";const _=JSON.parse('{"title":"捐赠项目","description":"","frontmatter":{"title":"捐赠项目"},"headers":[],"relativePath":"zhHans/donate.md","filePath":"zhHans/donate.md","lastUpdated":1768410455000}'),s={name:"zhHans/donate.md"};function o(n,e,i,d,p,c){return r(),a("div",null,[...e[0]||(e[0]=[l("",3)])])}const v=t(s,[["render",o]]);export{_ as __pageData,v as default};
|
||||
import{e as t,a,o as r,ag as l}from"./chunks/framework.DCs21iJA.js";const _=JSON.parse('{"title":"捐赠项目","description":"","frontmatter":{"title":"捐赠项目"},"headers":[],"relativePath":"zhHans/donate.md","filePath":"zhHans/donate.md","lastUpdated":1768410818000}'),s={name:"zhHans/donate.md"};function o(n,e,i,d,p,c){return r(),a("div",null,[...e[0]||(e[0]=[l("",3)])])}const v=t(s,[["render",o]]);export{_ as __pageData,v as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e as l,a as i,o as e,ag as r}from"./chunks/framework.DCs21iJA.js";const u=JSON.parse('{"title":"指引","description":"","frontmatter":{"title":"指引"},"headers":[],"relativePath":"zhHans/guide/index.md","filePath":"zhHans/guide/index.md","lastUpdated":1768410455000}'),t={name:"zhHans/guide/index.md"};function c(o,a,h,n,s,d){return e(),i("div",null,[...a[0]||(a[0]=[r("",28)])])}const b=l(t,[["render",c]]);export{u as __pageData,b as default};
|
||||
import{e as l,a as i,o as e,ag as r}from"./chunks/framework.DCs21iJA.js";const u=JSON.parse('{"title":"指引","description":"","frontmatter":{"title":"指引"},"headers":[],"relativePath":"zhHans/guide/index.md","filePath":"zhHans/guide/index.md","lastUpdated":1768410818000}'),t={name:"zhHans/guide/index.md"};function c(o,a,h,n,s,d){return e(),i("div",null,[...a[0]||(a[0]=[r("",28)])])}const b=l(t,[["render",c]]);export{u as __pageData,b as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as l,a as e,o as t,ag as a}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"里程碑","description":"","frontmatter":{"title":"里程碑"},"headers":[],"relativePath":"zhHans/guide/milestones.md","filePath":"zhHans/guide/milestones.md","lastUpdated":1768410455000}'),s={name:"zhHans/guide/milestones.md"};function o(n,i,r,d,_,c){return t(),e("div",null,[...i[0]||(i[0]=[a('<h1 id="里程碑" tabindex="-1">里程碑 <a class="header-anchor" href="#里程碑" aria-label="Permalink to "里程碑""></a></h1><p>优先级从高到低:</p><ul><li>优化Logo设计 ✅</li><li>软件更新功能 ✅</li><li>录制并保存音视频 ✅</li><li>设备快捷交互控制栏 ✅</li><li>自定义Adb和Scrcpy依赖项 ✅</li><li>自定义设备名称 ✅</li><li>导出和导入偏好设置 ✅</li><li>单独设备配置 ✅</li><li>支持macOS和Linux系统 ✅</li><li>国际化支持 ✅</li><li>深色模式 ✅</li><li>反向网络共享(Gnirehtet)✅</li><li>摄像头镜像 ✅</li><li>多屏协同 ✅</li><li>文件推送、屏幕旋转、音频控制 ✅</li><li>批量连接历史设备 ✅</li><li>内置终端 ✅</li><li>自动执行镜像 ✅</li><li>灵活启动镜像 ✅</li><li>批量处理 ✅</li><li>计划任务 ✅</li><li>图形化文件管理器 ✅</li><li>悬浮控制栏 ✅</li><li>增强版录制功能 ✅</li><li>启动APP(多线程) ✅</li><li>主窗口边缘隐藏 ✅</li><li>设备分组(通过备注筛选) ✅</li><li>改进历史设备连接体验 ✅</li><li>文件管理支持上传目录 ✅</li><li>支持添加打开APP到桌面快捷方式(仅Windows) ✅</li><li>支持设备批量启动 ✅</li><li>支持通过可视化编排工具控制各设备的窗口布局 ✅</li><li>整合同一设备的不同连接方式和配置,提升用户体验 ✅</li><li>增强设备文件管理器 ✅</li><li>集成 AutoGLM 无需脚本使用自然语言控制你的安卓设备 ✅</li></ul>',3)])])}const u=l(s,[["render",o]]);export{p as __pageData,u as default};
|
||||
import{e as l,a as e,o as t,ag as a}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"里程碑","description":"","frontmatter":{"title":"里程碑"},"headers":[],"relativePath":"zhHans/guide/milestones.md","filePath":"zhHans/guide/milestones.md","lastUpdated":1768410818000}'),s={name:"zhHans/guide/milestones.md"};function o(n,i,r,d,_,c){return t(),e("div",null,[...i[0]||(i[0]=[a('<h1 id="里程碑" tabindex="-1">里程碑 <a class="header-anchor" href="#里程碑" aria-label="Permalink to "里程碑""></a></h1><p>优先级从高到低:</p><ul><li>优化Logo设计 ✅</li><li>软件更新功能 ✅</li><li>录制并保存音视频 ✅</li><li>设备快捷交互控制栏 ✅</li><li>自定义Adb和Scrcpy依赖项 ✅</li><li>自定义设备名称 ✅</li><li>导出和导入偏好设置 ✅</li><li>单独设备配置 ✅</li><li>支持macOS和Linux系统 ✅</li><li>国际化支持 ✅</li><li>深色模式 ✅</li><li>反向网络共享(Gnirehtet)✅</li><li>摄像头镜像 ✅</li><li>多屏协同 ✅</li><li>文件推送、屏幕旋转、音频控制 ✅</li><li>批量连接历史设备 ✅</li><li>内置终端 ✅</li><li>自动执行镜像 ✅</li><li>灵活启动镜像 ✅</li><li>批量处理 ✅</li><li>计划任务 ✅</li><li>图形化文件管理器 ✅</li><li>悬浮控制栏 ✅</li><li>增强版录制功能 ✅</li><li>启动APP(多线程) ✅</li><li>主窗口边缘隐藏 ✅</li><li>设备分组(通过备注筛选) ✅</li><li>改进历史设备连接体验 ✅</li><li>文件管理支持上传目录 ✅</li><li>支持添加打开APP到桌面快捷方式(仅Windows) ✅</li><li>支持设备批量启动 ✅</li><li>支持通过可视化编排工具控制各设备的窗口布局 ✅</li><li>整合同一设备的不同连接方式和配置,提升用户体验 ✅</li><li>增强设备文件管理器 ✅</li><li>集成 AutoGLM 无需脚本使用自然语言控制你的安卓设备 ✅</li></ul>',3)])])}const u=l(s,[["render",o]]);export{p as __pageData,u as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as l,a as e,o as t,ag as a}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"里程碑","description":"","frontmatter":{"title":"里程碑"},"headers":[],"relativePath":"zhHans/guide/milestones.md","filePath":"zhHans/guide/milestones.md","lastUpdated":1768410455000}'),s={name:"zhHans/guide/milestones.md"};function o(n,i,r,d,_,c){return t(),e("div",null,[...i[0]||(i[0]=[a("",3)])])}const u=l(s,[["render",o]]);export{p as __pageData,u as default};
|
||||
import{e as l,a as e,o as t,ag as a}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"里程碑","description":"","frontmatter":{"title":"里程碑"},"headers":[],"relativePath":"zhHans/guide/milestones.md","filePath":"zhHans/guide/milestones.md","lastUpdated":1768410818000}'),s={name:"zhHans/guide/milestones.md"};function o(n,i,r,d,_,c){return t(),e("div",null,[...i[0]||(i[0]=[a("",3)])])}const u=l(s,[["render",o]]);export{p as __pageData,u as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as l,a,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const _=JSON.parse('{"title":"操作指南","description":"","frontmatter":{"title":"操作指南"},"headers":[],"relativePath":"zhHans/guide/operation.md","filePath":"zhHans/guide/operation.md","lastUpdated":1768410455000}'),r={name:"zhHans/guide/operation.md"};function o(n,i,s,d,h,u){return e(),a("div",null,[...i[0]||(i[0]=[t('<h1 id="设备操作指南" tabindex="-1">设备操作指南 <a class="header-anchor" href="#设备操作指南" aria-label="Permalink to "设备操作指南""></a></h1><h2 id="批量处理" tabindex="-1">批量处理 <a class="header-anchor" href="#批量处理" aria-label="Permalink to "批量处理""></a></h2><ul><li>批量镜像</li><li>批量截屏</li><li>批量安装应用</li><li>批量文件管理</li><li>批量执行脚本</li><li>批量计划任务</li></ul><h2 id="控制模式" tabindex="-1">控制模式 <a class="header-anchor" href="#控制模式" aria-label="Permalink to "控制模式""></a></h2><ul><li>镜像模式</li><li>录制模式</li><li>摄像头录制</li><li>音频录制</li><li>摄像头</li><li>自定义模式</li><li>OTG模式</li></ul><h2 id="设备交互栏" tabindex="-1">设备交互栏 <a class="header-anchor" href="#设备交互栏" aria-label="Permalink to "设备交互栏""></a></h2><ul><li>自动操控(AutoGLM)</li><li>切换应用</li><li>返回主页</li><li>返回键</li><li>启动APP(镜像组)</li><li>关闭屏幕(实验性功能)</li><li>通知中心</li><li>电源键</li><li>屏幕旋转</li><li>音量控制</li><li>截图</li><li>重启设备</li><li>安装APP</li><li>文件管理器</li><li>执行脚本</li><li>计划任务</li><li>Gnirehtet(反向网络共享)</li></ul>',7)])])}const p=l(r,[["render",o]]);export{_ as __pageData,p as default};
|
||||
import{e as l,a,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const _=JSON.parse('{"title":"操作指南","description":"","frontmatter":{"title":"操作指南"},"headers":[],"relativePath":"zhHans/guide/operation.md","filePath":"zhHans/guide/operation.md","lastUpdated":1768410818000}'),r={name:"zhHans/guide/operation.md"};function o(n,i,s,d,h,u){return e(),a("div",null,[...i[0]||(i[0]=[t('<h1 id="设备操作指南" tabindex="-1">设备操作指南 <a class="header-anchor" href="#设备操作指南" aria-label="Permalink to "设备操作指南""></a></h1><h2 id="批量处理" tabindex="-1">批量处理 <a class="header-anchor" href="#批量处理" aria-label="Permalink to "批量处理""></a></h2><ul><li>批量镜像</li><li>批量截屏</li><li>批量安装应用</li><li>批量文件管理</li><li>批量执行脚本</li><li>批量计划任务</li></ul><h2 id="控制模式" tabindex="-1">控制模式 <a class="header-anchor" href="#控制模式" aria-label="Permalink to "控制模式""></a></h2><ul><li>镜像模式</li><li>录制模式</li><li>摄像头录制</li><li>音频录制</li><li>摄像头</li><li>自定义模式</li><li>OTG模式</li></ul><h2 id="设备交互栏" tabindex="-1">设备交互栏 <a class="header-anchor" href="#设备交互栏" aria-label="Permalink to "设备交互栏""></a></h2><ul><li>自动操控(AutoGLM)</li><li>切换应用</li><li>返回主页</li><li>返回键</li><li>启动APP(镜像组)</li><li>关闭屏幕(实验性功能)</li><li>通知中心</li><li>电源键</li><li>屏幕旋转</li><li>音量控制</li><li>截图</li><li>重启设备</li><li>安装APP</li><li>文件管理器</li><li>执行脚本</li><li>计划任务</li><li>Gnirehtet(反向网络共享)</li></ul>',7)])])}const p=l(r,[["render",o]]);export{_ as __pageData,p as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as l,a,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const _=JSON.parse('{"title":"操作指南","description":"","frontmatter":{"title":"操作指南"},"headers":[],"relativePath":"zhHans/guide/operation.md","filePath":"zhHans/guide/operation.md","lastUpdated":1768410455000}'),r={name:"zhHans/guide/operation.md"};function o(n,i,s,d,h,u){return e(),a("div",null,[...i[0]||(i[0]=[t("",7)])])}const p=l(r,[["render",o]]);export{_ as __pageData,p as default};
|
||||
import{e as l,a,o as e,ag as t}from"./chunks/framework.DCs21iJA.js";const _=JSON.parse('{"title":"操作指南","description":"","frontmatter":{"title":"操作指南"},"headers":[],"relativePath":"zhHans/guide/operation.md","filePath":"zhHans/guide/operation.md","lastUpdated":1768410818000}'),r={name:"zhHans/guide/operation.md"};function o(n,i,s,d,h,u){return e(),a("div",null,[...i[0]||(i[0]=[t("",7)])])}const p=l(r,[["render",o]]);export{_ as __pageData,p as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as i,a,o as e,ag as r}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"偏好设置","description":"","frontmatter":{"title":"偏好设置"},"headers":[],"relativePath":"zhHans/guide/preferences.md","filePath":"zhHans/guide/preferences.md","lastUpdated":1768410455000}'),t={name:"zhHans/guide/preferences.md"};function o(h,l,n,d,s,u){return e(),a("div",null,[...l[0]||(l[0]=[r('<h1 id="偏好设置" tabindex="-1">偏好设置 <a class="header-anchor" href="#偏好设置" aria-label="Permalink to "偏好设置""></a></h1><p>持续完善中,目前已支持以下常用配置项</p><h2 id="通用设置" tabindex="-1">通用设置 <a class="header-anchor" href="#通用设置" aria-label="Permalink to "通用设置""></a></h2><ul><li>主题风格</li><li>语言选择</li><li>文件存储路径</li><li>ADB路径</li><li>Scrcpy路径</li><li>Gnirehtet路径</li><li>Scrcpy参数</li><li>Gnirehtet参数</li><li>自动连接设备</li><li>自动执行镜像</li><li>Gnirehtet修复</li><li>调试模式</li><li>悬浮控制栏</li><li>使用系统终端</li><li>首选终端</li><li>并发上限</li></ul><h2 id="视频控制" tabindex="-1">视频控制 <a class="header-anchor" href="#视频控制" aria-label="Permalink to "视频控制""></a></h2><ul><li>禁用视频传输</li><li>最大分辨率</li><li>视频比特率</li><li>刷新频率</li><li>视频编解码器</li><li>显示方向</li><li>旋转角度</li><li>屏幕裁剪</li><li>显示器选择</li><li>视频缓冲区</li><li>接收端(v4l2)缓冲区</li></ul><h2 id="设备控制" tabindex="-1">设备控制 <a class="header-anchor" href="#设备控制" aria-label="Permalink to "设备控制""></a></h2><ul><li>显示触摸点</li><li>保持唤醒状态</li><li>控制时关闭屏幕</li><li>控制结束后关闭屏幕</li><li>禁用控制时自动亮屏</li><li>模拟辅助显示器</li></ul><h2 id="窗口控制" tabindex="-1">窗口控制 <a class="header-anchor" href="#窗口控制" aria-label="Permalink to "窗口控制""></a></h2><ul><li>窗口宽度</li><li>窗口高度</li><li>窗口X坐标</li><li>窗口Y坐标</li><li>无边框模式</li><li>全屏模式</li><li>窗口置顶</li><li>禁用屏幕保护</li></ul><h2 id="音频控制" tabindex="-1">音频控制 <a class="header-anchor" href="#音频控制" aria-label="Permalink to "音频控制""></a></h2><ul><li>禁用音频传输</li><li>保留设备音频</li><li>音频源选择</li><li>音频编解码器</li><li>音频比特率</li><li>音频缓冲区</li><li>音频输出缓冲区</li></ul><h2 id="音视频录制" tabindex="-1">音视频录制 <a class="header-anchor" href="#音视频录制" aria-label="Permalink to "音视频录制""></a></h2><ul><li>录制视频格式</li><li>录制视频方向</li><li>录制时长</li><li>禁用视频回放</li><li>禁用音频回放</li></ul><h2 id="输入控制" tabindex="-1">输入控制 <a class="header-anchor" href="#输入控制" aria-label="Permalink to "输入控制""></a></h2><ul><li>鼠标模式</li><li>鼠标绑定</li><li>键盘模式</li><li>键盘注入方式</li><li>游戏手柄设置</li></ul><h2 id="摄像头控制" tabindex="-1">摄像头控制 <a class="header-anchor" href="#摄像头控制" aria-label="Permalink to "摄像头控制""></a></h2><ul><li>摄像头源选择</li><li>摄像头尺寸</li><li>摄像头比例</li><li>摄像头帧率</li></ul>',18)])])}const p=i(t,[["render",o]]);export{f as __pageData,p as default};
|
||||
import{e as i,a,o as e,ag as r}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"偏好设置","description":"","frontmatter":{"title":"偏好设置"},"headers":[],"relativePath":"zhHans/guide/preferences.md","filePath":"zhHans/guide/preferences.md","lastUpdated":1768410818000}'),t={name:"zhHans/guide/preferences.md"};function o(h,l,n,d,s,u){return e(),a("div",null,[...l[0]||(l[0]=[r('<h1 id="偏好设置" tabindex="-1">偏好设置 <a class="header-anchor" href="#偏好设置" aria-label="Permalink to "偏好设置""></a></h1><p>持续完善中,目前已支持以下常用配置项</p><h2 id="通用设置" tabindex="-1">通用设置 <a class="header-anchor" href="#通用设置" aria-label="Permalink to "通用设置""></a></h2><ul><li>主题风格</li><li>语言选择</li><li>文件存储路径</li><li>ADB路径</li><li>Scrcpy路径</li><li>Gnirehtet路径</li><li>Scrcpy参数</li><li>Gnirehtet参数</li><li>自动连接设备</li><li>自动执行镜像</li><li>Gnirehtet修复</li><li>调试模式</li><li>悬浮控制栏</li><li>使用系统终端</li><li>首选终端</li><li>并发上限</li></ul><h2 id="视频控制" tabindex="-1">视频控制 <a class="header-anchor" href="#视频控制" aria-label="Permalink to "视频控制""></a></h2><ul><li>禁用视频传输</li><li>最大分辨率</li><li>视频比特率</li><li>刷新频率</li><li>视频编解码器</li><li>显示方向</li><li>旋转角度</li><li>屏幕裁剪</li><li>显示器选择</li><li>视频缓冲区</li><li>接收端(v4l2)缓冲区</li></ul><h2 id="设备控制" tabindex="-1">设备控制 <a class="header-anchor" href="#设备控制" aria-label="Permalink to "设备控制""></a></h2><ul><li>显示触摸点</li><li>保持唤醒状态</li><li>控制时关闭屏幕</li><li>控制结束后关闭屏幕</li><li>禁用控制时自动亮屏</li><li>模拟辅助显示器</li></ul><h2 id="窗口控制" tabindex="-1">窗口控制 <a class="header-anchor" href="#窗口控制" aria-label="Permalink to "窗口控制""></a></h2><ul><li>窗口宽度</li><li>窗口高度</li><li>窗口X坐标</li><li>窗口Y坐标</li><li>无边框模式</li><li>全屏模式</li><li>窗口置顶</li><li>禁用屏幕保护</li></ul><h2 id="音频控制" tabindex="-1">音频控制 <a class="header-anchor" href="#音频控制" aria-label="Permalink to "音频控制""></a></h2><ul><li>禁用音频传输</li><li>保留设备音频</li><li>音频源选择</li><li>音频编解码器</li><li>音频比特率</li><li>音频缓冲区</li><li>音频输出缓冲区</li></ul><h2 id="音视频录制" tabindex="-1">音视频录制 <a class="header-anchor" href="#音视频录制" aria-label="Permalink to "音视频录制""></a></h2><ul><li>录制视频格式</li><li>录制视频方向</li><li>录制时长</li><li>禁用视频回放</li><li>禁用音频回放</li></ul><h2 id="输入控制" tabindex="-1">输入控制 <a class="header-anchor" href="#输入控制" aria-label="Permalink to "输入控制""></a></h2><ul><li>鼠标模式</li><li>鼠标绑定</li><li>键盘模式</li><li>键盘注入方式</li><li>游戏手柄设置</li></ul><h2 id="摄像头控制" tabindex="-1">摄像头控制 <a class="header-anchor" href="#摄像头控制" aria-label="Permalink to "摄像头控制""></a></h2><ul><li>摄像头源选择</li><li>摄像头尺寸</li><li>摄像头比例</li><li>摄像头帧率</li></ul>',18)])])}const p=i(t,[["render",o]]);export{f as __pageData,p as default};
|
||||
@@ -1 +1 @@
|
||||
import{e as i,a,o as e,ag as r}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"偏好设置","description":"","frontmatter":{"title":"偏好设置"},"headers":[],"relativePath":"zhHans/guide/preferences.md","filePath":"zhHans/guide/preferences.md","lastUpdated":1768410455000}'),t={name:"zhHans/guide/preferences.md"};function o(h,l,n,d,s,u){return e(),a("div",null,[...l[0]||(l[0]=[r("",18)])])}const p=i(t,[["render",o]]);export{f as __pageData,p as default};
|
||||
import{e as i,a,o as e,ag as r}from"./chunks/framework.DCs21iJA.js";const f=JSON.parse('{"title":"偏好设置","description":"","frontmatter":{"title":"偏好设置"},"headers":[],"relativePath":"zhHans/guide/preferences.md","filePath":"zhHans/guide/preferences.md","lastUpdated":1768410818000}'),t={name:"zhHans/guide/preferences.md"};function o(h,l,n,d,s,u){return e(),a("div",null,[...l[0]||(l[0]=[r("",18)])])}const p=i(t,[["render",o]]);export{f as __pageData,p as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{e as a,a as r,o as t,ag as o}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"快速上手","description":"","frontmatter":{"title":"快速上手"},"headers":[],"relativePath":"zhHans/guide/started.md","filePath":"zhHans/guide/started.md","lastUpdated":1768410455000}'),l={name:"zhHans/guide/started.md"};function i(c,e,h,n,s,u){return t(),r("div",null,[...e[0]||(e[0]=[o("",23)])])}const b=a(l,[["render",i]]);export{p as __pageData,b as default};
|
||||
import{e as a,a as r,o as t,ag as o}from"./chunks/framework.DCs21iJA.js";const p=JSON.parse('{"title":"快速上手","description":"","frontmatter":{"title":"快速上手"},"headers":[],"relativePath":"zhHans/guide/started.md","filePath":"zhHans/guide/started.md","lastUpdated":1768410818000}'),l={name:"zhHans/guide/started.md"};function i(c,e,h,n,s,u){return t(),r("div",null,[...e[0]||(e[0]=[o("",23)])])}const b=a(l,[["render",i]]);export{p as __pageData,b as default};
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user