新闻中心

使用HTML5 Video API在Web页面中获取视频播放时长

2025-11-16
浏览次数:
返回列表

使用HTML5 Video API在Web页面中获取视频播放时长

本教程详细介绍了如何在web页面中利用html5

在现代Web开发中,经常需要在页面上嵌入视频并显示其相关信息,其中视频的播放时长是一个常见的需求。虽然我们可以在HTML中简单地使用

核心概念:视频时长与加载事件

HTML5的

为了确保在 duration 属性可用时进行访问,我们需要监听视频元素的特定事件。最常用的事件是 loadedmetadata 和 loadeddata:

  • loadedmetadata: 当视频的元数据(包括时长、尺寸、文本轨道等)加载完毕时触发。这是获取视频时长的理想时机,因为它发生在视频数据开始加载之前,效率更高。
  • loadeddata: 当视频的第一帧数据加载完成,并且可以开始播放时触发。这个事件比 loadedmetadata 稍晚,但同样可以用来获取时长。

通常,为了尽快获取时长信息,推荐使用 loadedmetadata 事件。

HTML结构:嵌入视频并准备显示区域

首先,我们需要一个HTML结构来嵌入视频并提供一个区域来显示视频时长。给视频元素一个 id 便于J*aScript访问,同时添加一个

标签来承载时长信息。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>获取视频播放时长</title>
    <style>
        body { font-family: sans-serif; margin: 20px; }
        video { max-width: 600px; border: 1px solid #ccc; display: block; margin-bottom: 10px; }
        #durationDisplay { font-weight: bold; color: #333; }
    </style>
</head>
<body>
    <h1>视频播放时长示例</h1>

    <video id="myVideo" controls preload="metadata">
        <source src="https://firebasestorage.googleapis.com/v0/b/qriositynet-dev.appspot.com/o/chat%2FMgttfKqKIDhQ6bgtgy6V%2Fvideos%2F1663229371400watermelon-bunny.mp4?alt=media&token=722nb260-c65b-46fe-8805-4a5a742f282d" type="video/mp4" />
        您的浏览器不支持HTML5视频。
    </video>

    <p>视频时长:<span id="durationDisplay">加载中...</span></p>

    <script src="app.js"></script>
</body>
</html>

在上述HTML中:

Visla Visla

AI视频生成器,快速轻松地将您的想法转化为视觉上令人惊叹的视频。

Visla 100 查看详情 Visla
  • :这个 元素将用于显示获取到的视频时长。

J*aScript实现:监听事件并获取时长

现在,我们需要编写J*aScript代码来监听 myVideo 元素的 loadedmetadata 事件,并在事件触发时获取 duration 属性的值,然后将其显示在 durationDisplay 元素中。

为了更好的用户体验,通常会将时长(以秒为单位)转换为更易读的格式,如“分钟:秒”或“小时:分钟:秒”。

// app.js
document.addEventListener('DOMContentLoaded', function() {
    const videoElement = document.getElementById('myVideo');
    const durationDisplay = document.getElementById('durationDisplay');

    // 辅助函数:将秒数格式化为 MM:SS 或 HH:MM:SS 格式
    function formatDuration(seconds) {
        const hours = Math.floor(seconds / 3600);
        const minutes = Math.floor((seconds % 3600) / 60);
        const remainingSeconds = Math.floor(seconds % 60);

        const formattedMinutes = String(minutes).padStart(2, '0');
        const formattedSeconds = String(remainingSeconds).padStart(2, '0');

        if (hours > 0) {
            const formattedHours = String(hours).padStart(2, '0');
            return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;
        } else {
            return `${formattedMinutes}:${formattedSeconds}`;
        }
    }

    // 监听 loadedmetadata 事件
    videoElement.addEventListener('loadedmetadata', function() {
        if (videoElement.duration && !isNaN(videoElement.duration)) {
            const durationInSeconds = videoElement.duration;
            durationDisplay.textContent = formatDuration(durationInSeconds);
            console.log("视频时长 (秒):", durationInSeconds);
            console.log("视频时长 (格式化):", formatDuration(durationInSeconds));
        } else {
            durationDisplay.textContent = '无法获取时长';
            console.warn('视频元数据加载完成,但时长属性不可用。');
        }
    });

    // 错误处理:如果视频加载失败
    videoElement.addEventListener('error', function() {
        durationDisplay.textContent = '视频加载失败';
        console.error('视频加载失败,请检查链接或文件。');
    });

    // 如果视频已经加载了元数据(例如,页面缓存),则立即尝试获取时长
    // 检查 readyState 是否已达到 H*E_METADATA (2) 或更高
    if (videoElement.readyState >= 2) { 
        if (videoElement.duration && !isNaN(videoElement.duration)) {
            const durationInSeconds = videoElement.duration;
            durationDisplay.textContent = formatDuration(durationInSeconds);
            console.log("视频时长 (秒,DOM加载时已可用):", durationInSeconds);
        } else {
            durationDisplay.textContent = '无法获取时长';
            console.warn('DOM加载时视频元数据已就绪,但时长属性不可用。');
        }
    }
});

在上述J*aScript代码中:

  1. DOMContentLoaded: 确保在DOM完全加载后再执行脚本,避免元素未找到的问题。
  2. formatDuration 函数: 这是一个辅助函数,用于将原始的秒数转换为 MM:SS 或 HH:MM:SS 格式,提高了可读性。
  3. videoElement.addEventListener('loadedmetadata', ...): 这是核心部分,当视频的元数据加载完成后,回调函数会被执行。
  4. videoElement.duration: 在回调函数内部,我们访问 videoElement.duration 来获取视频总时长。
  5. isNaN(videoElement.duration): 检查 duration 是否为有效数字,因为在某些情况下(如视频未完全加载或发生错误),它可能返回 NaN 或 Infinity。
  6. durationDisplay.textContent = ...: 将格式化后的时长更新到页面上的 元素中。
  7. 错误处理: 添加 error 事件监听器,以便在视频加载失败时向用户提供反馈。
  8. readyState 检查: 在 DOMContentLoaded 时,检查 videoElement.readyState。如果视频的元数据已经加载(readyState >= 2,即 HTMLMediaElement.H*E_METADATA),则可以直接获取时长,这对于页面缓存或快速加载的场景很有用,避免了等待事件的延迟。

完整示例

将上述HTML和J*aScript代码分别保存为 index.html 和 app.js,并确保 app.js 文件通过 标签在 index.html 中正确引用。打开 index.html,您将看到视频播放器及其下方显示的视频时长。

注意事项

  • 跨域问题: 如果视频文件与您的网页不在同一个域下,可能会遇到跨域(CORS)问题。在这种情况下,浏览器可能无法加载视频或其元数据。确保视频服务器配置了正确的CORS头。
  • 视频格式支持: 确保您提供的视频格式(如MP4)被主流浏览器广泛支持。否则,视频可能无法播放,也无法获取时长。
  • 网络状况: 视频时长依赖于视频元数据的加载。在网络状况不佳时,获取时长可能会有延迟。
  • preload 属性: preload="metadata" 可以帮助浏览器更快地获取时长,但它只是一个提示,浏览器不一定会严格遵守。如果设置为 none,则需要用户交互(如点击播放)才能加载元数据。
  • 精度: duration 属性返回的时长通常是浮点数,表示秒数,精度可能因视频编码而异。在显示时进行四舍五入或格式化是良好的实践。

总结

通过利用HTML5

以上就是使用HTML5 Video API在Web页面中获取视频播放时长的详细内容,更多请关注其它相关文章!


# 个人网站推广app  # 您的  # 这是  # 鼠标  # 我们可以  # 更快  # 提供一个  # 兰州优化seo方案报价  # 平潭网站seo技术  # 视频播放  # www网站建设设计维护  # 公众号线上营销推广  # 营销推广市场定位方法  # 网站优化员招聘要求  # 天津网站推广营销费用  # 枣庄seo推广如何操作  # 八网站发布与推广  # 回调函数  # java  # html  # js  # go  # html5  # 编码  # 浏览器  # app  # javascript  # ai  # ios  # 跨域  # g  # 时长  # 加载  # 回调 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Log4j Console Appender性能瓶颈与高并发优化策略  KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法  整合Supabase认证与Django模型:跨模式迁移的解决方案  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程  PHP中SSG-WSG API的AES加密实践:正确使用初始化向量  QQ网页版官方账号入口 QQ网页版网页版登录指南  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  Python实时数据流中的动态最值查找策略  火锅吃太多会怎样 火锅吃太多会上火吗  必由学官方登录入口 必由学教师学生账号快速访问  蛙漫安全无毒 官方认证的绿色入口  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  J*aScript实现单选按钮与关联输入框的联动禁用教程  使用Pandas转换并合并DataFrame:多列映射至统一结构  CSS Grid如何控制元素对齐_align-items与justify-items组合使用  优化大型XML文件解析:基于Python流式处理的内存高效方案  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  动漫花园资源网使用步骤_动漫花园资源网下载流程  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  ArrayList与LinkedList操作复杂度详解:遍历与修改  怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  优化HTML表单样式:解决输入框焦点跳动与元素间距问题  探索高级语言到原生C/C++的转译:挑战与内存管理策略  服务端验证_j*ascript输入检查  Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略  Python字典中优雅地迭代剩余元素的方法  微信商城在哪里打开【步骤】  生成rdflib自定义SPARQL函数:参数匹配与实践指南  C++如何比较两个字符串_C++ string compare函数与操作符对比  J*aScript数组对象转换:按指定键分组与值收集  在命令行怎么运行html项目_命令行运行html项目方法【教程】  邮政快递单号查询入口 邮政快递物流信息在线查询入口  漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道  从OpenAI API响应中高效提取生成文本  创客贴用户入口官网登录 创客贴网页版电脑版系统  没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享  AO3官方可用镜像 Archive of Our Own网页版最新入口  浏览器打开即用 美图秀秀网页版入口  ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】  AO3同人作品网入口 AO3搜索引擎官网永久地址  格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  12306几点到几点不能订票? | 官方最新系统维护时间全解析 

搜索