From 30b03ca6220551360ba88a30c68d3b04da04135c Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Mon, 21 Aug 2023 10:29:09 +0200 Subject: [PATCH 1/2] `@remotion/player`: Fix iOS seeking --- packages/core/src/use-media-playback.ts | 23 ++++++++++++++++++++--- packages/core/src/video/video-fragment.ts | 7 +++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/core/src/use-media-playback.ts b/packages/core/src/use-media-playback.ts index 4e1c14b64ed..9e47757187d 100644 --- a/packages/core/src/use-media-playback.ts +++ b/packages/core/src/use-media-playback.ts @@ -10,10 +10,27 @@ import { import {useCurrentFrame} from './use-current-frame.js'; import {useVideoConfig} from './use-video-config.js'; import {getMediaTime} from './video/get-current-time.js'; +import {isIosSafari} from './video/video-fragment.js'; import {warnAboutNonSeekableMedia} from './warn-about-non-seekable-media.js'; export const DEFAULT_ACCEPTABLE_TIMESHIFT = 0.45; +const seek = ( + mediaRef: RefObject, + time: number +) => { + if (!mediaRef.current) { + return; + } + + if (isIosSafari()) { + mediaRef.current.currentTime = Number(time.toFixed(1)); + return; + } + + mediaRef.current.currentTime = time; +}; + export const useMediaPlayback = ({ mediaRef, src, @@ -82,7 +99,7 @@ export const useMediaPlayback = ({ // If scrubbing around, adjust timing // or if time shift is bigger than 0.45sec - mediaRef.current.currentTime = shouldBeTime; + seek(mediaRef, shouldBeTime); if (!onlyWarnForMediaSeekingError) { warnAboutNonSeekableMedia( mediaRef.current, @@ -103,13 +120,13 @@ export const useMediaPlayback = ({ if (!playing || absoluteFrame === 0) { if (makesSenseToSeek) { - mediaRef.current.currentTime = shouldBeTime; + seek(mediaRef, shouldBeTime); } } if (mediaRef.current.paused && !mediaRef.current.ended && playing) { if (makesSenseToSeek) { - mediaRef.current.currentTime = shouldBeTime; + seek(mediaRef, shouldBeTime); } playAndHandleNotAllowedError(mediaRef, mediaType); diff --git a/packages/core/src/video/video-fragment.ts b/packages/core/src/video/video-fragment.ts index d2038ca81ef..97592ecae14 100644 --- a/packages/core/src/video/video-fragment.ts +++ b/packages/core/src/video/video-fragment.ts @@ -47,6 +47,13 @@ export const useAppendVideoFragment = ({ return appended; }; +export const isIosSafari = () => { + return ( + /iP(ad|od|hone)/i.test(window.navigator.userAgent) && + Boolean(navigator.userAgent.match(/Version\/[\d.]+.*Safari/)) + ); +}; + // https://github.com/remotion-dev/remotion/issues/1655 const isIOSSafariCase = (actualSrc: string) => { return typeof window === 'undefined' From d448833e8e96f6c73ed83f76ece87f015c4fe31c Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Mon, 21 Aug 2023 10:29:26 +0200 Subject: [PATCH 2/2] Update use-media-playback.ts --- packages/core/src/use-media-playback.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/use-media-playback.ts b/packages/core/src/use-media-playback.ts index 9e47757187d..dbb959f3b2d 100644 --- a/packages/core/src/use-media-playback.ts +++ b/packages/core/src/use-media-playback.ts @@ -23,6 +23,7 @@ const seek = ( return; } + // iOS seeking does not support multiple decimals if (isIosSafari()) { mediaRef.current.currentTime = Number(time.toFixed(1)); return;