Spaces:
Running
on
A100
Running
on
A100
File size: 2,063 Bytes
ae238b3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
import { useEffect } from 'react';
import { TranscriptionResponse } from '../services/transcriptionApi';
interface UseMediaTimeSyncProps {
audioRef: React.RefObject<HTMLAudioElement>;
videoRef: React.RefObject<HTMLVideoElement>;
onTimeUpdate: () => void;
transcription: TranscriptionResponse | null;
}
export const useMediaTimeSync = ({
audioRef,
videoRef,
onTimeUpdate,
transcription,
}: UseMediaTimeSyncProps) => {
useEffect(() => {
const mediaElement = audioRef.current || videoRef.current;
let frameId: number | null = null;
console.log('Setting up requestAnimationFrame for media element:', mediaElement?.tagName);
const smoothUpdate = () => {
if (mediaElement && !mediaElement.paused && !mediaElement.ended) {
onTimeUpdate();
frameId = requestAnimationFrame(smoothUpdate);
} else {
frameId = null;
}
};
if (mediaElement && transcription) {
const handlePlay = () => {
console.log('Media play event triggered');
if (frameId) {
cancelAnimationFrame(frameId);
}
frameId = requestAnimationFrame(smoothUpdate);
};
const handlePause = () => {
console.log('Media pause event triggered');
if (frameId) {
cancelAnimationFrame(frameId);
frameId = null;
}
};
mediaElement.addEventListener('play', handlePlay);
mediaElement.addEventListener('pause', handlePause);
mediaElement.addEventListener('ended', handlePause);
// Start if already playing
if (!mediaElement.paused) {
console.log('Media is already playing, starting animation loop');
handlePlay();
}
return () => {
if (frameId) {
cancelAnimationFrame(frameId);
}
mediaElement.removeEventListener('play', handlePlay);
mediaElement.removeEventListener('pause', handlePause);
mediaElement.removeEventListener('ended', handlePause);
};
}
}, [transcription, onTimeUpdate, audioRef, videoRef]);
};
|