2023-03-04 15:56:35 +08:00
|
|
|
# Audio
|
|
|
|
|
|
|
|
Audio forwarding is supported for devices with Android 11 or higher, and it is
|
|
|
|
enabled by default:
|
|
|
|
|
|
|
|
- For **Android 12 or newer**, it works out-of-the-box.
|
|
|
|
- For **Android 11**, you'll need to ensure that the device screen is unlocked
|
|
|
|
when starting scrcpy. A fake popup will briefly appear to make the system
|
|
|
|
think that the shell app is in the foreground. Without this, audio capture
|
|
|
|
will fail.
|
|
|
|
- For **Android 10 or earlier**, audio cannot be captured and is automatically
|
|
|
|
disabled.
|
|
|
|
|
|
|
|
If audio capture fails, then mirroring continues with video only (since audio is
|
|
|
|
enabled by default, it is not acceptable to make scrcpy fail if it is not
|
|
|
|
available), unless `--require-audio` is set.
|
|
|
|
|
|
|
|
|
|
|
|
## No audio
|
|
|
|
|
|
|
|
To disable audio:
|
|
|
|
|
|
|
|
```
|
|
|
|
scrcpy --no-audio
|
|
|
|
```
|
|
|
|
|
|
|
|
## Codec
|
|
|
|
|
|
|
|
The audio codec can be selected. The possible values are `opus` (default), `aac`
|
|
|
|
and `raw` (uncompressed PCM 16-bit LE):
|
|
|
|
|
|
|
|
```bash
|
|
|
|
scrcpy --audio-codec=opus # default
|
|
|
|
scrcpy --audio-codec=aac
|
|
|
|
scrcpy --audio-codec=raw
|
|
|
|
```
|
|
|
|
|
2023-03-15 07:36:13 +08:00
|
|
|
In particular, if you get the following error:
|
|
|
|
|
|
|
|
> Failed to initialize audio/opus, error 0xfffffffe
|
|
|
|
|
|
|
|
then your device has no Opus encoder: try `scrcpy --audio-codec=aac`.
|
|
|
|
|
|
|
|
|
2023-03-04 15:56:35 +08:00
|
|
|
Several encoders may be available on the device. They can be listed by:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
scrcpy --list-encoders
|
|
|
|
```
|
|
|
|
|
|
|
|
To select a specific encoder:
|
|
|
|
|
|
|
|
```
|
|
|
|
scrcpy --audio-codec=opus --audio-encoder='c2.android.opus.encoder'
|
|
|
|
```
|
|
|
|
|
|
|
|
For advanced usage, to pass arbitrary parameters to the [`MediaFormat`],
|
|
|
|
check `--audio-codec-options` in the manpage or in `scrcpy --help`.
|
|
|
|
|
|
|
|
[`MediaFormat`]: https://developer.android.com/reference/android/media/MediaFormat
|
|
|
|
|
|
|
|
|
|
|
|
## Bit rate
|
|
|
|
|
2023-03-20 10:26:45 +08:00
|
|
|
The default audio bit-rate is 128Kbps. To change it:
|
2023-03-04 15:56:35 +08:00
|
|
|
|
|
|
|
```bash
|
|
|
|
scrcpy --audio-bit-rate=64K
|
|
|
|
scrcpy --audio-bit-rate=64000 # equivalent
|
|
|
|
```
|
|
|
|
|
|
|
|
_This parameter does not apply to RAW audio codec (`--audio-codec=raw`)._
|
|
|
|
|
|
|
|
|
|
|
|
## Buffering
|
|
|
|
|
|
|
|
Audio buffering is unavoidable. It must be kept small enough so that the latency
|
|
|
|
is acceptable, but large enough to minimize buffer underrun (causing audio
|
|
|
|
glitches).
|
|
|
|
|
|
|
|
The default buffer size is set to 50ms. It can be adjusted:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
scrcpy --audio-buffer=40 # smaller than default
|
|
|
|
scrcpy --audio-buffer=100 # higher than default
|
|
|
|
```
|
|
|
|
|
|
|
|
Note that this option changes the _target_ buffering. It is possible that this
|
|
|
|
target buffering might not be reached (on frequent buffer underflow typically).
|
|
|
|
|
|
|
|
If you don't interact with the device (to watch a video for example), a higher
|
|
|
|
latency (for both [video](video.md#buffering) and audio) might be preferable to
|
|
|
|
avoid glitches and smooth the playback:
|
|
|
|
|
|
|
|
```
|
|
|
|
scrcpy --display-buffer=200 --audio-buffer=200
|
|
|
|
```
|