Skip to main content

What Problem Does This Solve?

When building apps with video capture, you need to offer users quality options that balance visual fidelity with performance and file size. Different use cases need different settings—recording gameplay for upload needs higher quality than live streaming, and mobile devices have different constraints than desktop. QualityOption lets you define named presets (like “High”, “Medium”, “Low”) where each preset has separate configurations for recording vs. streaming.

When to Use QualityOption

Use QualityOption when:
  • You want to give users selectable quality presets (Low/Medium/High)
  • Recording and streaming need different settings (recording at higher quality, streaming at lower bitrate)
  • You’re building a quality settings menu in your app
  • Different platforms need different quality tiers
Skip this if you’re hardcoding a single quality level for all users.

Quick Example

// Define a "High" quality preset
var resolution = new CameraResolutionDescriptor(1920, 1080);

var highQuality = new QualityOption(
    name: "High",
    isDefault: true,
    cameraTrackDescriptor: new CameraTrackDescriptor(
        resolution, 
        bitrate: 8 << 20,  // 8 Mbps for recording
        framerate: 60
    ),
    streamingCameraTrackDescriptor: new CameraTrackDescriptor(
        resolution,
        bitrate: 5 << 20,  // 5 Mbps for streaming
        framerate: 30
    )
);
This creates a “High” preset that records at 8 Mbps/60fps but streams at 5 Mbps/30fps.

How It Works

Each QualityOption contains:
  1. Name — Display label shown to users (“High”, “Medium”, “Low”)
  2. Recording settings — Resolution, bitrate, framerate for saved videos
  3. Streaming settings — Usually lower bitrate/framerate for live streaming
  4. Default flag — Marks which option is selected by default
You typically create multiple QualityOption instances and add them to a LckQualityConfig asset.

Common Patterns

Three-tier quality system

var options = new List<QualityOption>
{
    new QualityOption("Low", false, 
        new CameraTrackDescriptor(new CameraResolutionDescriptor(1280, 720), 3 << 20, 30),
        new CameraTrackDescriptor(new CameraResolutionDescriptor(1280, 720), 2 << 20, 30)
    ),
    new QualityOption("Medium", true,  // default
        new CameraTrackDescriptor(new CameraResolutionDescriptor(1920, 1080), 5 << 20, 30),
        new CameraTrackDescriptor(new CameraResolutionDescriptor(1920, 1080), 3 << 20, 30)
    ),
    new QualityOption("High", false,
        new CameraTrackDescriptor(new CameraResolutionDescriptor(1920, 1080), 8 << 20, 60),
        new CameraTrackDescriptor(new CameraResolutionDescriptor(1920, 1080), 5 << 20, 30)
    )
};

Record-only mode (no streaming)

var recordTrack = new CameraTrackDescriptor(
    new CameraResolutionDescriptor(1920, 1080), 
    10 << 20, 
    60
);

// Use same track for both recording and streaming
var option = new QualityOption("Ultra", true, recordTrack, recordTrack);

API Reference

Constructor

public QualityOption(
    string name,
    bool isDefault,
    CameraTrackDescriptor cameraTrackDescriptor,
    CameraTrackDescriptor streamingCameraTrackDescriptor
)

Parameters

  • name — Display name shown in UI (“High”, “Medium”, “Low”)
  • isDefault — Set true for the default selection
  • cameraTrackDescriptor — Settings for recording
  • streamingCameraTrackDescriptor — Settings for live streaming

Fields

FieldTypeDescription
NamestringDisplay name of the quality option
IsDefaultboolWhether this is the default selection
RecordingCameraTrackDescriptorCameraTrackDescriptorTrack settings for recording
StreamingCameraTrackDescriptorCameraTrackDescriptorTrack settings for streaming

Obsolete Members

Deprecated: CameraTrackDescriptor field is obsolete. Use RecordingCameraTrackDescriptor or StreamingCameraTrackDescriptor instead.