Skip to main content
v1.0.0
17 March 2026

Overview

LCK v1.0 is the first public release of the LIV Camera Kit SDK. This release introduces live streaming to YouTube, Twitch, and custom RTMP endpoints via the new LCKStreaming plugin, adds a Getting Started wizard for first-time setup, and improves audio quality with per-source sample rate handling. Encoding stability on Android has been significantly improved.

Highlights

  • Live Streaming — Stream directly to YouTube, Twitch, or custom RTMP endpoints from VR via the new LCKStreaming plugin
  • Modular Streaming ArchitectureILCKStreamingFeature modular feature interface for streaming integration, discoverable via IModularFeatures
  • Getting Started Wizard — Editor wizard guides first-time setup with audio plugin selection and configuration
  • Improved Audio Quality — Per-source sample rate handling for correct resampling across all audio plugins
  • Quest 2 Optimizations — Capped HD profile to 30 fps / 8 Mbps for reliable recording on Quest 2

New Features

LCK Core SDK

FeatureDescription
ILCKStreamingFeature interfaceModular feature interface for streaming providers with login, streaming, and lifecycle APIs
Getting Started wizardEditor wizard with step-by-step setup and audio plugin configuration
Editor menuLCK menu in the editor toolbar for quick access to settings and about
SDK version checkAutomatic version check on editor startup with update notification
Per-source audio resamplingAudio mixer resamples each source independently using reported sample rate
AcquireEncoder / ReleaseEncoderReference-counted encoder access — multiple consumers (recording, streaming) can share the encoder
IsEncoderActive()Query whether the encoder is held by any consumer
Quest 2 HD profile capCaps HD recording to 30 fps and 8 Mbps on Quest 2

LCKStreaming (New Plugin)

FeatureDescription
ULCKStreamingSubsystemGame instance subsystem for full streaming lifecycle (login, stream, stop)
Device login/pairingDevice pairing flow with code display, polling, and expiry handling
YouTube / Twitch / Manual RTMPStream to YouTube (with broadcast creation), Twitch (with ingest lookup), or custom RTMP URLs
RTMPS by defaultYouTube and Twitch streams use rtmps:// for encrypted transport
Per-platform bitrate presetsFramerate-aware bitrate presets for 720p/1080p streaming per platform
IsRtmpAvailable()Runtime check for RTMP native library availability
Conditional RTMP packagingRTMP libraries only packaged when bEnableStreaming=true in DefaultGame.ini
App lifecycle handlingStop streaming on app backgrounding, re-validate auth on resume (Quest)
Auto-logout on 401/403Expired auth tokens trigger automatic logout with OnLoggedOut
User-friendly error messagesTechnical errors replaced with user-facing strings

LCKTablet

FeatureDescription
Streaming integrationStartLogin(), CancelLogin(), Logout(), StartStreaming(), StopStreaming(), IsStreaming(), LaunchHub(), IsHubInstalled() on ULCKService
Streaming delegatesOnStreamingPairingCode, OnStreamingAuthenticated, OnStreamingStarted, OnStreamingStopped, OnStreamingError, OnStreamingLoggedOut, OnStreamingConfigChanged
EnsureMicPermissionAsync mic permission request with callback before recording/streaming
FOnNotificationShownDelegate for notification display state changes
Streaming UI elementsGoLive button, Stream button, Live indicator, LIV Hub button, streaming timer

LCKUI

FeatureDescription
GoLive button3D button with long-press to start/stop streaming
Live indicatorAnimated live status indicator with horizontal/vertical support
Stream buttonStreaming state toggle with disabled states
LIV Hub buttonButton to launch LIV Hub companion app
Screen labelBase class for text labels on 3D screens
Long press supportBaseButton long-press functionality with animation lock
ELCKStreamingStateStreaming state enum: Idle, Pairing, Paired, Streaming, Error

Audio Plugins

PluginChanges
LCKFMODPass sample rate through audio delegate for correct resampling
LCKOboePass sample rate, add idempotency guard to StartCapture
LCKUnrealAudioPass sample rate, add idempotency guards, fix mic capture flag reset
LCKWwisePass sample rate through audio delegate
LCKVivoxPass sample rate through audio delegate

Bug Fixes

