ScreenAudioCapturer

@RequiresApi(value = 29)
class ScreenAudioCapturer @RequiresPermission(value = "android.permission.RECORD_AUDIO") constructor(mediaProjection: MediaProjection, captureConfigurator: AudioPlaybackCaptureConfigurator = DEFAULT_CONFIGURATOR) : MixerAudioBufferCallback

A mixer for capturing screen share audio.

Requires a media projection, which can be obtained from the screen share track.

Additionally, for screen capture to work properly while your app is in the background, a foreground service with the type microphone must be running. Otherwise, audio capture will not return any audio data.

Example usage:

suspend fun startScreenCapture(data: Intent) {
if (ActivityCompat.checkSelfPermission(getApplication(), Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
return
}

// Publish the screen share video.
room.localParticipant.setScreenShareEnabled(true, data)

// Optionally disable the mic for screenshare audio only
// val javaAudioDeviceModule = (room.lkObjects.audioDeviceModule as? JavaAudioDeviceModule)
// javaAudioDeviceModule?.setAudioRecordEnabled(false)

// Publish the audio track.
room.localParticipant.setMicrophoneEnabled(true)
val screenCaptureTrack = room.localParticipant.getTrackPublication(Track.Source.SCREEN_SHARE)?.track as? LocalVideoTrack ?: return
val audioTrack = room.localParticipant.getTrackPublication(Track.Source.MICROPHONE)?.track as? LocalAudioTrack ?: return

// Start capturing the screen share audio.
val audioCapturer = ScreenAudioCapturer.createFromScreenShareTrack(screenCaptureTrack) ?: return
audioCapturer.gain = 0.1f // Lower the volume so that mic can still be heard clearly.
audioTrack.setAudioBufferCallback(audioCapturer)
}

suspend fun stopScreenCapture() {
(room.localParticipant.getTrackPublication(Track.Source.MICROPHONE)?.track as? LocalAudioTrack)
?.setAudioBufferCallback(null)
room.localParticipant.setMicrophoneEnabled(false)
room.localParticipant.setScreenShareEnabled(false)

// Remember to release when done capturing.
audioCapturer?.releaseAudioResources()
}

Constructors

Link copied to clipboard
@RequiresPermission(value = "android.permission.RECORD_AUDIO")
constructor(mediaProjection: MediaProjection, captureConfigurator: AudioPlaybackCaptureConfigurator = DEFAULT_CONFIGURATOR)

Types

Link copied to clipboard
object Companion

Properties

Link copied to clipboard
var gain: Float

A multiplier to adjust the volume of the captured audio data.

Functions

Link copied to clipboard
fun initAudioRecord(audioFormat: Int, channelCount: Int, sampleRate: Int): Boolean
Link copied to clipboard
override fun onBuffer(buffer: ByteBuffer, audioFormat: Int, channelCount: Int, sampleRate: Int, bytesRead: Int, captureTimeNs: Long): Long

Called when new audio samples are ready.

Link copied to clipboard
open override fun onBufferRequest(originalBuffer: ByteBuffer, audioFormat: Int, channelCount: Int, sampleRate: Int, bytesRead: Int, captureTimeNs: Long): MixerAudioBufferCallback.BufferResponse?
Link copied to clipboard

Release any audio resources associated with this capturer. This is not managed by LiveKit, so you must call this function when finished to prevent memory leaks.