diff --git a/app/public/index.html b/app/public/index.html
index d3a5662..a7c85bb 100644
--- a/app/public/index.html
+++ b/app/public/index.html
@@ -15,9 +15,29 @@
const cameraId = new URLSearchParams(location.search).get('camera') ?? 'v1';
const wsUrl = `${location.protocol === 'https:' ? 'wss' : 'ws'}://${location.host}/ws/${cameraId}`;
const player = mpegts.createPlayer(
- { type: 'mpegts', isLive: true, url: wsUrl },
- { liveBufferLatencyChasing: true, liveBufferLatencyMaxLatency: 1.5 }
- )
+ { type: 'mpegts', isLive: true, url: wsUrl, hasAudio: false },
+ {
+ enableWorker: true, // transmuxing в отдельном треде
+ enableStashBuffer: false, // без IO-stash для real-time
+ autoCleanupSourceBuffer: true, // не копить старые буферы в MSE
+ autoCleanupMaxBackwardDuration: 10,
+ autoCleanupMinBackwardDuration: 5,
+
+ // liveSync — плавное догоняние через playbackRate, а не жёсткий seek
+ liveSync: true,
+ liveSyncMaxLatency: 3.0, // при плохом интернете даём 3с
+ liveSyncTargetLatency: 1.5, // target после выравнивания
+ liveSyncPlaybackRate: 1.2, // ускорение не более 1.2x
+
+ // liveBufferLatencyChasing оставляем, но увеличиваем окно
+ liveBufferLatencyChasing: true,
+ liveBufferLatencyMaxLatency: 3.0,
+ liveBufferLatencyMinRemain: 0.5,
+
+ lazyLoad: false,
+ deferLoadAfterSourceOpen: false,
+ }
+ );
player.attachMediaElement(document.getElementById('v'))
player.load()
player.play()