diff options
author | 2025-07-31 23:36:42 +0200 | |
---|---|---|
committer | 2025-07-31 23:36:42 +0200 | |
commit | 71faec97ecf46494652e6c364be3b8e438c42817 (patch) | |
tree | bc2cec294b918a80b443ef14b0ea9c02c3c485db /src | |
parent | 27ea4517633b92166ee5da58b96b0b9998b995fc (diff) | |
download | videotool-71faec97ecf46494652e6c364be3b8e438c42817.tar.gz videotool-71faec97ecf46494652e6c364be3b8e438c42817.tar.bz2 videotool-71faec97ecf46494652e6c364be3b8e438c42817.tar.lz videotool-71faec97ecf46494652e6c364be3b8e438c42817.zip |
feat: more enhancements
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/Player/Player.svelte | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/src/lib/Player/Player.svelte b/src/lib/Player/Player.svelte index d75ee3c..f3b8fb8 100644 --- a/src/lib/Player/Player.svelte +++ b/src/lib/Player/Player.svelte @@ -61,7 +61,7 @@ if (canvas && canvas !== lastCanvas) newCanvas(canvas, VideoImplementation); }); $effect(() => { - if (video) renderPreviewFrame(video, frame); + if (video && !playing) renderPreviewFrame(video, frame); }); let playbackLoopId = 0; const startPlaybackLoop = (id = ++playbackLoopId) => { @@ -71,9 +71,18 @@ if (audio) { const desiredTime = frame / video.fps; - // If we get too out of lock-step with audio, we re-sync - if (desiredTime < audio.duration && Math.abs(desiredTime - audio.currentTime) > 0.3) - audio.currentTime = desiredTime; + const timeDelta = Math.abs(desiredTime - audio.currentTime); + // If we get too out of lock-step with audio, we re-sync - we assume audio source is accurate*, as to avoid too much jumping + // *it may not be + if (desiredTime < audio.duration && timeDelta > 0.1) { + if (timeDelta > 0.3) { + // too out of sync, we trust ourselves more + audio.currentTime = desiredTime; + } else { + // just change the rendered frame and hope its good enough + f = audio.currentTime * video.fps; + } + } } if (f > frameCount) { @@ -87,15 +96,18 @@ ); } }; - // State Synchronisation effect & playback starter + const startPlaying = () => { + if (frame === frameCount && playbackRelativeTo === 0) { + frame = 0; + } + playbackRelativeTo = performance.now(); + playbackFrameOffset = frame; + startPlaybackLoop(); + }; + // playback starter $effect(() => { if (playing) { - if (frame === frameCount && playbackRelativeTo === 0) { - frame = 0; - } - playbackRelativeTo = performance.now(); - playbackFrameOffset = frame; - startPlaybackLoop(); + startPlaying(); } else playbackRelativeTo = 0; }); let loadedFrameTimestamp = false; |