html5视频播放器的断点续播和记忆播放是如何做的?

html5视频播放器的断点续播和记忆播放是如何做的?

先看效果

以下为视频自动续播的截图:

视频续播/视频自动续播

视频自动续播(视频从上一次中断的时间点03:50,自动续播)

视频续播/视频自动续播

视频自动续播(视频从上一次中断的时间点05:15,自动续播)

 

当视频播放中断后,下次打开能从中断的时间点继续播放,这个功能通常被称为“断点续播”或“记忆播放”。

  • HTMLMediaElement.currentTime: 这是 HTML5 <video><audio> 元素的一个属性,用于获取或设置当前播放的时间(以秒为单位)。

  • localStorage: 这是一个浏览器提供的 API,用于在用户的浏览器中持久化存储键值对数据。即使浏览器关闭再打开,数据也不会丢失。

  • 事件监听: 需要监听视频播放器的特定事件,以便在合适的时候保存和读取播放进度。


演示实例:视频自动续播功能


原理可以参考如下代码:

html5代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>HTML5 视频断点续播</title>
    <style>
        video {
            width: 80%;
            display: block;
            margin: 20px auto;
        }
    </style>
</head>
<body>
    <h1>我的视频播放器</h1>
    <video id="myVideo" controls>
        <source src="your-video.mp4" type="video/mp4">
        您的浏览器不支持 HTML5 视频。
    </video>

    <script src="video-resume.js"></script>
</body>
</html>

JS代码

document.addEventListener('DOMContentLoaded', () => {
    const video = document.getElementById('myVideo');
    const videoId = 'your-video-id'; // 给每个视频一个唯一的ID,用于localStorage存储

    // 1. 读取保存的播放进度
    // 当页面加载时,尝试从 localStorage 获取该视频上次播放的时间
    const savedTime = localStorage.getItem(`video_progress_${videoId}`);

    if (savedTime) {
        // 如果存在保存的时间,将视频的 currentTime 设置为该时间
        // 注意:这里需要确保视频元数据已经加载完毕,否则设置可能无效。
        // 使用 'loadedmetadata' 事件确保在设置 currentTime 之前元数据已加载。
        video.addEventListener('loadedmetadata', () => {
            video.currentTime = parseFloat(savedTime);
            console.log(`视频从上次的 ${parseFloat(savedTime).toFixed(2)} 秒处继续播放。`);
            // 如果希望视频自动续播,可以在这里调用 video.play()
            // video.play(); 
        }, { once: true }); // 使用 { once: true } 确保事件只触发一次
    }

    // 2. 实时保存播放进度
    // 监听 'timeupdate' 事件,该事件在视频播放时会频繁触发
    // 为了避免频繁写入 localStorage 造成性能问题,可以设置一个更新频率
    let updateInterval;
    const saveProgress = () => {
        if (video.paused || video.ended) {
            // 如果视频暂停或结束,则不需要频繁保存
            clearInterval(updateInterval);
            updateInterval = null;
            return;
        }
        localStorage.setItem(`video_progress_${videoId}`, video.currentTime.toString());
    };

    video.addEventListener('play', () => {
        if (!updateInterval) {
            // 每隔一定时间(例如2秒)保存一次播放进度
            updateInterval = setInterval(saveProgress, 2000); 
        }
    });

    video.addEventListener('pause', () => {
        // 视频暂停时立即保存一次,并清除定时器
        saveProgress();
        clearInterval(updateInterval);
        updateInterval = null;
    });

    video.addEventListener('ended', () => {
        // 视频播放结束时,清除保存的进度(可选,取决于需求)
        localStorage.removeItem(`video_progress_${videoId}`);
        clearInterval(updateInterval);
        updateInterval = null;
        console.log('视频播放结束,清除断点记录。');
    });

    // 3. 页面卸载前保存最后一次进度
    // 确保在用户关闭页面或导航到其他页面时保存最新的播放时间
    window.addEventListener('beforeunload', () => {
        if (!video.ended) { // 如果视频没有播放完
            localStorage.setItem(`video_progress_${videoId}`, video.currentTime.toString());
            console.log('页面即将卸载,保存当前播放时间。');
        }
    });

    // 可选:添加一些UI提示,例如一个“继续播放”按钮
    // let resumeButton = document.createElement('button');
    // resumeButton.textContent = '继续播放';
    // resumeButton.style.display = 'none'; // 默认隐藏
    // document.body.insertBefore(resumeButton, video);

    // if (savedTime) {
    //     resumeButton.style.display = 'block';
    //     resumeButton.onclick = () => {
    //         video.currentTime = parseFloat(savedTime);
    //         video.play();
    //         resumeButton.style.display = 'none';
    //     };
    // }
});
  • videoId: 这是一个非常重要的变量。如果你的页面上有多个视频,每个视频都需要一个唯一的 ID 来在 localStorage 中区分它们的播放进度。你可以通过数据属性 (data-id) 从 HTML 中获取,或者直接在 JavaScript 中定义。

  • localStorage.getItem(key): 用于从 localStorage 中获取指定 key 的值。

  • localStorage.setItem(key, value): 用于将 key-value 对存储到 localStorage 中。value 必须是字符串。

  • localStorage.removeItem(key): 用于从 localStorage 中移除指定 key 的数据。

  • video.currentTime: 获取或设置视频当前的播放时间(以秒为单位)。

  • loadedmetadata 事件: 当视频的元数据(如时长、尺寸等)加载完毕后触发。在设置 currentTime 之前监听此事件可以确保视频已准备好进行跳转。

  • timeupdate 事件: 在视频播放过程中,当 currentTime 属性更新时会频繁触发。我们利用这个事件来定时保存播放进度。

  • play 事件: 当视频开始播放时触发。

  • pause 事件: 当视频暂停时触发。

  • ended 事件: 当视频播放结束时触发。

  • beforeunload 事件: 当用户即将离开页面(关闭标签页、导航到其他页面等)时触发。这是一个保存最后进度的重要时机。

  [ 视频安全 ] 相关原创文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值