The AudioEncoding class defines encoding parameters for audio tracks, including bitrate and priority settings.
Properties
Maximum bitrate in bits per second (bps) for the audio encoding.Example: 48000 for 48 Kbps
Priority for bandwidth allocation when bandwidth is limited.Higher priority tracks will receive more bandwidth.
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:
Telephone quality audio.AudioEncoding(maxBitrate: 12000) // 12 Kbps
Best for: Voice-only communication with minimal bandwidth
Speech quality audio.AudioEncoding(maxBitrate: 24000) // 24 Kbps
Best for: Clear voice communication
Music quality audio (mono).AudioEncoding(maxBitrate: 48000) // 48 Kbps
Best for: Music or high-quality voice (mono)
Music quality audio (stereo).AudioEncoding(maxBitrate: 64000) // 64 Kbps
Best for: Stereo music or high-quality audio
High-quality music (mono).AudioEncoding(maxBitrate: 96000) // 96 Kbps
Best for: Professional audio quality (mono)
presetMusicHighQualityStereo
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
| Preset | Bitrate | Use Case |
|---|
presetTelephone | 12 Kbps | Voice-only, minimal bandwidth |
presetSpeech | 24 Kbps | Clear voice communication |
presetMusic | 48 Kbps | Music or high-quality voice (mono) |
presetMusicStereo | 64 Kbps | Stereo music |
presetMusicHighQuality | 96 Kbps | Professional audio (mono) |
presetMusicHighQualityStereo | 128 Kbps | Professional 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
-
Start with Presets: Use the built-in presets for common scenarios
let encoding = AudioEncoding.presetSpeech
-
Enable DTX for Voice: Save bandwidth during silence
let options = AudioPublishOptions(
encoding: .presetSpeech,
dtx: true
)
-
Disable DTX for Music: Keep continuous audio for music
let options = AudioPublishOptions(
encoding: .presetMusic,
dtx: false
)
-
Use RED for Reliability: Enable redundant encoding
let options = AudioPublishOptions(
encoding: .presetSpeech,
red: true
)
-
Adapt to Network: Adjust quality based on connection
func room(_ room: Room, participant: Participant, didUpdateConnectionQuality quality: ConnectionQuality) {
// Adjust audio encoding based on quality
}