FixPlatformDescription
Crash when stopping a streamAndroidFixed multiple crash scenarios when stopping streaming or recording on Android
Encoder stabilityAllMultiple crash, deadlock, and resource leak fixes in the encoding pipeline
Mic capture flag not resettingAndroidbIsMicrophoneCapturing now correctly resets on StopCapture in UnrealAudio source
Mic not restarting after failureAllSetMicrophoneEnabled(true) now retries capture after a previous failed attempt
Encoder overload on Quest 2AndroidHD profile capped to 30 fps / 8 Mbps to prevent encoder overload on Quest 2

Breaking Changes

  1. TSharedPtrTSharedPtr<..., ESPMode::ThreadSafe> — All encoder and module shared pointers changed to thread-safe mode. Code holding TSharedPtr<ILCKEncoder> or TSharedPtr<ILCKEncoderFactory> must add ESPMode::ThreadSafe.
    // Before (v0.9.2)
    TSharedPtr<ILCKEncoderFactory> EncoderFactory;
    TSharedPtr<ILCKEncoder> Encoder;
    
    // After (v1.0)
    TSharedPtr<ILCKEncoderFactory, ESPMode::ThreadSafe> EncoderFactory;
    TSharedPtr<ILCKEncoder, ESPMode::ThreadSafe> Encoder;
    
  2. FDelegateRenderAudio signature changed — Audio delegate gained a SampleRate parameter. Code binding to OnAudioDataDelegate must update the callback signature.
    // Before (v0.9.2)
    DECLARE_MULTICAST_DELEGATE_ThreeParams(FDelegateRenderAudio,
        TArrayView<const float>, int32/*Channels*/, ELCKAudioChannel);
    
    // After (v1.0)
    DECLARE_MULTICAST_DELEGATE_FourParams(FDelegateRenderAudio,
        TArrayView<const float>, int32/*Channels*/, int32/*SampleRate*/, ELCKAudioChannel);
    
  3. FOnRecordStateChageFOnRecordStateChange — Typo fix in delegate name.
    // Before (v0.9.2)
    DECLARE_MULTICAST_DELEGATE_OneParam(FOnRecordStateChage, ILCKRecordable*);
    
    // After (v1.0)
    DECLARE_MULTICAST_DELEGATE_OneParam(FOnRecordStateChange, ELCKRecordingState);
    
  4. LCKService::StartRecording() return type changed — Changed from void to bool and made BlueprintCallable.
    // Before (v0.9.2)
    void StartRecording();
    
    // After (v1.0)
    UFUNCTION(BlueprintCallable, Category = "LCK Service")
    bool StartRecording();
    
  5. ULCKNotificationController::WriteLine() removed — Use ShowNotification() instead.
    // Before (v0.9.2)
    void WriteLine(const FString& NewLine, float Duration = 3.0f);
    
    // After (v1.0) — removed, use:
    void ShowNotification(FLCKNotificationPtr Notification);
    
  6. Telemetry structs simplifiedFLCKGeoLocation, FLCKMetaData, FLCKTelemetryData, and FLCKTelemetryPayload were removed from LCKTelemetry.h. SendTelemetry(FLCKTelemetryEvent) and GetCurrentTrackingId() still work as before.
  7. LCKCore Build.cs dependency changesHTTP module removed from public dependencies. Json, JsonUtilities added as public. ToolMenus added for editor. If your module depended on HTTP being transitively available through LCKCore, add it to your own Build.cs.

Migration Guide (v0.9.2 → v1.0)

  1. Update shared pointer types — If you hold TSharedPtr<ILCKEncoder> or TSharedPtr<ILCKEncoderFactory>, add ESPMode::ThreadSafe as the second template parameter.
  2. Update audio delegate bindingsOnAudioDataDelegate now has 4 parameters (added int32 SampleRate between Channels and SourceChannel). Update your callback signatures.
  3. Update FOnRecordStateChageFOnRecordStateChange — Fix the typo in any delegate bindings.
  4. Update StartRecording() callers — Now returns bool. Update any code that called it as void.
  5. Replace WriteLine() callsULCKNotificationController::WriteLine() was removed. Use ShowNotification() instead.
  6. Check telemetry type usage — If you used FLCKGeoLocation, FLCKMetaData, FLCKTelemetryData, or FLCKTelemetryPayload, these structs were removed. Use FLCKTelemetryEvent directly.
  7. Add HTTP module if neededHTTP was removed from LCKCore’s public dependencies. If your module relied on it transitively, add "HTTP" to your own Build.cs.
  8. Add LCKStreaming plugin dependency — If your project uses streaming, add the LCKStreaming plugin to your .uproject or .uplugin file.
  9. Enable streaming in config — Set bEnableStreaming=true in DefaultGame.ini under [/Script/LCKCore.LCKDeveloperSettings] to package RTMP libraries.

