js实现视频压缩
实现视频压缩的方法
在JavaScript中实现视频压缩可以通过多种方式完成,包括使用浏览器API、第三方库或WebAssembly技术。以下是几种常见的方法:
使用HTML5 Video API和Canvas
通过HTML5的<video>元素和<canvas>元素可以实现基本的视频压缩。将视频帧绘制到Canvas上,调整画布尺寸和质量,然后导出为压缩后的视频。

const video = document.getElementById('video');
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
// 设置画布尺寸为原视频的一半
canvas.width = video.videoWidth / 2;
canvas.height = video.videoHeight / 2;
// 将视频帧绘制到画布上
function captureFrame() {
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
// 获取压缩后的图像数据
const compressedData = canvas.toDataURL('image/jpeg', 0.7);
return compressedData;
}
使用MediaRecorder API
MediaRecorder API可以直接录制和压缩视频流,支持多种编码格式和比特率设置。
navigator.mediaDevices.getUserMedia({ video: true })
.then(stream => {
const mediaRecorder = new MediaRecorder(stream, {
mimeType: 'video/webm',
videoBitsPerSecond: 250000 // 设置比特率为250kbps
});
mediaRecorder.ondataavailable = e => {
const compressedBlob = e.data;
// 处理压缩后的视频数据
};
mediaRecorder.start();
setTimeout(() => mediaRecorder.stop(), 5000);
});
使用第三方库
FFmpeg.js是一个基于WebAssembly的FFmpeg端口,可以在浏览器中实现高性能视频压缩。

import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg';
const ffmpeg = createFFmpeg({ log: true });
await ffmpeg.load();
const data = await fetchFile('input.mp4');
ffmpeg.FS('writeFile', 'input.mp4', data);
await ffmpeg.run('-i', 'input.mp4', '-b:v', '500k', 'output.mp4');
const compressedData = ffmpeg.FS('readFile', 'output.mp4');
使用Web Worker优化性能
视频压缩是计算密集型任务,使用Web Worker可以避免阻塞主线程。
// worker.js
self.onmessage = async (e) => {
const { file, options } = e.data;
// 执行压缩逻辑
const compressedBlob = await compressVideo(file, options);
self.postMessage(compressedBlob);
};
// 主线程
const worker = new Worker('worker.js');
worker.postMessage({ file: videoFile, options: { bitrate: 500 } });
worker.onmessage = (e) => {
const compressedBlob = e.data;
// 处理压缩后的视频
};
调整视频参数
通过调整视频的帧率、分辨率和比特率可以显著减小文件大小。
function compressVideo(stream, options) {
const { frameRate, width, height, bitrate } = options;
const mediaRecorder = new MediaRecorder(stream, {
mimeType: 'video/webm',
videoBitsPerSecond: bitrate
});
// 其他处理逻辑
}
注意事项
- 不同浏览器对视频编码的支持不同,需测试兼容性。
- 高压缩比可能导致视频质量明显下降,需平衡质量和文件大小。
- 大视频文件的压缩可能耗时较长,需提供进度反馈。
以上方法可以根据具体需求选择或组合使用,实现适合场景的视频压缩功能。





