返回排行榜

NetrisTV/ws-scrcpy

TypeScript

Web client prototype for scrcpy.

androidwebsocketscreenmirroringtypescriptjavascriptscrcpyremote-controlremotecontrolbrowsermobile
Star 增长趋势
Star
2.5k
Forks
556
周增长
Issues
79
1k2k
2019年6月2021年10月2024年3月2026年7月
制品库npmnpm install ws-scrcpy
README

ws scrcpy

Web client for Genymobile/scrcpy and more.

Requirements

Browser must support the following technologies:

  • WebSockets
  • Media Source Extensions and h264 decoding;
  • WebWorkers
  • WebAssembly

Server:

  • Node.js v10+
  • node-gyp (installation)
  • adb executable must be available in the PATH environment variable

Device:

Build and Start

Make sure you have installed node.js, node-gyp and build tools

git clone https://github.com/NetrisTV/ws-scrcpy.git
cd ws-scrcpy

## For stable version find latest tag and switch to it:
# git tag -l
# git checkout vX.Y.Z

npm install
npm start

Supported features

Android

Screen casting

The modified version of Genymobile/scrcpy used to stream H264-video, which then decoded by one of included decoders:

Mse Player

Based on xevokk/h264-converter. HTML5 Video.
Requires Media Source API and video/mp4; codecs="avc1.42E01E" support. Creates mp4 containers from NALU, received from a device, then feeds them to MediaSource. In theory, it can use hardware acceleration.

Broadway Player

Based on mbebenita/Broadway and 131/h264-live-player.
Software video-decoder compiled into wasm-module. Requires WebAssembly and preferably WebGL support.

TinyH264 Player

Based on udevbe/tinyh264.
Software video-decoder compiled into wasm-module. A slightly updated version of mbebenita/Broadway. Requires WebAssembly, WebWorkers, WebGL support.

WebCodecs Player

Decoding is done by browser built-in (software/hardware) media decoder. Requires WebCodecs support. At the moment, available only in Chromium and derivatives.

Remote control

  • Touch events (including multi-touch)
  • Multi-touch emulation: CTRL to start with center at the center of the screen, SHIFT + CTRL to start with center at the current point
  • Mouse wheel and touchpad vertical/horizontal scrolling
  • Capturing keyboard events
  • Injecting text (ASCII only)
  • Copy to/from device clipboard
  • Device "rotation"

File push

Drag & drop an APK file to push it to the /data/local/tmp directory. You can install it manually from the included xtermjs/xterm.js terminal emulator (see below).

Remote shell

Control your device from adb shell in your browser.

Debug WebPages/WebView

/docs/Devtools.md

File listing

  • List files
  • Upload files by drag & drop
  • Download files

iOS

Experimental Feature: is not built by default (see custom build)

Screen Casting

Requires ws-qvh available in PATH.

Tips for a stable QuickTime-over-USB stream: set the device's Auto-Lock to Never (a locked screen stops the stream), connect the iPhone directly (no USB hub), and do not run a standalone ws-qvh/qvh capture against the same device while ws-scrcpy is streaming — only one process may hold a device.

MJPEG Server

⚠️ Temporarily suspended. After the migration to a standalone Appium (see Remote control) the WDA-MJPEG video path is not wired up and is planned to be restored in a follow-up. iOS screen casting currently runs via ws-qvh (see above).

Enable USE_WDA_MJPEG_SERVER in the build configuration file (see custom build).

Alternative way to stream screen content. It does not require additional software as ws-qvh, but may require more resources as each frame encoded as jpeg image.

Remote control

Device control is provided by appium/WebDriverAgent, driven through a modern Appium server over the W3C WebDriver protocol. ws-scrcpy bundles Appium (it is a dependency, and a postinstall step pins the XCUITest driver into a project-local .appium-home), spawns it as a child process on startup, and forwards control commands to it over HTTP — no global Appium installation is required.

Supported actions:

  • Simple touch
  • Scroll / swipe
  • Home button click
One-time device setup (real iOS device)

WebDriverAgent has to be built, signed and trusted on the device once:

  1. Open the WDA project in Xcode — WebDriverAgent.xcodeproj under .appium-home/node_modules/appium-xcuitest-driver/node_modules/appium-webdriveragent/ (or under $APPIUM_HOME/… if you point Appium elsewhere). Select the WebDriverAgentRunner scheme, set your Team and a unique Bundle Identifier, and run it on the device once (⌘U).
  2. On the device: trust the developer certificate (Settings → General → VPN & Device Management) and enable Developer Mode (Settings → Privacy & Security → Developer Mode, iOS 16+).
  3. (Optional) enable AssistiveTouch: Settings → General → Accessibility.

See Appium's real-device configuration guide for the full WebDriverAgent setup. After this one-time step ws-scrcpy builds and launches WDA on its own.

Be patient on the first control action. Appium builds and launches WebDriverAgent on demand, which can take a couple of minutes the first time — the screen may look unresponsive until WDA is up. A free Apple developer account's provisioning expires every 7 days (re-sign weekly); a paid account avoids this.

