The VideoEncoding class defines encoding parameters for video tracks, including bitrate, frame rate, and priority settings.
Properties
Maximum bitrate in bits per second (bps) for the video encoding.Example: 3_000_000 for 3 Mbps
Maximum frames per second for the video encoding.Common values: 15, 24, 30, 60
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 = VideoEncoding(
maxBitrate: 2_500_000, // 2.5 Mbps
maxFps: 30
)
With Priority
let encoding = VideoEncoding(
maxBitrate: 3_000_000,
maxFps: 30,
bitratePriority: .high,
networkPriority: .high
)
Usage with Publish Options
let encoding = VideoEncoding(
maxBitrate: 2_500_000,
maxFps: 30
)
let publishOptions = VideoPublishOptions(
encoding: encoding,
simulcast: true
)
let track = LocalVideoTrack.createCameraTrack()
try await room.localParticipant.publish(
videoTrack: track,
publishOptions: publishOptions
)
Common Encoding Presets
Low Quality (Mobile/Poor Network)
let lowQuality = VideoEncoding(
maxBitrate: 500_000, // 500 Kbps
maxFps: 15
)
Medium Quality (Standard)
let mediumQuality = VideoEncoding(
maxBitrate: 1_500_000, // 1.5 Mbps
maxFps: 24
)
High Quality (Good Network)
let highQuality = VideoEncoding(
maxBitrate: 3_000_000, // 3 Mbps
maxFps: 30
)
HD Quality
let hdQuality = VideoEncoding(
maxBitrate: 5_000_000, // 5 Mbps
maxFps: 30
)
Screen Share
let screenShareEncoding = VideoEncoding(
maxBitrate: 3_000_000, // 3 Mbps
maxFps: 15 // Lower fps for screen content
)
Adaptive Bitrate Based on Resolution
func encoding(for dimensions: Dimensions) -> VideoEncoding {
let (width, height) = (dimensions.width, dimensions.height)
let pixels = width * height
let bitrate: Int
if pixels <= 320 * 240 { // ~77K pixels
bitrate = 300_000 // 300 Kbps
} else if pixels <= 640 * 480 { // ~307K pixels
bitrate = 800_000 // 800 Kbps
} else if pixels <= 1280 * 720 { // ~922K pixels
bitrate = 2_500_000 // 2.5 Mbps
} else { // 1080p+
bitrate = 5_000_000 // 5 Mbps
}
return VideoEncoding(maxBitrate: bitrate, maxFps: 30)
}
Priority Settings
The Priority enum controls bandwidth and network priority:
enum Priority {
case low
case medium
case high
case veryHigh
}
Using Bitrate Priority
// High priority for important video (e.g., presenter)
let presenterEncoding = VideoEncoding(
maxBitrate: 3_000_000,
maxFps: 30,
bitratePriority: .veryHigh,
networkPriority: .high
)
// Lower priority for secondary video
let secondaryEncoding = VideoEncoding(
maxBitrate: 1_000_000,
maxFps: 24,
bitratePriority: .low,
networkPriority: .low
)
Screen Share Encoding
For screen sharing, use different encoding parameters:
let screenShareOptions = VideoPublishOptions(
screenShareEncoding: VideoEncoding(
maxBitrate: 3_000_000,
maxFps: 15 // Lower fps is fine for screen content
),
simulcast: false // Usually disable simulcast for screen share
)
Dynamic Encoding Adjustment
class AdaptiveEncodingManager {
func adjustEncoding(for networkQuality: ConnectionQuality) -> VideoEncoding {
switch networkQuality {
case .excellent:
return VideoEncoding(maxBitrate: 5_000_000, maxFps: 30)
case .good:
return VideoEncoding(maxBitrate: 2_500_000, maxFps: 30)
case .poor:
return VideoEncoding(maxBitrate: 1_000_000, maxFps: 24)
case .lost:
return VideoEncoding(maxBitrate: 500_000, maxFps: 15)
default:
return VideoEncoding(maxBitrate: 1_500_000, maxFps: 24)
}
}
}
Best Practices
-
Match Resolution: Higher bitrates for higher resolutions
// 720p
let encoding720 = VideoEncoding(maxBitrate: 2_500_000, maxFps: 30)
// 1080p
let encoding1080 = VideoEncoding(maxBitrate: 5_000_000, maxFps: 30)
-
Screen Share: Use lower frame rates
let screenEncoding = VideoEncoding(maxBitrate: 3_000_000, maxFps: 15)
-
Mobile Networks: Use conservative settings
let mobileEncoding = VideoEncoding(maxBitrate: 1_000_000, maxFps: 24)
-
Simulcast: Let LiveKit handle multiple layers
let options = VideoPublishOptions(
encoding: VideoEncoding(maxBitrate: 3_000_000, maxFps: 30),
simulcast: true // LiveKit creates multiple quality layers
)
-
Monitor Quality: Adjust based on connection quality
func room(_ room: Room, participant: Participant, didUpdateConnectionQuality quality: ConnectionQuality) {
let newEncoding = adjustEncoding(for: quality)
// Update encoding if needed
}