对于网页上的<video></video>
视频,可以通过通过监听对象的预加载元数据(loadedmetadata),然后获取视频对象的时长属性object.duration
得到视频时长。如果只有一个视频url,也可以通过创建video元素,然后再监听预加载元数据。
获取视频时长函数:
async function getVideoDuration(url) { return new Promise((resolve, reject) => { // 1. 创建video元素 const video = document.createElement('video'); // 2. 设置跨域属性(重要!) video.crossOrigin = "anonymous"; // 3. 设置视频URL video.src = url; // 4. 关键:添加预加载元数据的监听 video.addEventListener('loadedmetadata', () => { // 确保视频时长有效 if (video.duration !== Infinity && !isNaN(video.duration)) { resolve(video.duration); // 返回秒为单位的时长 } else { reject(new Error('无法获取有效视频时长')); } }); // 5. 错误处理 video.addEventListener('error', (e) => { reject(new Error(`视频加载失败: ${e.message}`)); }); // 6. 触发加载(部分浏览器需要) video.load(); }); }
说明:async 关键字在JavaScript中用于声明一个异步函数,其主要作用是简化异步编程,使得异步代码看起来更像同步代码,从而提高代码的可读性和可维护性
调用函数获取视频时长:
videoUrl = 'https://yourdomain/video.mp4'; getVideoDuration(videoUrl).then(duration => { console.log('视频时长:',duration); });
上面代码输出的是秒数,如果想用时分秒的格式,还得格式化一下。
格式化秒数的函数:
function formatDuration(seconds) { const h = Math.floor(seconds / 3600); const m = Math.floor((seconds % 3600) / 60); const s = Math.floor(seconds % 60); return [h, m, s].map(v => v.toString().padStart(2, '0')).join(':'); }
格式化秒数后的时间:
videoUrl = 'https://yourdomain/video.mp4'; getVideoDuration(videoUrl).then(duration => { console.log('视频时长:',formatDuration(duration)); });
输出的时间格式为:00:00:00