iOS control configuration (environment variables)
Variable Purpose
WDA_TEAM_ID Apple Team ID used to sign WebDriverAgent (the certificate's OU)
WDA_SIGNING_ID Signing identity (default Apple Development)
WDA_BUNDLE_ID Unique WDA bundle id, e.g. com.<you>.WebDriverAgentRunner
WDA_PLATFORM_VERSION iOS version of the device (silences a driver warning)
WDA_USE_PREBUILT true to reuse an already built/installed WDA (skip the rebuild)
WS_SCRCPY_DEBUG Verbose logs — surfaces the Appium (incl. xcodebuild) and ws-qvh output in the server console
APPIUM_BIN / APPIUM_HOME / APPIUM_PORT / APPIUM_LOG_LEVEL Override the bundled Appium binary, driver home, port or log level

xcodebuild failed with code 65 almost always means WebDriverAgent could not be signed or launched on the device (untrusted certificate, Developer Mode off, wrong Team ID, or expired provisioning) — it is not a build error in ws-scrcpy. Run with WS_SCRCPY_DEBUG=1 to surface the underlying xcodebuild error and follow the real-device configuration guide.

Custom Build

You can customize project before build by overriding the default configuration in build.config.override.json:

  • INCLUDE_APPL - include code for iOS device tracking and control
  • INCLUDE_GOOG - include code for Android device tracking and control
  • INCLUDE_ADB_SHELL - remote shell for android devices (xtermjs/xterm.js, Tyriar/node-pty)
  • INCLUDE_DEV_TOOLS - dev tools for web pages and web views on android devices
  • INCLUDE_FILE_LISTING - minimalistic file management
  • USE_BROADWAY - include Broadway Player
  • USE_H264_CONVERTER - include Mse Player
  • USE_TINY_H264 - include TinyH264 Player
  • USE_WEBCODECS - include WebCodecs Player
  • USE_WDA_MJPEG_SERVER - configure WebDriverAgent to start MJPEG server (temporarily suspended, see MJPEG Server)
  • USE_QVH_SERVER - include support for ws-qvh
  • SCRCPY_LISTENS_ON_ALL_INTERFACES - WebSocket server in scrcpy-server.jar will listen for connections on all available interfaces. When true, it allows connecting to device directly from a browser. Otherwise, the connection must be established over adb.

Run configuration

You can specify a path to a configuration file in WS_SCRCPY_CONFIG environment variable.

If you want to have another pathname than "/" you can specify it in the WS_SCRCPY_PATHNAME environment variable.

Configuration file format: Configuration.d.ts.

Configuration file example: config.example.yaml.

Known issues

  • The server on the Android Emulator listens on the internal interface and not available from the outside. Select proxy over adb from the interfaces list.
  • TinyH264Player may fail to start, try to reload the page.
  • MsePlayer reports too many dropped frames in quality statistics: needs further investigation.
  • On Safari file upload does not show progress (it works in one piece).
  • iOS screen casting can be slow to start — if the picture does not appear, reload the tab a few times (or replug the device) until the QuickTime stream catches; once it does, it stays stable. An empty player does not necessarily mean it is broken.
  • iOS control: xcodebuild failed with code 65 is a WebDriverAgent signing / launch issue, not a build error — see Remote control.

Security warning

Be advised and keep in mind:

  • There is no encryption between browser and node.js server (you can configure HTTPS).
  • There is no encryption between browser and WebSocket server on android device.
  • There is no authorization on any level.
  • The modified version of scrcpy with integrated WebSocket server is listening for connections on all network interfaces (see custom build).
  • The modified version of scrcpy will keep running after the last client disconnected.

scrcpy websocket fork

Currently, support of WebSocket protocol added to v1.19 of scrcpy

相关仓库
flutter/flutter

Flutter makes it easy and fast to build beautiful apps for mobile and beyond

DartBSD 3-Clause "New" or "Revised" Licensemobileandroid
flutter.dev
177.9k30.7k
Genymobile/scrcpy

Display and control your Android device

CApache License 2.0androidc
146.1k13.5k
react/react-native

A framework for building native applications using React

C++MIT Licenseandroidapp-framework
reactnative.dev
126.2k25.2k
facebook/react-native

A framework for building native applications using React

C++MIT Licenseandroidapp-framework
reactnative.dev
120.9k24.5k
rustdesk/rustdesk

An open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.

Rustcrates.ioGNU Affero General Public License v3.0remote-controlremote-desktop
rustdesk.com
118.6k18.1k
justjavac/free-programming-books-zh_CN

:books: 免费的计算机编程类中文书籍,欢迎投稿

GNU General Public License v3.0pythonjavascript
weibo.com/justjavac
117.7k28.2k
Hack-with-Github/Awesome-Hacking

A collection of various awesome lists for hackers, pentesters and security researchers

Creative Commons Zero v1.0 Universalhackingsecurity
116.6k10.5k
tldr-pages/tldr

Collaborative cheatsheets for console commands 📚.

MarkdownOthershellman-page
tldr.sh
63.2k5.3k
Solido/awesome-flutter

An awesome list that curates the best Flutter libraries, tools, tutorials, articles and more.

Dartflutterawesome-list
60.7k6.9k
2dust/v2rayNG

A V2Ray client for Android, support Xray core and v2fly core

KotlinGNU General Public License v3.0androidproxy
v2rayng.2dust.link
59.9k7.8k
termux/termux-app

Termux - a terminal emulator application for Android OS extendible by variety of packages.

JavaMavenOtherandroidterminal
f-droid.org/en/packages/com.termux
57.9k7k
wasabeef/awesome-android-ui

A curated list of awesome Android UI/UX libraries

MIT Licenseandroidawesome
56.9k10.3k