Skip to main content
The AudioEncoding class defines encoding parameters for audio tracks, including bitrate and priority settings.

Properties

maxBitrate
Int
Maximum bitrate in bits per second (bps) for the audio encoding.Example: 48000 for 48 Kbps
bitratePriority
Priority?
default:"nil"
Priority for bandwidth allocation when bandwidth is limited.Higher priority tracks will receive more bandwidth.
networkPriority
Priority?
default:"nil"
Priority for DSCP (Differentiated Services Code Point) marking.
Requires ConnectOptions.isDscpEnabled to be set to true.

Initialization

Basic Initialization

let encoding = AudioEncoding(maxBitrate: 48000)  // 48 Kbps

With Priority

let encoding = AudioEncoding(
    maxBitrate: 64000,
    bitratePriority: .high,
    networkPriority: .high
)

Presets

LiveKit provides several audio encoding presets for common use cases:
presetTelephone
AudioEncoding
Telephone quality audio.
AudioEncoding(maxBitrate: 12000)  // 12 Kbps
Best for: Voice-only communication with minimal bandwidth
presetSpeech
AudioEncoding
Speech quality audio.
AudioEncoding(maxBitrate: 24000)  // 24 Kbps
Best for: Clear voice communication
presetMusic
AudioEncoding
Music quality audio (mono).
AudioEncoding(maxBitrate: 48000)  // 48 Kbps
Best for: Music or high-quality voice (mono)
presetMusicStereo
AudioEncoding
Music quality audio (stereo).
AudioEncoding(maxBitrate: 64000)  // 64 Kbps
Best for: Stereo music or high-quality audio
presetMusicHighQuality
AudioEncoding
High-quality music (mono).
AudioEncoding(maxBitrate: 96000)  // 96 Kbps
Best for: Professional audio quality (mono)
presetMusicHighQualityStereo
AudioEncoding
High-quality music (stereo).
AudioEncoding(maxBitrate: 128000)  // 128 Kbps
Best for: Professional stereo audio

Usage with Publish Options

let encoding = AudioEncoding.presetSpeech

let publishOptions = AudioPublishOptions(
    encoding: encoding,
    dtx: true,
    red: true
)

let track = LocalAudioTrack.createTrack()
try await room.localParticipant.publish(
    audioTrack: track,
    publishOptions: publishOptions
)

Choosing the Right Preset

Voice Communication

For standard voice calls:
let options = AudioPublishOptions(
    encoding: .presetSpeech  // 24 Kbps - clear voice
)

Music Streaming (Mono)

For broadcasting music in mono:
let options = AudioPublishOptions(
    encoding: .presetMusic  // 48 Kbps - good music quality
)

Music Streaming (Stereo)

For broadcasting music in stereo:
let options = AudioPublishOptions(
    encoding: .presetMusicStereo  // 64 Kbps - stereo music
)

Professional Audio

For professional audio applications:
let options = AudioPublishOptions(
    encoding: .presetMusicHighQualityStereo  // 128 Kbps
)

Low Bandwidth

For low-bandwidth scenarios:
let options = AudioPublishOptions(
    encoding: .presetTelephone  // 12 Kbps - minimal bandwidth
)

Custom Encoding

Create custom encoding for specific needs:
// Custom encoding for podcast-quality audio
let podcastEncoding = AudioEncoding(
    maxBitrate: 80_000,  // 80 Kbps
    bitratePriority: .high,
    networkPriority: .medium
)

let options = AudioPublishOptions(encoding: podcastEncoding)

Adaptive Encoding

Adjust encoding based on network conditions:
class AdaptiveAudioManager {
    func encoding(for quality: ConnectionQuality) -> AudioEncoding {
        switch quality {
        case .excellent, .good:
            return .presetMusicStereo
        case .poor:
            return .presetSpeech
        case .lost:
            return .presetTelephone
        default:
            return .presetSpeech
        }
    }
}

Priority Settings

Use priority to ensure important audio gets bandwidth:
// High priority for main speaker
let presenterEncoding = AudioEncoding(
    maxBitrate: 64_000,
    bitratePriority: .veryHigh,
    networkPriority: .high
)

// Lower priority for background audio
let backgroundEncoding = AudioEncoding(
    maxBitrate: 24_000,
    bitratePriority: .low,
    networkPriority: .low
)

Comparison Table

PresetBitrateUse Case
presetTelephone12 KbpsVoice-only, minimal bandwidth
presetSpeech24 KbpsClear voice communication
presetMusic48 KbpsMusic or high-quality voice (mono)
presetMusicStereo64 KbpsStereo music
presetMusicHighQuality96 KbpsProfessional audio (mono)
presetMusicHighQualityStereo128 KbpsProfessional stereo audio

Complete Example

import LiveKit

class AudioPublisher {
    let room: Room
    
    init(room: Room) {
        self.room = room
    }
    
    // Publish with speech quality
    func publishSpeech() async throws {
        let options = AudioPublishOptions(
            encoding: .presetSpeech,
            dtx: true,  // Save bandwidth during silence
            red: true   // Improve reliability
        )
        
        let track = LocalAudioTrack.createTrack()
        try await room.localParticipant.publish(
            audioTrack: track,
            publishOptions: options
        )
    }
    
    // Publish music with high quality
    func publishMusic() async throws {
        let options = AudioPublishOptions(
            encoding: .presetMusicHighQualityStereo,
            dtx: false,  // Keep continuous for music
            red: true
        )
        
        let track = LocalAudioTrack.createTrack()
        try await room.localParticipant.publish(
            audioTrack: track,
            publishOptions: options
        )
    }
    
    // Publish with adaptive quality
    func publishAdaptive(quality: ConnectionQuality) async throws {
        let encoding: AudioEncoding
        switch quality {
        case .excellent:
            encoding = .presetMusicStereo
        case .good:
            encoding = .presetMusic
        case .poor:
            encoding = .presetSpeech
        default:
            encoding = .presetTelephone
        }
        
        let options = AudioPublishOptions(encoding: encoding)
        let track = LocalAudioTrack.createTrack()
        try await room.localParticipant.publish(
            audioTrack: track,
            publishOptions: options
        )
    }
}

Best Practices

  1. Start with Presets: Use the built-in presets for common scenarios
    let encoding = AudioEncoding.presetSpeech
    
  2. Enable DTX for Voice: Save bandwidth during silence
    let options = AudioPublishOptions(
        encoding: .presetSpeech,
        dtx: true
    )
    
  3. Disable DTX for Music: Keep continuous audio for music
    let options = AudioPublishOptions(
        encoding: .presetMusic,
        dtx: false
    )
    
  4. Use RED for Reliability: Enable redundant encoding
    let options = AudioPublishOptions(
        encoding: .presetSpeech,
        red: true
    )
    
  5. Adapt to Network: Adjust quality based on connection
    func room(_ room: Room, participant: Participant, didUpdateConnectionQuality quality: ConnectionQuality) {
        // Adjust audio encoding based on quality
    }
    

Build docs developers (and LLMs) love