Last active
July 16, 2024 14:23
-
-
Save thejhh/9ddc7fd384b37ea866fbe8811fa3e13b to your computer and use it in GitHub Desktop.
Screen copy command for Quest 2 and Quest 3 headsets
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# scrcpy for quest 2 and quest 3 | |
# Copyright 2020-2024 Jaakko Heusala <[email protected]> | |
# Version 1 | |
set -e | |
set -x | |
VIDEO_BITRATE=25M | |
PORT=5555 | |
MAX_SIZE=1080 | |
MAX_FPS=30 | |
CROP="" | |
TYPE="quest3" | |
IP="" | |
for ARG in "$@"; do | |
case $ARG in | |
"--" ) break 2;; | |
"-2") TYPE=quest2;; | |
"--type=2") TYPE=quest2;; | |
"--quest-2" ) TYPE=quest2;; | |
"-3") TYPE=quest3;; | |
"--type=3") TYPE=quest3;; | |
"--quest-3") TYPE=quest3;; | |
"--ip="* ) IP="${ARG#*=}";; | |
"--port="* ) PORT="${ARG#*=}";; | |
*) echo >&2 "Invalid option: $@"; exit 1;; | |
esac | |
done | |
if [ quest3 = "$TYPE" ]; then | |
CROP="2064:2208:2064:0" | |
elif [ quest2 = "$TYPE" ]; then | |
CROP="1832:1080:-100:420" | |
fi | |
ARGS=( "--always-on-top" ) | |
if [ -n "$CROP" ]; then ARGS+=( "--crop" "$CROP" ); fi | |
if [ -n "$MAX_SIZE" ]; then ARGS+=( "-m" "$MAX_SIZE" ); fi | |
if [ -n "$VIDEO_BITRATE" ]; then ARGS+=( "-b" "$VIDEO_BITRATE" ); fi | |
if [ -n "$MAX_FPS" ]; then ARGS+=( "--max-fps=$MAX_FPS" ); fi | |
if [ -n "$IP" ]; then ARGS+=( "--tcpip=$IP:$PORT" ); fi | |
set -x | |
exec scrcpy "${ARGS[@]}" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
scrcpy 2.3.1 <https://github.com/Genymobile/scrcpy> | |
Usage: scrcpy [options] | |
Options: | |
--always-on-top | |
Make scrcpy window always on top (above other windows). | |
--audio-bit-rate=value | |
Encode the audio at the given bit rate, expressed in bits/s. Unit | |
suffixes are supported: 'K' (x1000) and 'M' (x1000000). | |
Default is 128K (128000). | |
--audio-buffer=ms | |
Configure the audio buffering delay (in milliseconds). | |
Lower values decrease the latency, but increase the likelyhood of buffer | |
underrun (causing audio glitches). | |
Default is 50. | |
--audio-codec=name | |
Select an audio codec (opus, aac, flac or raw). | |
Default is opus. | |
--audio-codec-options=key[:type]=value[,...] | |
Set a list of comma-separated key:type=value options for the device | |
audio encoder. | |
The possible values for 'type' are 'int' (default), 'long', 'float' and | |
'string'. | |
The list of possible codec options is available in the Android | |
documentation: | |
<https://d.android.com/reference/android/media/MediaFormat> | |
--audio-encoder=name | |
Use a specific MediaCodec audio encoder (depending on the codec provided | |
by --audio-codec). | |
The available encoders can be listed by --list-encoders. | |
--audio-source=source | |
Select the audio source (output or mic). | |
Default is output. | |
--audio-output-buffer=ms | |
Configure the size of the SDL audio output buffer (in milliseconds). | |
If you get "robotic" audio playback, you should test with a higher value | |
(10). Do not change this setting otherwise. | |
Default is 5. | |
-b, --video-bit-rate=value | |
Encode the video at the given bit rate, expressed in bits/s. Unit | |
suffixes are supported: 'K' (x1000) and 'M' (x1000000). | |
Default is 8M (8000000). | |
--camera-ar=ar | |
Select the camera size by its aspect ratio (+/- 10%). | |
Possible values are "sensor" (use the camera sensor aspect ratio), | |
"<num>:<den>" (e.g. "4:3") or "<value>" (e.g. "1.6"). | |
--camera-id=id | |
Specify the device camera id to mirror. | |
The available camera ids can be listed by: | |
scrcpy --list-cameras | |
--camera-facing=facing | |
Select the device camera by its facing direction. | |
Possible values are "front", "back" and "external". | |
--camera-high-speed | |
Enable high-speed camera capture mode. | |
This mode is restricted to specific resolutions and frame rates, listed | |
by --list-camera-sizes. | |
--camera-size=<width>x<height> | |
Specify an explicit camera capture size. | |
--camera-fps=value | |
Specify the camera capture frame rate. | |
If not specified, Android's default frame rate (30 fps) is used. | |
--crop=width:height:x:y | |
Crop the device screen on the server. | |
The values are expressed in the device natural orientation (typically, | |
portrait for a phone, landscape for a tablet). Any --max-size value is | |
computed on the cropped size. | |
-d, --select-usb | |
Use USB device (if there is exactly one, like adb -d). | |
Also see -e (--select-tcpip). | |
--disable-screensaver | |
Disable screensaver while scrcpy is running. | |
--display-buffer=ms | |
Add a buffering delay (in milliseconds) before displaying. This | |
increases latency to compensate for jitter. | |
Default is 0 (no buffering). | |
--display-id=id | |
Specify the device display id to mirror. | |
The available display ids can be listed by: | |
scrcpy --list-displays | |
Default is 0. | |
--display-orientation=value | |
Set the initial display orientation. | |
Possible values are 0, 90, 180, 270, flip0, flip90, flip180 and flip270. | |
The number represents the clockwise rotation in degrees; the "flip" | |
keyword applies a horizontal flip before the rotation. | |
Default is 0. | |
-e, --select-tcpip | |
Use TCP/IP device (if there is exactly one, like adb -e). | |
Also see -d (--select-usb). | |
-f, --fullscreen | |
Start in fullscreen. | |
--force-adb-forward | |
Do not attempt to use "adb reverse" to connect to the device. | |
--forward-all-clicks | |
By default, right-click triggers BACK (or POWER on) and middle-click | |
triggers HOME. This option disables these shortcuts and forwards the | |
clicks to the device instead. | |
-h, --help | |
Print this help. | |
--kill-adb-on-close | |
Kill adb when scrcpy terminates. | |
-K, --hid-keyboard | |
Simulate a physical keyboard by using HID over AOAv2. | |
It provides a better experience for IME users, and allows to generate | |
non-ASCII characters, contrary to the default injection method. | |
It may only work over USB. | |
The keyboard layout must be configured (once and for all) on the device, | |
via Settings -> System -> Languages and input -> Physical keyboard. This | |
settings page can be started directly: `adb shell am start -a | |
android.settings.HARD_KEYBOARD_SETTINGS`. | |
However, the option is only available when the HID keyboard is enabled | |
(or a physical keyboard is connected). | |
Also see --hid-mouse. | |
--legacy-paste | |
Inject computer clipboard text as a sequence of key events on Ctrl+v | |
(like MOD+Shift+v). | |
This is a workaround for some devices not behaving as expected when | |
setting the device clipboard programmatically. | |
--list-cameras | |
List device cameras. | |
--list-camera-sizes | |
List the valid camera capture sizes. | |
--list-displays | |
List device displays. | |
--list-encoders | |
List video and audio encoders available on the device. | |
--lock-video-orientation[=value] | |
Lock capture video orientation to value. | |
Possible values are "unlocked", "initial" (locked to the initial | |
orientation), 0, 90, 180 and 270. The values represent the clockwise | |
rotation from the natural device orientation, in degrees. | |
Default is "unlocked". | |
Passing the option without argument is equivalent to passing "initial". | |
-m, --max-size=value | |
Limit both the width and height of the video to value. The other | |
dimension is computed so that the device aspect-ratio is preserved. | |
Default is 0 (unlimited). | |
-M, --hid-mouse | |
Simulate a physical mouse by using HID over AOAv2. | |
In this mode, the computer mouse is captured to control the device | |
directly (relative mouse mode). | |
LAlt, LSuper or RSuper toggle the capture mode, to give control of the | |
mouse back to the computer. | |
It may only work over USB. | |
Also see --hid-keyboard. | |
--max-fps=value | |
Limit the frame rate of screen capture (officially supported since | |
Android 10, but may work on earlier versions). | |
-n, --no-control | |
Disable device control (mirror the device in read-only). | |
-N, --no-playback | |
Disable video and audio playback on the computer (equivalent to | |
--no-video-playback --no-audio-playback). | |
--no-audio | |
Disable audio forwarding. | |
--no-audio-playback | |
Disable audio playback on the computer. | |
--no-cleanup | |
By default, scrcpy removes the server binary from the device and | |
restores the device state (show touches, stay awake and power mode) on | |
exit. | |
This option disables this cleanup. | |
--no-clipboard-autosync | |
By default, scrcpy automatically synchronizes the computer clipboard to | |
the device clipboard before injecting Ctrl+v, and the device clipboard | |
to the computer clipboard whenever it changes. | |
This option disables this automatic synchronization. | |
--no-downsize-on-error | |
By default, on MediaCodec error, scrcpy automatically tries again with a | |
lower definition. | |
This option disables this behavior. | |
--no-key-repeat | |
Do not forward repeated key events when a key is held down. | |
--no-mipmaps | |
If the renderer is OpenGL 3.0+ or OpenGL ES 2.0+, then mipmaps are | |
automatically generated to improve downscaling quality. This option | |
disables the generation of mipmaps. | |
--no-power-on | |
Do not power on the device on start. | |
--no-video | |
Disable video forwarding. | |
--no-video-playback | |
Disable video playback on the computer. | |
--orientation=value | |
Same as --display-orientation=value --record-orientation=value. | |
--otg | |
Run in OTG mode: simulate physical keyboard and mouse, as if the | |
computer keyboard and mouse were plugged directly to the device via an | |
OTG cable. | |
In this mode, adb (USB debugging) is not necessary, and mirroring is | |
disabled. | |
LAlt, LSuper or RSuper toggle the mouse capture mode, to give control of | |
the mouse back to the computer. | |
If any of --hid-keyboard or --hid-mouse is set, only enable keyboard or | |
mouse respectively, otherwise enable both. | |
It may only work over USB. | |
See --hid-keyboard and --hid-mouse. | |
-p, --port=port[:port] | |
Set the TCP port (range) used by the client to listen. | |
Default is 27183:27199. | |
--pause-on-exit[=mode] | |
Configure pause on exit. Possible values are "true" (always pause on | |
exit), "false" (never pause on exit) and "if-error" (pause only if an | |
error occured). | |
This is useful to prevent the terminal window from automatically | |
closing, so that error messages can be read. | |
Default is "false". | |
Passing the option without argument is equivalent to passing "true". | |
--power-off-on-close | |
Turn the device screen off when closing scrcpy. | |
--prefer-text | |
Inject alpha characters and space as text events instead of key events. | |
This avoids issues when combining multiple keys to enter a special | |
character, but breaks the expected behavior of alpha keys in games | |
(typically WASD). | |
--print-fps | |
Start FPS counter, to print framerate logs to the console. It can be | |
started or stopped at any time with MOD+i. | |
--push-target=path | |
Set the target directory for pushing files to the device by drag & drop. | |
It is passed as is to "adb push". | |
Default is "/sdcard/Download/". | |
-r, --record=file.mp4 | |
Record screen to file. | |
The format is determined by the --record-format option if set, or by the | |
file extension. | |
--raw-key-events | |
Inject key events for all input keys, and ignore text events. | |
--record-format=format | |
Force recording format (mp4, mkv, m4a, mka, opus, aac, flac or wav). | |
--record-orientation=value | |
Set the record orientation. | |
Possible values are 0, 90, 180 and 270. The number represents the | |
clockwise rotation in degrees. | |
Default is 0. | |
--render-driver=name | |
Request SDL to use the given render driver (this is just a hint). | |
Supported names are currently "direct3d", "opengl", "opengles2", | |
"opengles", "metal" and "software". | |
<https://wiki.libsdl.org/SDL_HINT_RENDER_DRIVER> | |
--require-audio | |
By default, scrcpy mirrors only the video when audio capture fails on | |
the device. This option makes scrcpy fail if audio is enabled but does | |
not work. | |
-s, --serial=serial | |
The device serial number. Mandatory only if several devices are | |
connected to adb. | |
-S, --turn-screen-off | |
Turn the device screen off immediately. | |
--shortcut-mod=key[+...][,...] | |
Specify the modifiers to use for scrcpy shortcuts. | |
Possible keys are "lctrl", "rctrl", "lalt", "ralt", "lsuper" and | |
"rsuper". | |
A shortcut can consist in several keys, separated by '+'. Several | |
shortcuts can be specified, separated by ','. | |
For example, to use either LCtrl+LAlt or LSuper for scrcpy shortcuts, | |
pass "lctrl+lalt,lsuper". | |
Default is "lalt,lsuper" (left-Alt or left-Super). | |
-t, --show-touches | |
Enable "show touches" on start, restore the initial value on exit. | |
It only shows physical touches (not clicks from scrcpy). | |
--tcpip[=ip[:port]] | |
Configure and reconnect the device over TCP/IP. | |
If a destination address is provided, then scrcpy connects to this | |
address before starting. The device must listen on the given TCP port | |
(default is 5555). | |
If no destination address is provided, then scrcpy attempts to find the | |
IP address of the current device (typically connected over USB), enables | |
TCP/IP mode, then connects to this address before starting. | |
--time-limit=seconds | |
Set the maximum mirroring time, in seconds. | |
--tunnel-host=ip | |
Set the IP address of the adb tunnel to reach the scrcpy server. This | |
option automatically enables --force-adb-forward. | |
Default is localhost. | |
--tunnel-port=port | |
Set the TCP port of the adb tunnel to reach the scrcpy server. This | |
option automatically enables --force-adb-forward. | |
Default is 0 (not forced): the local port used for establishing the | |
tunnel will be used. | |
-v, --version | |
Print the version of scrcpy. | |
-V, --verbosity=value | |
Set the log level (verbose, debug, info, warn or error). | |
Default is info. | |
--v4l2-sink=/dev/videoN | |
Output to v4l2loopback device. | |
It requires to lock the video orientation (see | |
--lock-video-orientation). | |
This feature is only available on Linux. | |
--v4l2-buffer=ms | |
Add a buffering delay (in milliseconds) before pushing frames. This | |
increases latency to compensate for jitter. | |
This option is similar to --display-buffer, but specific to V4L2 sink. | |
Default is 0 (no buffering). | |
This option is only available on Linux. | |
--video-codec=name | |
Select a video codec (h264, h265 or av1). | |
Default is h264. | |
--video-codec-options=key[:type]=value[,...] | |
Set a list of comma-separated key:type=value options for the device | |
video encoder. | |
The possible values for 'type' are 'int' (default), 'long', 'float' and | |
'string'. | |
The list of possible codec options is available in the Android | |
documentation: | |
<https://d.android.com/reference/android/media/MediaFormat> | |
--video-encoder=name | |
Use a specific MediaCodec video encoder (depending on the codec provided | |
by --video-codec). | |
The available encoders can be listed by --list-encoders. | |
--video-source=source | |
Select the video source (display or camera). | |
Camera mirroring requires Android 12+. | |
Default is display. | |
-w, --stay-awake | |
Keep the device on while scrcpy is running, when the device is plugged | |
in. | |
--window-borderless | |
Disable window decorations (display borderless window). | |
--window-title=text | |
Set a custom window title. | |
--window-x=value | |
Set the initial window horizontal position. | |
Default is "auto". | |
--window-y=value | |
Set the initial window vertical position. | |
Default is "auto". | |
--window-width=value | |
Set the initial window width. | |
Default is 0 (automatic). | |
--window-height=value | |
Set the initial window height. | |
Default is 0 (automatic). | |
Shortcuts: | |
In the following list, MOD is the shortcut modifier. By default, it's (left) | |
Alt or (left) Super, but it can be configured by --shortcut-mod (see above). | |
MOD+f | |
Switch fullscreen mode | |
MOD+Left | |
Rotate display left | |
MOD+Right | |
Rotate display right | |
MOD+Shift+Left | |
MOD+Shift+Right | |
Flip display horizontally | |
MOD+Shift+Up | |
MOD+Shift+Down | |
Flip display vertically | |
MOD+g | |
Resize window to 1:1 (pixel-perfect) | |
MOD+w | |
Double-click on black borders | |
Resize window to remove black borders | |
MOD+h | |
Middle-click | |
Click on HOME | |
MOD+b | |
MOD+Backspace | |
Right-click (when screen is on) | |
Click on BACK | |
MOD+s | |
4th-click | |
Click on APP_SWITCH | |
MOD+m | |
Click on MENU | |
MOD+Up | |
Click on VOLUME_UP | |
MOD+Down | |
Click on VOLUME_DOWN | |
MOD+p | |
Click on POWER (turn screen on/off) | |
Right-click (when screen is off) | |
Power on | |
MOD+o | |
Turn device screen off (keep mirroring) | |
MOD+Shift+o | |
Turn device screen on | |
MOD+r | |
Rotate device screen | |
MOD+n | |
5th-click | |
Expand notification panel | |
MOD+Shift+n | |
Collapse notification panel | |
MOD+c | |
Copy to clipboard (inject COPY keycode, Android >= 7 only) | |
MOD+x | |
Cut to clipboard (inject CUT keycode, Android >= 7 only) | |
MOD+v | |
Copy computer clipboard to device, then paste (inject PASTE keycode, | |
Android >= 7 only) | |
MOD+Shift+v | |
Inject computer clipboard text as a sequence of key events | |
MOD+i | |
Enable/disable FPS counter (print frames/second in logs) | |
Ctrl+click-and-move | |
Pinch-to-zoom from the center of the screen | |
Drag & drop APK file | |
Install APK from computer | |
Drag & drop non-APK file | |
Push file to device (see --push-target) | |
Environment variables: | |
ADB | |
Path to adb executable | |
ANDROID_SERIAL | |
Device serial to use if no selector (-s, -d, -e or --tcpip=<addr>) is | |
specified | |
SCRCPY_ICON_PATH | |
Path to the program icon | |
SCRCPY_SERVER_PATH | |
Path to the server binary | |
Exit status: | |
0 Normal program termination | |
1 Start failure | |
2 Device disconnected while running |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment