Jump to live when exceeding buffer time threshold in MSE player

This commit is contained in:
Josh Hawkins 2024-08-14 13:04:46 -05:00
parent b0d42ea116
commit c8af135869

View File

@ -32,6 +32,7 @@ function MSEPlayer({
onError, onError,
}: MSEPlayerProps) { }: MSEPlayerProps) {
const RECONNECT_TIMEOUT: number = 10000; const RECONNECT_TIMEOUT: number = 10000;
const BUFFERING_COOLDOWN_TIMEOUT: number = 5000;
const CODECS: string[] = [ const CODECS: string[] = [
"avc1.640029", // H.264 high 4.1 (Chromecast 1st and 2nd Gen) "avc1.640029", // H.264 high 4.1 (Chromecast 1st and 2nd Gen)
@ -46,6 +47,7 @@ function MSEPlayer({
const visibilityCheck: boolean = !pip; const visibilityCheck: boolean = !pip;
const [isPlaying, setIsPlaying] = useState(false); const [isPlaying, setIsPlaying] = useState(false);
const lastJumpTimeRef = useRef(0);
const [wsState, setWsState] = useState<number>(WebSocket.CLOSED); const [wsState, setWsState] = useState<number>(WebSocket.CLOSED);
const [connectTS, setConnectTS] = useState<number>(0); const [connectTS, setConnectTS] = useState<number>(0);
@ -302,6 +304,25 @@ function MSEPlayer({
return video.buffered.end(video.buffered.length - 1) - video.currentTime; return video.buffered.end(video.buffered.length - 1) - video.currentTime;
}; };
const jumpToLive = () => {
if (!videoRef.current) return;
const now = Date.now();
if (now - lastJumpTimeRef.current < BUFFERING_COOLDOWN_TIMEOUT) {
console.log("Cooldown period active, skipping jump");
return;
}
const buffered = videoRef.current.buffered;
if (buffered.length > 0) {
const liveEdge = buffered.end(buffered.length - 1);
// Jump to the live edge
videoRef.current.currentTime = liveEdge;
lastJumpTimeRef.current = now;
console.log("Jumped to live");
}
};
useEffect(() => { useEffect(() => {
if (!playbackEnabled) { if (!playbackEnabled) {
return; return;
@ -386,21 +407,34 @@ function MSEPlayer({
handleLoadedMetadata?.(); handleLoadedMetadata?.();
onPlaying?.(); onPlaying?.();
setIsPlaying(true); setIsPlaying(true);
lastJumpTimeRef.current = Date.now();
}} }}
muted={!audioEnabled} muted={!audioEnabled}
onPause={() => videoRef.current?.play()} onPause={() => videoRef.current?.play()}
onProgress={() => { onProgress={() => {
const bufferTime = getBufferedTime(videoRef.current);
console.log(bufferTime);
// if we have > 3 seconds of buffered data and we're still not playing, // if we have > 3 seconds of buffered data and we're still not playing,
// something might be wrong - maybe codec issue, no audio, etc // something might be wrong - maybe codec issue, no audio, etc
// so mark the player as playing so that error handlers will fire // so mark the player as playing so that error handlers will fire
if ( if (!isPlaying && playbackEnabled && bufferTime > 3) {
!isPlaying &&
playbackEnabled &&
getBufferedTime(videoRef.current) > 3
) {
setIsPlaying(true); setIsPlaying(true);
lastJumpTimeRef.current = Date.now();
onPlaying?.(); onPlaying?.();
} }
// if we have > 1 second of buffered data and we're playing, we may have
// drifted from actual live time, so seek to the end of buffered data
if (
videoRef.current &&
isPlaying &&
playbackEnabled &&
bufferTime > 2
) {
jumpToLive();
}
if (onError != undefined) { if (onError != undefined) {
if (videoRef.current?.paused) { if (videoRef.current?.paused) {
return; return;