scrcpy/doc/video.md
Romain Vimont ad05a01800 Add Encoder section
This will allow to reference the encoder section directly in issues.
2023-07-14 23:36:21 +02:00

5.6 KiB
Raw Permalink Blame History

Video

Size

By default, scrcpy attempts to mirror at the Android device resolution.

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):

scrcpy --max-size=1024
scrcpy -m 1024   # short version

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.

If encoding fails, scrcpy automatically tries again with a lower definition (unless --no-downsize-on-error is enabled).

Bit rate

The default video bit rate is 8 Mbps. To change it:

scrcpy --video-bit-rate=2M
scrcpy --video-bit-rate=2000000  # equivalent
scrcpy -b 2M                     # short version

Frame rate

The capture frame rate can be limited:

scrcpy --max-fps=15

The actual capture frame rate may be printed to the console:

scrcpy --print-fps

It may also be enabled or disabled at anytime with MOD+i (see shortcuts).

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.

Codec

The video codec can be selected. The possible values are h264 (default), h265 and av1:

scrcpy --video-codec=h264  # default
scrcpy --video-codec=h265
scrcpy --video-codec=av1

H265 may provide better quality, but H264 should provide lower latency. AV1 encoders are not common on current Android devices.

For advanced usage, to pass arbitrary parameters to the MediaFormat, check --video-codec-options in the manpage or in scrcpy --help.

Encoder

Several encoders may be available on the device. They can be listed by:

scrcpy --list-encoders

Sometimes, the default encoder may have issues or even crash, so it is useful to try another one:

scrcpy --video-codec=h264 --video-encoder='OMX.qcom.video.encoder.avc'

Rotation

The rotation may be applied at 3 different levels:

  • The shortcut MOD+r requests the device to switch between portrait and landscape (the current running app may refuse, if it does not support the requested orientation).
  • --lock-video-orientation changes the mirroring orientation (the orientation of the video sent from the device to the computer). This affects the recording.
  • --rotation rotates only the window content. This only affects the display, not the recording. It may be changed dynamically at any time using the shortcuts MOD+ and MOD+.

To lock the mirroring orientation:

scrcpy --lock-video-orientation     # initial (current) orientation
scrcpy --lock-video-orientation=0   # natural orientation
scrcpy --lock-video-orientation=1   # 90° counterclockwise
scrcpy --lock-video-orientation=2   # 180°
scrcpy --lock-video-orientation=3   # 90° clockwise

To set an initial window rotation:

scrcpy --rotation=0   # no rotation
scrcpy --rotation=1   # 90 degrees counterclockwise
scrcpy --rotation=2   # 180 degrees
scrcpy --rotation=3   # 90 degrees clockwise

Crop

The device screen may be cropped to mirror only part of the screen.

This is useful, for example, to mirror only one eye of the Oculus Go:

scrcpy --crop=1224:1440:0:0   # 1224x1440 at offset (0,0)

The values are expressed in the device natural orientation (portrait for a phone, landscape for a tablet).

If --max-size is also specified, resizing is applied after cropping.

Display

If several displays are available on the Android device, it is possible to select the display to mirror:

scrcpy --display=1

The list of display ids can be retrieved by:

scrcpy --list-displays

A secondary display may only be controlled if the device runs at least Android 10 (otherwise it is mirrored as read-only).

Buffering

By default, there is no video buffering, to get the lowest possible latency.

Buffering can be added to delay the video stream and compensate for jitter to get a smoother playback (see #2464).

The configuration is available independently for the display, v4l2 sinks and audio playback.

scrcpy --display-buffer=50   # add 50ms buffering for display
scrcpy --v4l2-buffer=300     # add 300ms buffering for v4l2 sink
scrcpy --audio-buffer=200    # set 200ms buffering for audio playback

They can be applied simultaneously:

scrcpy --display-buffer=50 --v4l2-buffer=300

No playback

It is possible to capture an Android device without playing video or audio on the computer. This option is useful when recording or when v4l2 is enabled:

scrcpy --v4l2-sink=/dev/video2 --no-playback
scrcpy --record=file.mkv --no-playback
# interrupt with Ctrl+C

It is also possible to disable video and audio playback separately:

# Send video to V4L2 sink without playing it, but keep audio playback
scrcpy --v4l2-sink=/dev/video2 --no-video-playback

# Record both video and audio, but only play video
scrcpy --record=file.mkv --no-audio-playback

No video

To disable video forwarding completely, so that only audio is forwarded:

scrcpy --no-video

Video4Linux

See the dedicated Video4Linux page.