Skip to main content
The VideoEncoding class defines encoding parameters for video tracks, including bitrate, frame rate, and priority settings.

Properties

maxBitrate
Int
Maximum bitrate in bits per second (bps) for the video encoding.Example: 3_000_000 for 3 Mbps
maxFps
Int
Maximum frames per second for the video encoding.Common values: 15, 24, 30, 60
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 = 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

  1. 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)
    
  2. Screen Share: Use lower frame rates
    let screenEncoding = VideoEncoding(maxBitrate: 3_000_000, maxFps: 15)
    
  3. Mobile Networks: Use conservative settings
    let mobileEncoding = VideoEncoding(maxBitrate: 1_000_000, maxFps: 24)
    
  4. Simulcast: Let LiveKit handle multiple layers
    let options = VideoPublishOptions(
        encoding: VideoEncoding(maxBitrate: 3_000_000, maxFps: 30),
        simulcast: true  // LiveKit creates multiple quality layers
    )
    
  5. 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
    }
    

Build docs developers (and LLMs) love