Releases: Genymobile/scrcpy
scrcpy v3.3.1
To receive a notification when a new release is available, click on Watch > Custom > Releases at the top.
scrcpy v3.3.1
Changes since v3.3:
- Fix --power-off-on-close (#6146)
- Fix clipboard with --no-clipboard-autosync (#6151)
- Fix --list-apps and --list-cameras (#6165, #6167)
- Fix HID mouse support with SDL precise scrolling (#6156, #6172)
- Add horizontal scrolling support for HID mouse (#6172)
Highlights
Fixes
Some technical changes introduced in scrcpy 3.3 had side effects that broke certain features. This release resolves those issues.
Mouse scrolling
This version also includes several improvements and fixes related to mouse scrolling (#6172).
- BlueSky:
@scrcpy.bsky.social
- Twitter:
@scrcpy_app
- Reddit:
r/scrcpy
scrcpy v3.3
To receive a notification when a new release is available, click on Watch > Custom > Releases at the top.
scrcpy v3.3
Changes since v3.2:
- Associate UHID devices to virtual displays (#4829, #5547, #5557, #6009)
- Fix audio capture (again) on Android 16 (#6021)
- Fix segfault with --no-window without --no-control (#5970)
- Fix default locked capture orientation (#6010)
- Add app name SDL hint (#6107)
- Report specific error for INJECT_EVENT permission (#6080)
- Upgrade platform-tools (adb) to 36.0.0
- Upgrade SDL to 2.32.8
- Upgrade libusb to 1.0.29
- Various technical fixes
Highlights
UHID mouse & virtual displays
On Android >= 15, the mouse pointer now correctly appears on a new virtual display (when running with --new-display --mouse=uhid
). See #6009.
Android 16
Audio capture in scrcpy 3.2 was broken with Android 16 (ironically due to a change intended to fix audio in Android 16 beta). The issue is resolved in this
release.
- BlueSky:
@scrcpy.bsky.social
- Twitter:
@scrcpy_app
- Reddit:
r/scrcpy
scrcpy v3.2
To receive a notification when a new release is available, click on Watch > Custom > Releases at the top.
scrcpy v3.2
Changes since v3.1:
- Add many audio sources (#5870, #5412, #5670)
- Improve/fix camera listing (#5669)
- Add --display-ime-policy (#5703)
- Allow controls with --no-window (#5803, #5804)
- Add workaround for Pico 4 Ultra (#5659)
- Fix rotation after a recent Android 15 upgrade (#5908)
- Fix audio capture on Android 16 (#5698)
- Make static Linux binaries compatible with older versions (#5689)
- Make static macOS binaries compatible with older versions (#5649, #5697)
- Upgrade FFmpeg to 7.1.1
- Upgrade libusb to 1.0.28
- Upgrade SDL to 2.32.2
- Various technical fixes
Highlights
Audio sources
In addition to the existing audio sources:
output
(default): forwards the whole audio output, and disables playback on the device (mapped toREMOTE_SUBMIX
).playback
: captures the audio playback (Android apps can opt out, so the whole output is not necessarily captured).mic
: captures the microphone (mapped toMIC
).
This version adds:
mic-unprocessed
: captures the microphone unprocessed (raw) sound (mapped toUNPROCESSED
).mic-camcorder
: captures the microphone tuned for video recording, with the same orientation as the camera if available (mapped toCAMCORDER
).mic-voice-recognition
: captures the microphone tuned for voice recognition (mapped toVOICE_RECOGNITION
).mic-voice-communication
: captures the microphone tuned for voice communications (it will for instance take advantage of echo cancellation or automatic gain control if available) (mapped toVOICE_COMMUNICATION
).voice-call
: captures voice call (mapped toVOICE_CALL
).voice-call-uplink
: captures voice call uplink only (mapped toVOICE_UPLINK
).voice-call-downlink
: captures voice call downlink only (mapped toVOICE_DOWNLINK
).voice-performance
: captures audio meant to be processed for live performance (karaoke), includes both the microphone and the device playback (mapped toVOICE_PERFORMANCE
).
See #5870.
Note: If you record voice calls to a file, audio/video synchronization might be broken during playback. Read more details.
Android 15 and 16
This version includes fixes for changes in Android 15 that broke automatic rotation (#5908) and Android 16 that broke audio capture (#5698).
Static binaries
To ensure maximum compatibility, static binaries are now built for older versions of Linux distributions (#5689) and macOS (#5649, #5697).
- BlueSky:
@scrcpy.bsky.social
- Twitter:
@scrcpy_app
- Reddit:
r/scrcpy
scrcpy v3.1
To receive a notification when a new release is available, click on Watch > Custom > Releases at the top.
scrcpy v3.1
Changes since v3.0.2:
- Add
--no-vd-destroy-content
(#5615) - Improve gamepad support in games (#5623, #5362)
- Inject events to main display (#5614, #5545, #5605, #5616)
- Fix "turn screen off" on some devices (#4544, #5274)
- Improve cleanup reliability (#5613, #5601)
- Add dav1d in release builds (#5644, #4744)
- Upgrade SDL to 2.30.10
Highlights
Keep virtual display content on close
When a virtual display is closed, the running apps are destroyed.
A new option (--no-vd-destroy-content
, #5615) allows moving the apps to the main display instead:
scrcpy --new-display --no-vd-destroy-content
This is particularly useful for avoiding the loss of work due to unexpected disconnections. The running app can be moved back to a new virtual display afterward.
Note that the running apps follow the standard Android lifecycle. Some apps, especially 3D games, may simply restart on the main display when the virtual display is closed.
Gamepad support
Gamepad support was implemented by #5270 in scrcpy 2.7.
While it worked well with gamepad testers, it was partially or totally incompatible with many games.
In this new version, several changes (#5623) allow games to detect and use gamepads correctly:
- fixing the gamepad HID report descriptor
- declaring the gamepad to be a well-known Xbox 360 controller
Fix unclickable elements
Since the introduction of virtual displays in scrcpy 3.0, the injection of input events has been slightly modified. While the new behavior resolves issues with virtual displays (#4598, #5137), it caused some UI elements in overlays to become unclickable.
To fix the problem, this new release restores the previous behavior when mirroring the main display (#5614).
Fix "turn screen off" on some devices
On Android 14, scrcpy uses a specific mechanism to turn the screen off (#4456), but this method failed on some devices.
Now, it also works on these devices: #4544 (comment)
AV1 decoder
Recent devices have an AV1 encoder (and it works quite well).
On Linux, when building using system libraries, it was already working. But no AV1 decoder was included in release builds.
This new version adds dav1d support to decode AV1 streams (#5644).
If your device has an AV1 encoder (scrcpy --list-encoders
):
scrcpy --video-codec=av1
- BlueSky:
@scrcpy.bsky.social
- Twitter:
@scrcpy_app
- Reddit:
r/scrcpy
scrcpy v3.0.2
To receive a notification when a new release is available, click on Watch > Custom > Releases at the top.
scrcpy v3.0.2
Changes since v3.0.1:
- Fix version (#5602)
Highlights
π€¦
- BlueSky:
@scrcpy.bsky.social
- Twitter:
@scrcpy_app
- Reddit:
r/scrcpy
scrcpy v3.0.1
To receive a notification when a new release is available, click on Watch > Custom > Releases at the top.
scrcpy v3.0.1
Changes since v3.0:
- Set main display power for virtual display (#5522)
- Rollback to old --turn-screen-off method for Android 15 (#5530)
- Do not reset TCP/IP connections (#5562)
- Fix socket interruption on macOS (#5536)
- Fix NullPointerException on certain devices (#5537)
- Fix camera capture failure without retry (#5539)
- Accept control events without display (#5542)
- Build macOS x86_64 release (#5526)
- Fix .tar.gz compression for release tarballs (#5581)
- Call static binary without wrapper script (#5560)
Highlights
This release fixes some issues from scrcpy 3.0.
Turn screen off
There were two major problems with the --turn-screen-off
feature.
Firstly, Android 15 introduced a new mechanism to set the display power, used by scrcpy 3.0 (#5418). Unfortunately, it does not work as expected: video mirroring was broken or frozen when the display power was off.
Therefore, this version rolls back to the previous mechanism, even for Android 15.
In addition, --turn-screen-off
Β was disabled when mirroring a virtual display because there was no display to power off. However, on some devices, interacting with the virtual display requires the device to be unlocked (with the main screen powered on).
In such cases, it might make sense to power on the device, but with the screen physically turned off (useful in conjunction with stay awake or a custom screen off timeout).
Therefore, the "turn screen off" feature is now enabled with virtual displays, and it changes the power mode of the main display.
TCP/IP multi-instances
When scrcpy was run with --tcpip=<addr>
, to make sure a new working connection was established, any previous connection to the same address was disconnected. However, this caused all running instances connected to that address to be killed.
Running several instances of scrcpy on the same device is now useful with virtual displays, so change the default behavior to NOT disconnect.
To force a reconnection, a '+' prefix can be added:
scrcpy --tcpip=+192.168.0.3
Releases
For scrcpy 3.0, static builds were released for Linux (x86_64) and macOS (aarch64).
For 3.0.1, a new build for macOS x86_64 has been added.
Some changes have been made in the way scrcpy finds dependent files (adb
, scrcpy-server
and icon.png
). Static releases are build in "portable" mode, which means that scrcpy must find the expected files in the same directory as the executable. This was implemented via a wrapper shell script in 3.0, but it had limitations (e.g., it did not work properly when executing the script from a symlink in another location). This functionality is now fully implemented in C.
By default, scrcpy uses the provided adb
binary. If you want to use the adb
binary from your system, set the ADB
environment variable to the path of your adb
(or just adb
so that it is searched in $PATH
):
ADB=adb scrcpy
Also, the .tar.gz
releases for 3.0 were actually non-gzipped tarballs (#5581). The tarballs for 3.0.1 are now correctly gzipped.
Other specific issues have been fixed; see the full changelog above.
- BlueSky:
@scrcpy.bsky.social
- Twitter:
@scrcpy_app
- Reddit:
r/scrcpy
scrcpy v3.0
To receive a notification when a new release is available, click on Watch > Custom > Releases at the top.
scrcpy v3.0
Changes since v2.7:
- Add virtual display feature (#5370, #5506, #1887, #4528, #5137)
- Launch Android app on start (#5370)
- Add OpenGL filters (#5455)
- Add --capture-orientation to replace --lock-video-orientation
(which was broken on Android 14) (#4011, #4426, #5455) - Fix --crop on Android 14 (#4162, #5387, #5455)
- Handle virtual display rotation (#5428, #5455)
- Add --angle to apply a custom rotation (#4135, #4345, #4658, #5455)
- Add --screen-off-timeout (#5447)
- Adapt "turn screen off" for Android 15 (#3927, #5418)
- Add shortcut Ctrl+Shift+click-and-move for horizontal tilt (#5317)
- Add shortcut MOD+Shift+r to reset video capture/encoding (#5432)
- Forward Alt and Super with SDK Keyboard (#5318, #5322)
- Add more details to --list-encoders output (#5416)
- Add option to disable virtual display system decorations (#5494)
- Fix --time-limit overflow on Windows (#5355)
- Fix "does not match caller's uid 2000" error (#4639, #5476)
- Accept filenames containing ':' when recording (#5487, #5499)
- Disable mouse by default if no video playback (#5410)
- Rename --display-buffer to --video-buffer (#5403, #5420)
- Listen to display changed events (#5415, #161, #1918, #4152, #5362)
- Adapt server debugging for Android >= 11 (#5346, #5466)
- Upgrade FFmpeg to 7.1 (#5332)
- Upgrade SDL to 2.30.9
- Upgrade platform-tools (adb) to 35.0.2
- Build releases via GitHub Actions (#5306, #4490)
- Release static builds for Linux and macOS (#5515, #1733, #3235, #4489, #5327)
- Various technical fixes
Highlights
Virtual display
By default, scrcpy mirrors the device screen.
With this new feature (#5370), it is now possible to mirror a new virtual display, with a custom size:
scrcpy --new-display=1920x1080
scrcpy --new-display=1920x1080/420 # force 420 dpi
scrcpy --new-display # use the main display size and density
scrcpy --new-display=/240 # use the main display size and 240 dpi
On some devices, a launcher is available in the virtual display.
When no launcher is available, the virtual display is empty. In that case, you must start an Android app.
For example:
scrcpy --new-display=1920x1080 --start-app=org.videolan.vlc
To list the Android apps installed on the device:
scrcpy --list-apps
For convenience, you can also select an app by its name using a ?
prefix:
scrcpy --start-app=?firefox
However, retrieving app names may take some time (sometimes several seconds), so passing the package name is recommended.
On-device OpenGL filters
Scrcpy can now transform the captured video stream before encoding by applying OpenGL filters directly on the device. This has made it possible to fix several issues and implement new features, as described below (more details in #5455).
Crop
The --crop
option was broken for devices running Android >= 14 (#4162). It has been reimplemented using OpenGL filters internally.
Its usage remains the same:
scrcpy --crop=800:600:100:100
It now also works for camera and virtual displays.
Capture orientation
The --lock-video-orientation
option was broken for devices running Android >= 14 (#4011).
It has been replaced by a more general option --capture-orientation
, implemented using OpenGL filters:
scrcpy --capture-orientation=0
scrcpy --capture-orientation=90 # 90Β° clockwise
scrcpy --capture-orientation=180 # 180Β°
scrcpy --capture-orientation=270 # 270Β° clockwise
scrcpy --capture-orientation=flip0 # hflip
scrcpy --capture-orientation=flip90 # hflip + 90Β° clockwise
scrcpy --capture-orientation=flip180 # hflip + 180Β°
scrcpy --capture-orientation=flip270 # hflip + 270Β° clockwise
The capture orientation can be locked by using a @
prefix, so that a physical device rotation does not change the captured video orientation:
scrcpy --capture-orientation=@ # locked to the initial orientation
scrcpy --capture-orientation=@0 # locked to 0Β°
scrcpy --capture-orientation=@90 # locked to 90Β° clockwise
scrcpy --capture-orientation=@180 # locked to 180Β°
scrcpy --capture-orientation=@270 # locked to 270Β° clockwise
scrcpy --capture-orientation=@flip0 # locked to hflip
scrcpy --capture-orientation=@flip90 # locked to hflip + 90Β° clockwise
scrcpy --capture-orientation=@flip180 # locked to hflip + 180Β°
scrcpy --capture-orientation=@flip270 # locked to hflip + 270Β° clockwise
Now, it also works for camera (fixing #4426) and virtual displays.
Custom rotation
A new option --angle
allows to rotate the content by a custom angle. Combined with --crop
, this is especially useful for mirroring the Meta Quest 3 (#4135, #4345, #4658).
Virtual display rotation
The new virtual display feature initially could not rotate. The rotation has been implemented using OpenGL filters.
(That is what triggered the development of OpenGL filters.)
Like previously, the current app can be rotated by MOD+r (shortcuts).
Screen off timeout
The existing option --stay-awake
only keeps the device awake *while it is plugged in, meaning it typically does not work over TCP/IP.
A new option, --screen-off-timeout
, modifies the screen-off timeout setting while scrcpy is running and restores it on exit:
scrcpy --screen-off-timeout=300 # 300 seconds (5 minutes)
Static builds
For convenience, static builds are now provided for Linux and macOS (#5515).
More targets might be added in the future.
This is still experimental for now, so if you encounter problems, please report them.
Features you might have missed
If you haven't tried scrcpy in a while, here are some features introduced in the 2.x versions that you might have missed (check the release notes to each version for more details):
- scrcpy 2.7: gamepad support
- scrcpy 2.6: audio duplication
- scrcpy 2.5: control-only & mouse improvements
- scrcpy 2.4: UHID keyboard and mouse
- scrcpy 2.3: camera support improvements
- scrcpy 2.2: camera capture
- scrcpy 2.1: microphone capture
- scrcpy 2.0: audio forwarding
- BlueSky:
@scrcpy.bsky.social
- Twitter:
@scrcpy_app
- Reddit:
r/scrcpy
scrcpy v2.7
To receive a notification when a new release is available, click on Watch > Custom > Releases at the top.
scrcpy v2.7
Changes since v2.6.1:
- Add gamepad support (#99, #2130, #5270)
- Fix workarounds for ONYX devices (#5182)
- Accept float values for --max-fps (265a15e)
- Upgrade SDL to 2.30.7 in Windows releases
- Various technical fixes
Highlights
Gamepad support
With this new version, it is possible to play Android games using game controllers (for example a PS4/PS5 or XBox gamepad) connected to the computer (provided that the game supports gamepads).
Like physical keyboard and mouse simulation, gamepads can use either UHID or AOA.
To enable gamepad support, just run:
scrcpy -G
It can work without mirroring:
scrcpy --no-video --no-audio -G
and in OTG mode (i.e. without requiring USB debugging):
scrcpy --otg -G
More details in #5270 and in the documentation.
--max-fps
improvement
Android accepts floating point values for the frame rate limitation, but --max-fps
only accepted integers. Now, it accepts floating point values.
In particular, this allows to capture at a frame rate lower than 1 fps. For example, to capture 1 frame every 5 seconds:
scrcpy --video-source=camera --camera-size=1920x1080 --max-fps=0.2 --record=file.mp4
This might be useful for creating a timelapse. (The video can be sped up afterwards with FFmpeg.)
- Twitter:
@scrcpy_app
- Reddit:
r/scrcpy
scrcpy v2.6.1
To receive a notification on new releases, click on Watch > Custom > Releases on the top.
scrcpy v2.6.1
Changes since v2.6:
Highlights
See v2.6 release notes.
Some changes in scrcpy 2.6 caused issues with mouse events in some applications.
This hotfix version fixes them (773c23f).
Sorry for the inconvenience.
- Twitter:
@scrcpy_app
- Reddit:
r/scrcpy
scrcpy v2.6
To receive a notification on new releases, click on Watch > Custom > Releases on the top.
scrcpy v2.6
Changes since v2.5:
- Add audio playback capture method (#4380, #5102)
- Add audio duplication feature (#3875, #4380, #5102)
- Add mouse secondary bindings with Shift+click (#5055, #5076)
- Rework mouse events (#5067, #5076)
- Fix "turn screen off" for Honor devices (#4823, #4943, #5109)
- Add clipboard workaround for Honor devices (#4822, #5073)
- Always apply device workarounds (#4922, #5140, #5148, #5154)
- Fix missing initialization (#5057, #5058)
- Do not report error on device disconnected (#5044)
- Upgrade SDL to 2.30.5 in Windows releases
- Various technical fixes
Highlights
Audio mirroring
Audio forwarding was introduced in scrcpy 2.0. Until now, when audio was captured by scrcpy, it was necessarily disabled on the device.
This release introduces a new audio capture method, which (optionally) supports audio duplication, to keep playing audio on the device. It is exposed as an alternative audio source named playback
(in addition to output
, the default, and mic
).
scrcpy --audio-source=playback # do not play on the device
scrcpy --audio-source=playback --audio-dup # keep playing on the device
For convenience, --audio-dup
automatically selects the playback
audio source. Therefore, to mirror audio rather than forward, this is sufficient:
scrcpy --audio-dup
However, this playback capture has some drawbacks:
- it requires Android 13 (rather than Android 11),
- Android apps can opt-out, in which case they are not captured.
See documentation, #4380, #5102.
Secondary mouse bindings
By default, with SDK mouse:
- right-click triggers BACK (or POWER on)
- middle-click triggers HOME
- the 4th click triggers APP_SWITCH
- the 5th click expands the notification panel
It was also possible to forward the clicks to the device instead, by using the --mouse-bind=xxxx
option introduced in the previous version (2.5). But that way, we had to choose at startup whether a button triggered a shortcut or a click.
This release introduces a new set of secondary bindings via Shift+click, so that both are possible at runtime.
By default, a simple (secondary) click triggers the shortcuts, and Shift+click forwards the click to the device.
In AOA and UHID mouse modes, the default bindings are reversed: all clicks are forwarded by default, and pressing Shift 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).
All these mouse bindings can be configured, check the documentation.
See #5076.
- Twitter:
@scrcpy_app
- Reddit:
r/scrcpy