Platform Support

PlatformStatus
Meta Quest (Android)Full support — recording, streaming, gallery save
Windows (PCVR)Full support — recording, streaming
LinuxBuild support (listed in SupportedTargetPlatforms), not actively tested
v0.9.2
2 February 2026

Highlights

  • PCVR Support — LCK is a single implementation for PCVR and Meta Quest Standalone
  • Microphone Mute Control — New SetMicrophoneEnabled() API for runtime mic control
  • Audio Config Validation — Real-time validation with editor warnings in Project Settings
  • Permission Handling — Improved Android microphone permission flow with callbacks
  • Developer Settings UI — Full settings panel in Project Settings with audio plugin configuration

New Features

LCK Core SDK

FeatureDescription
Audio Config ValidationValidateAudioConfig() method with FMOD > Wwise > UnrealAudio priority
Build Info APIGetLoadedAudioPlugins(), GetBuildInfoDescription() with dynamic build number
Microphone Mute ControlSetMicrophoneEnabled(), IsMicrophoneEnabled() for runtime mic control
Developer Settings UIFull settings panel in Project Settings with audio plugin checkboxes
Voice Chat Audio SourceFLCKAudioSourceVoiceChat struct for Vivox integration
Plugin DetectionImproved detection via IPluginManager with dependency checks
Settings CategoriesOrganized settings with headers, tooltips, and category grouping
Audio Buffer CleanupClear previously buffered audio on state change

LCKUI

FeatureDescription
Debug Mode SystemILCKVisuallyDebuggable interface for debug visualization
Debug ButtonNew debug toggle button in UI
ELCKMicState EnumThree-state: On, Off, No_Access for permission handling
Audio Level IndicatorReal-time microphone level display on recording button
Demo DashboardLCKDemoUIBoard with FOV, quality, orientation, mic controls
JSON State PersistenceReplaced USaveGame with JSON for tablet state

LCKTablet

FeatureDescription
Android Permission HandlingRequestMicAccess() with proper callback flow
Mic State ManagementToggleMicState() with No_Access state support
Recording State ManagerMic level reading integrated into RecorderController
Developer Settings IntegrationUses ULCKDeveloperSettings for camera modes and profiles
Data Model DelegatesAdded delegates for state change notifications
JSON Data PersistenceSave/load tablet state as JSON with platform paths
Mic Audio Level APIRead mic audio level via ULCKService

Audio Plugins

PluginChanges
LCKVivoxSDK settings binding, microphone output fix
LCKOboeSDK settings binding for StartCapture
LCKWwiseSDK settings binding, documentation
LCKFMODCapture fix, SDK settings binding, documentation

Bug Fixes

FixPlatformDescription
Photo capture not triggeringAllFixed TSharedPtr notification handling
TabletDataModel null crashAllUse NewObject in BeginPlay instead of CreateDefaultSubobject
Settings not restoringAllRemoved forced defaults on initialization
Notification callbacksAllExecute callback per queued notification
Mic check on WindowsWindowsReturn true for non-Android platforms
SetupBindingToDataModel nullAllAdded null guard check

Improvements

ImprovementDescription
Cleaned ConstantsConsolidated constants across LCKUI and LCKTablet modules
Camera Modes MovedCamera modes moved from LCKUI to LCKTablet for better modularity
JSON Helper MovedJSON utilities centralized in LCKTablet
Plugin IconsAdded icons for LCKUI and LCKTablet plugins
Audio Sub-LevelsAdded audio sub-levels for middleware variants

Breaking Changes

  1. FLCKMetaData.Build — Changed from int32 to FString
    // Before (v0.9.1)
    int32 BuildNumber = MetaData.Build;
    
    // After (v0.9.2)
    FString BuildString = MetaData.Build;
    
  2. Mic state type — Use ELCKMicState enum instead of bool
    // Before (v0.9.1)
    bool bMicEnabled = true;
    
    // After (v0.9.2)
    ELCKMicState MicState = ELCKMicState::On;
    // Values: On, Off, No_Access
    

Code Reorganization

Several components were moved between modules for better organization:
ComponentFromTo
Camera modes (ELCKCameraMode)LCKUILCKTablet
JSON helper utilitiesLCKUILCKTablet
Tablet data modelLCKUILCKTablet
Tablet UI componentsLCKUILCKTablet
If you were importing these from LCKUI, update your includes to reference LCKTablet instead.
v0.9.1
16 December 2025
  • Open Beta release