JavaScript获取指定url的有效视频时长

Web前端开发 / 12 次阅读

对于网页上的<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