Documentation Index
Fetch the complete documentation index at: https://docs.liv.tv/llms.txt
Use this file to discover all available pages before exploring further.
LCK provides in-game video recording with hardware-accelerated encoding, configurable quality presets, and a full scripting API for programmatic control.
How recording works
When a user taps Record on the LCK tablet, the active LckCamera begins capturing frames. The captured video and audio are sent to a hardware-accelerated encoder and written to disk. Users can switch between cameras seamlessly during recording without interruption.
Recordings are saved to:
- Quest: Storage/Movies/<RecordingAlbumName>
- PCVR: <User>/Videos/<RecordingAlbumName>
The album name is configurable in Edit > Project Settings > LCK.
Camera modes
LCK includes three built-in camera modes, all available from the tablet UI:
| Mode | Description | Settings |
|---|
| Selfie | Front/back facing camera on the tablet | FOV, Smoothing, Flip, Follow |
| First-person | Films from the player’s HMD perspective | FOV, Smoothing |
| Third-person | Tracks the user’s head at a distance | FOV, Smoothing, Distance, Flip |
All modes support FOV range of 50—100 and smoothing from 0—100.
Quality presets
Quality is configured through the LckQualityConfig ScriptableObject, referenced by the LCKCameraController component.
Android (Quest) defaults
| Preset | Resolution | Bitrate | Framerate | Audio Bitrate |
|---|
| SD | 1280x720 | 7.5 Mbps | 60 fps | 192 kbps |
| HD | 1920x1080 | 12 Mbps | 60 fps | 192 kbps |
Quest 2 override: SD at 6.5 Mbps / 30 fps, HD at 10 Mbps / 30 fps.
Desktop (PCVR) defaults
| Preset | Resolution | Bitrate | Framerate | Audio Bitrate |
|---|
| SD | 1280x720 | 7.5 Mbps | 60 fps | 192 kbps |
| HD | 1920x1080 | 12 Mbps | 60 fps | 192 kbps |
| 2K | 2560x1440 | 25 Mbps | 60 fps | 192 kbps |
| 4K | 3840x2160 | 65 Mbps | 60 fps | 192 kbps |
You can define custom presets and per-device overrides in the LckQualityConfig asset.
Recording API
For programmatic control, access LckService via dependency injection:
[InjectLck] private ILckService _lckService;
Core methods
// Start and stop recording
_lckService.StartRecording();
_lckService.StopRecording();
// Pause and resume (v1.3.5+)
_lckService.PauseRecording();
_lckService.ResumeRecording();
// Query state
_lckService.IsRecording(); // LckResult<bool>
_lckService.IsPaused(); // LckResult<bool>
_lckService.GetRecordingDuration(); // LckResult<TimeSpan>
// Capture a screenshot
_lckService.CapturePhoto();
// Set resolution (only when not capturing)
_lckService.SetTrackResolution(new CameraResolutionDescriptor { width = 1920, height = 1080 });
_lckService.SetTrackFramerate(60);
_lckService.SetTrackBitrate(12000000);
_lckService.SetTrackAudioBitrate(192000);
_lckService.SetCameraOrientation(LckCameraOrientation.Landscape);
Events
_lckService.OnRecordingStarted += (result) => { /* handle */ };
_lckService.OnRecordingStopped += (result) => { /* handle */ };
_lckService.OnRecordingPaused += (result) => { /* handle */ };
_lckService.OnRecordingResumed += (result) => { /* handle */ };
_lckService.OnRecordingSaved += (result) => { /* access result.Value */ };
_lckService.OnPhotoSaved += (result) => { /* handle */ };
_lckService.OnLowStorageSpace += (result) => { /* warn user */ };
Higher quality capture rendering
If you want capture output to look better than the in-game experience (for example, higher-quality player avatars), the recommended approach is to use separate render layers:
- Create a duplicate of the object at higher quality.
- Place it on a dedicated render layer visible only to LCK cameras.
- Keep the original on a different layer for gameplay rendering.
This avoids GPU timing issues with command buffers. See Higher Quality Scaling for alternative approaches using command buffers or URP Render Features.