如何限制视频分辨率

导言:

在许多场景下,我们需要确保用户上传的视频满足一定的分辨率要求,以保证在后续的处理中能够获得良好的视觉效果。例如,一些网站可能对用户上传的视频分辨率进行限制,以确保页面加载和播放的性能。


技术实现步骤:

1、创建视频元素和 Canvas:

ini 复制代码
const video = document.createElement('video');
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');

2、加载视频文件

ini 复制代码
video.preload = 'metadata';
video.src = URL.createObjectURL(videoFile);

3、获取视频元数据

ini 复制代码
video.onloadedmetadata = () => {
  const videoWidth = video.videoWidth;
  const videoHeight = video.videoHeight;

  // 进行分辨率校验...
};

4.分辨率校验逻辑:

ini 复制代码
// 校验最小分辨率
if (minResolution && (videoWidth < minResolution[0] || videoHeight < minResolution[1])) {
  reject(`分辨率太小,最小要求 ${minResolution[0]}x${minResolution[1]}`);
  return;
}

// 校验最大分辨率
if (maxResolution && (videoWidth > maxResolution[0] || videoHeight > maxResolution[1])) {
  reject(`分辨率太大,最大允许 ${maxResolution[0]}x${maxResolution[1]}`);
  return;
}

// 通过校验
resolve(true);

5、异常处理:

ini 复制代码
video.onerror = () => {
  reject('无法读取视频信息');
};

6、使用 Canvas 提取视频帧:

ini 复制代码
video.onloadeddata = () => {
  canvas.width = video.videoWidth;
  canvas.height = video.videoHeight;
  context.drawImage(video, 0, 0, canvas.width, canvas.height);
};

4. 示例用法:

typescript 复制代码
const videoFile: File = /* 从文件输入获取的 File 对象 */;
const minResolution: Resolution = [640, 480];
const maxResolution: Resolution = [1920, 1080];

validateResolutionInBrowser(videoFile, minResolution, maxResolution)
  .then((isValid: boolean) => {
    console.log(isValid ? '分辨率符合要求' : '分辨率不符合要求');
  })
  .catch((error: string) => {
    console.error(`校验失败: ${error}`);
  });

完整代码

ini 复制代码
type Resolution = [number, number];

function validateResolutionInBrowser(videoFile: File, minResolution?: Resolution, maxResolution?: Resolution): Promise<boolean> {
  return new Promise((resolve, reject) => {
    const video = document.createElement('video');
    const canvas = document.createElement('canvas');
    const context = canvas.getContext('2d');

    video.preload = 'metadata';
    video.src = URL.createObjectURL(videoFile);

    video.onloadedmetadata = () => {
      const videoWidth = video.videoWidth;
      const videoHeight = video.videoHeight;

      // 校验最小分辨率
      if (minResolution && (videoWidth < minResolution[0] || videoHeight < minResolution[1])) {
        reject(`分辨率太小,最小要求 ${minResolution[0]}x${minResolution[1]}`);
        return;
      }

      // 校验最大分辨率
      if (maxResolution && (videoWidth > maxResolution[0] || videoHeight > maxResolution[1])) {
        reject(`分辨率太大,最大允许 ${maxResolution[0]}x${maxResolution[1]}`);
        return;
      }

      // 通过校验
      resolve(true);
    };

    video.onerror = () => {
      reject('无法读取视频信息');
    };

    video.onloadeddata = () => {
      // 使用 Canvas 提取视频帧
      canvas.width = video.videoWidth;
      canvas.height = video.videoHeight;
      context.drawImage(video, 0, 0, canvas.width, canvas.height);
    };
  });
}

// 示例用法:
const videoFile: File = /* 从文件输入获取的 File 对象 */;
const minResolution: Resolution = [640, 480];
const maxResolution: Resolution = [1920, 1080];

validateResolutionInBrowser(videoFile, minResolution, maxResolution)
  .then((isValid: boolean) => {
    console.log(isValid ? '分辨率符合要求' : '分辨率不符合要求');
  })
  .catch((error: string) => {
    console.error(`校验失败: ${error}`);
  });

结论:

通过结合 TypeScript 和 HTML5 中的视频元素,我们可以更好地在 Web 应用中处理用户上传的视频文件,提高用户体验和整体性能。


参考文献:

相关推荐
hkNaruto1 小时前
【AI】基于大模型的AI游戏地图生成、控制方案:AI Native Game Harness 迁移操作手册
前端·人工智能·游戏
IT_陈寒1 小时前
Java序列化踩坑记:对象循环引用让我加班两小时
前端·人工智能·后端
Acro2 小时前
快给macOS 上的Grok Bot换一套皮肤
前端
flash俊杰2 小时前
双引擎 OCR 编排:逐页判定、视觉优先、partial 语义与三层超时
前端
计算机魔术师2 小时前
Reddit 每周被 Google 偷走 100 万次点击,CEO 摊牌了
前端
前端繁华如梦2 小时前
用 React Three Fiber 做一栋能编辑的教学楼数字孪生
前端
前端繁华如梦2 小时前
用 React Three Fiber 做一套智慧医院数字孪生:编辑器、大屏和 BIM 浏览器
前端
俊昭喜喜里3 小时前
理解全局跨域CORS配置
前端
锋行天下6 小时前
DeepSeek写Langgraph就是个大傻逼,一本正经胡说八道
前端·人工智能·后端
jktantan6 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript