Release scrcpy 4.0

TL;DR · AI Summary
scrcpy v4.0 has been released, including major updates such as migrating from SDL2 to SDL3, adding Flex display support, and various technical improvements.
Key Takeaways
- scrcpy v4.0 migrates from SDL2 to SDL3
- adds Flex display support
- various technical improvements fix multiple known issues
Outline
Jump quickly between sections.
Introduces the notification method for new releases of scrcpy v4.0.
Major updates in scrcpy v4.0 include migrating from SDL2 to SDL3.
Migrates from SDL2 to SDL3.
Adds Flex display support.
Enhances multiple user interface and performance features.
Fixes multiple known technical issues.
Mindmap
See how the topics connect at a glance.
查看大纲文本(无障碍 / 无 JS 友好)
- scrcpy v4.0
- 从 SDL2 迁移到 SDL3
- 增加 Flex 显示支持
- 其他功能增强
- 增加 --keep-active 选项
- 设置默认音频输出缓冲区为 10ms
Highlights
Key sentences worth saving and sharing.
scrcpy v4.0 migrates from SDL2 to SDL3 to benefit from active maintenance.
The --keep-active option is added to keep the window open even if the device disconnects.
The default audio output buffer is set to 10ms to improve audio quality.
_To receive a notification when a new release is available, click on Watch > Custom > Releases at the top._
- * *
scrcpy v4.0
Changes since v3.3.4:
- Migrate from SDL2 to SDL3 (#6216)
- Add flex display support (#6772)
- Add camera torch and zoom support (#6243)
- Enforce window aspect ratio (#6761, #6774, #2317, #2387, #3460)
- Add --keep-active (#6792, #6787)
- Add --background-color (#6807, #5855)
- Set default background color to dark gray (#6807)
- Display disconnected icon before closing (#6662, #6651)
- Add F11 as fullscreen shortcut (#6777)
- Add Mod+q shortcut to quit (#6780, #6612)
- Fix Meta Quest flickering (#5913)
- Fix physical vs logical size confusion (#6772)
- Fix copy-paste on rooted device (#6224)
- Fix colorspace conversion issue (#1868)
- Fix high CPU usage with audio silence decoded from OPUS (#6715)
- Add session metadata for the video stream (#6159)
- Respect video capabilities constraints (#6766)
- Set Windows console code page to UTF-8 (#6663)
- Fix support for device serial containing spaces (#6663, #6664, #3537)
- Detect TCP devices provided by mDNS (#6665, #6248)
- Keep Windows terminal open on error (#6667)
- Set MediaCodec KEY_PRIORITY and KEY_LATENCY to minimum values (#6670)
- Open the scrcpy window earlier (#6694, #6546)
- Fix device rotation shortcut (5fedc79)
- Use optimal size alignment (#6746, #4949, #6236)
- Add --min-size-alignment (#6746)
- Fix screensaver disabled unexpectedly without video playback (#6754)
- Add --no-window-aspect-ratio-lock (#6761)
- Fix rotation of square displays (#6770)
- Align the virtual display size (#6771)
- Add --render-fit (#6772)
- Set default audio-output-buffer to 10ms (#6775, #3793)
- Fix turning virtual display on via right-click (#6788)
- Fix OpenGL runner shutdown deadlock (#6794)
- Share SDL hints between normal and OTG modes (#6809, #6808)
- Upgrade platform-tools (adb) to 37.0.0
- Upgrade FFmpeg to 8.1.1 (#6715)
- Upgrade SDL to 3.4.8
- Upgrade dav1d to 1.5.3
- Various technical fixes
- * *
Highlights
SDL3
This release migrates from SDL2 to SDL3 to benefit from active maintenance, bug fixes, and continued upstream support. SDL3 also enables new features, such as aspect-ratio locking when resizing the window.
Thanks to the SDL maintainers for their work and for their support and fixes%20sort%3Acreated-desc)!
See #6216 for details.
Flex display
A virtual display can now be made _flex_ using --flex-display (or -x), meaning it can be resized dynamically along with the client window.
Here is a demo:
scrcpy --new-display=/192 -x --start-app=org.mozilla.firefox --keep-active --no-vd-system-decorations
scrcpy-flex-display-2.mp4
Here are more examples:
Start Android Settings in a window
scrcpy --new-display=1024x768/160 --start-app=com.android.settings --flex-display
-x is equivalent to --flex-display
scrcpy --new-display=1024x768/160 --start-app=com.android.settings -x
By default, the display size/dpi is 1280x960/160
scrcpy --new-display --start-app=com.android.settings --flex-display
Use --keep-active to prevent the screen from turning off (see below):
scrcpy --new-display -x --keep-active
Increase the bit rate and/or change the codec to maintain good quality even with large windows:
scrcpy --new-display -x --video-codec=h265 -b16M
See #6772 for more details.
Camera torch and zoom
The camera can be controlled dynamically:
- MOD+t: turn on the camera torch
- MOD+Shift+t: turn off the camera torch
- MOD+↑_(up)_: zoom in
- MOD+↓_(down)_: zoom out
The camera torch can also be turned on at startup by --camera-torch:
scrcpy --video-source=camera --camera-torch
The camera zoom level can be set with --camera-zoom:
scrcpy --video-source=camera --camera-zoom=1.5
The supported zoom range for each camera is given by --list-cameras (any value outside the supported range will be clamped).
Aspect ratio
Previously, the window could be freely resized, and black borders were added to maintain the content aspect ratio.
Thanks to a new API in SDL3, the window aspect ratio is now preserved while resizing, avoiding black borders.
The old behavior can be restored using --no-window-aspect-ratio-lock.
Keep active
To prevent the device from turning off due to inactivity, --keep-active periodically signals user activity to the system:
scrcpy --keep-activeContrary to `--stay-awake` and `--screen-off-timeout`, this does not change any global settings, and it works whether the device is plugged in or not.
Background color
The default background was pure black; it is now dark gray.
It can be changed with --background-color, which accepts hexadecimal color codes (in 3-digit or 6-digit format):
scrcpy --background-color=#234567 scrcpy --background-color=234567 # leading '#' is optional scrcpy --background-color=#567 # equivalent to #556677
Disconnected icon
When the connection to the device is lost while mirroring, the window previously closed immediately, which could incorrectly suggest that scrcpy had crashed.
To make disconnections clearer, a disconnected icon is now displayed for 2 seconds before closing the window.
The icon replaces the screen content immediately:

More details in #6662.
Meta Quest
Since a Meta Quest firmware upgrade, flickering occurred when mirroring the screen with scrcpy.
A workaround was implemented, so mirroring a Meta Quest now works again.
See the technical details in #5913 (comment).
High CPU usage with silence
A funny bug: playing silence used much more CPU than playing non-silence, during resampling of audio samples decoded from an OPUS audio stream (resampling was about 40× slower).
It turns out it was caused by denormals: the OPUS decoder did not produce exact _zeros_, but tiny denormal numbers, which can cause performance issues.
This was fixed directly in FFmpeg: #6715 (comment)
More shortcuts
F11 now toggles fullscreen (like MOD+f), and MOD+q now quits scrcpy.
- * *
- BlueSky: `@scrcpy.bsky.social`
- Twitter: `@scrcpy_app`
- Reddit: `r/scrcpy`