Add sub stream recording with adaptive quality playback (#24009)

* add sub stream recording with adaptive quality playback

Optionally record a second, lower bitrate stream alongside the main
recording stream via a `record_sub` input role and `record.sub` config block, with its own retention windows.
Recordings rows now carry the stream type plus the media details needed to serve both streams from one manifest: video codec, audio presence, audio codec and rate, and a record-time keyframe index.

Playback resolves coverage across both streams and merges them into a single VOD sequence, falling back to a discontinuity manifest with per-clip init segments when the media signatures differ. The player exposes a quality selector, and an auto governor picks the stream from stall time, bandwidth, codec support, and the save-data hint.

* fix tests and i18n
This commit is contained in:
Josh Hawkins
2026-08-22 11:40:42 -05:00
parent 8de6216c61
commit d67304a84d
68 changed files with 6813 additions and 602 deletions
+16 -1
View File
@@ -13,6 +13,20 @@
"desc": "No frames have been received on the {{cameraName}} <code>detect</code> stream, check error logs"
},
"cameraOff": "Camera is off",
"quality": {
"auto": "Auto",
"autoLow": "Playing low quality (limited bandwidth)",
"autoLowCodec": "Playing low quality (Original not supported by this browser)",
"autoLowSaveData": "Playing low quality (data saver)",
"main": "Original",
"sub": "Low",
"notSupportedBrowser": "Not supported by this browser",
"label": "Quality",
"noAudio": "No audio",
"audioRate": "{{rate}} kHz audio",
"audioCodecRate": "{{codec}} {{rate}} kHz",
"noRecordings": "No recordings in this time range"
},
"stats": {
"streamType": {
"title": "Stream Type:",
@@ -46,7 +60,8 @@
"submittedFrigatePlus": "Successfully submitted frame to Frigate+"
},
"error": {
"submitFrigatePlusFailed": "Failed to submit frame to Frigate+"
"submitFrigatePlusFailed": "Failed to submit frame to Frigate+",
"playRecordingsFailed": "Failed to play recordings (error {{code}}): {{message}}"
}
}
}