You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When an Android publisher sends an E2EE audio track with RED enabled, a Firefox subscriber cannot receive that track because Firefox negotiates plain Opus and the SFU cannot unwrap an encrypted RED source.
LiveKit Server added audio codec simulcast and SubscribedAudioCodecUpdate for this case in livekit/livekit#3920. The current Android SDK (v2.28.0) exposes the protocol message but leaves SignalClient handling as TODO, and audio publication advertises only the selected upstream codec.
This differs from unencrypted media, where the SFU can translate RED/Opus, and from JS/Rust E2EE behavior, which avoids the incompatible RED source by disabling RED entirely. Disabling RED restores Firefox interoperability but removes RED resilience for every subscriber, so it is not an equivalent solution when compatible subscribers should retain RED.
Reproduction
Publish microphone audio from LiveKit Android v2.27.0 or v2.28.0 with AudioTrackPublishOptions(red = true) and E2EE enabled.
Subscribe from current Firefox, which offers plain Opus but not Opus RED.
Observe connected ICE/DTLS but no inbound RTP on Firefox.
LiveKit Server v1.13.5 logs can't determine receiver for codec, with codec audio/opus and reason encrypted source.
Publish with red = false; Firefox immediately receives encrypted Opus audio.
Expected behavior
The Android SDK should support the server's audio simulcast contract for encrypted tracks:
advertise encrypted RED and encrypted plain Opus under the same track SID;
publish/enable only the codecs requested by SubscribedAudioCodecUpdate when dynacast is enabled;
keep RED active for compatible subscribers and Opus active for Firefox subscribers;
avoid disabling E2EE or requiring SFU payload transformation.
Relevant code
SignalClient.kt: SUBSCRIBED_AUDIO_CODEC_UPDATE is currently a TODO.
LocalParticipant.publishAudioTrack: sends disableRed = !options.red and has no audio multi-codec path.
Description
When an Android publisher sends an E2EE audio track with RED enabled, a Firefox subscriber cannot receive that track because Firefox negotiates plain Opus and the SFU cannot unwrap an encrypted RED source.
LiveKit Server added audio codec simulcast and
SubscribedAudioCodecUpdatefor this case in livekit/livekit#3920. The current Android SDK (v2.28.0) exposes the protocol message but leavesSignalClienthandling asTODO, and audio publication advertises only the selected upstream codec.This differs from unencrypted media, where the SFU can translate RED/Opus, and from JS/Rust E2EE behavior, which avoids the incompatible RED source by disabling RED entirely. Disabling RED restores Firefox interoperability but removes RED resilience for every subscriber, so it is not an equivalent solution when compatible subscribers should retain RED.
Reproduction
AudioTrackPublishOptions(red = true)and E2EE enabled.can't determine receiver for codec, with codecaudio/opusand reasonencrypted source.red = false; Firefox immediately receives encrypted Opus audio.Expected behavior
The Android SDK should support the server's audio simulcast contract for encrypted tracks:
SubscribedAudioCodecUpdatewhen dynacast is enabled;Relevant code
SignalClient.kt:SUBSCRIBED_AUDIO_CODEC_UPDATEis currently aTODO.LocalParticipant.publishAudioTrack: sendsdisableRed = !options.redand has no audio multi-codec path.Versions