导言:
在许多场景下,我们需要确保用户上传的视频满足一定的分辨率要求,以保证在后续的处理中能够获得良好的视觉效果。例如,一些网站可能对用户上传的视频分辨率进行限制,以确保页面加载和播放的性能。
技术实现步骤:
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 应用中处理用户上传的视频文件,提高用户体验和整体性能。
参考文献: