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.