aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorLibravatarLarge Libravatar memdmp <memdmpestrogenzone>2025-07-31 23:36:42 +0200
committerLibravatarLarge Libravatar memdmp <memdmpestrogenzone>2025-07-31 23:36:42 +0200
commit71faec97ecf46494652e6c364be3b8e438c42817 (patch)
treebc2cec294b918a80b443ef14b0ea9c02c3c485db /src/lib
parent27ea4517633b92166ee5da58b96b0b9998b995fc (diff)
downloadvideotool-71faec97ecf46494652e6c364be3b8e438c42817.tar.gz
videotool-71faec97ecf46494652e6c364be3b8e438c42817.tar.bz2
videotool-71faec97ecf46494652e6c364be3b8e438c42817.tar.lz
videotool-71faec97ecf46494652e6c364be3b8e438c42817.zip

feat: more enhancements

Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/Player/Player.svelte34
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;