uniapp H5 视频上传前如何旋转视频画面90度
在uniapp开发H5页面时,需要实现视频上传功能,但发现部分手机拍摄的视频在竖屏录制时画面方向不正确,上传后会出现90度旋转的问题。请问如何在视频上传前对视频画面进行旋转校正,确保上传后的视频方向正确?希望了解具体的实现方法或代码示例,最好能兼容不同机型的拍摄方向。
2 回复
使用uni.chooseVideo选择视频后,可通过canvas绘制并旋转视频画面,然后使用uni.canvasToTempFilePath导出旋转后的视频文件,最后上传。
在 UniApp 中,H5 平台上传视频前旋转画面 90 度,可以通过以下步骤实现:
实现思路
- 使用
<input type="file">选择视频文件。 - 通过
<canvas>结合视频绘制并旋转画面。 - 将旋转后的画面导出为 Blob 或 Base64 格式。
- 上传处理后的视频文件。
示例代码
// 选择视频文件
const input = document.createElement('input');
input.type = 'file';
input.accept = 'video/*';
input.onchange = (e) => {
const file = e.target.files[0];
rotateVideo(file, 90); // 旋转90度
};
input.click();
// 旋转视频函数
function rotateVideo(file, degrees) {
const video = document.createElement('video');
video.src = URL.createObjectURL(file);
video.onloadedmetadata = () => {
video.play(); // 播放以解码帧
video.oncanplay = () => {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
// 根据旋转角度调整 canvas 尺寸
if (degrees % 180 === 90) {
canvas.width = video.videoHeight;
canvas.height = video.videoWidth;
} else {
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
}
// 旋转并绘制画面
ctx.translate(canvas.width / 2, canvas.height / 2);
ctx.rotate((degrees * Math.PI) / 180);
ctx.drawImage(video, -video.videoWidth / 2, -video.videoHeight / 2);
// 导出为 Blob
canvas.toBlob((blob) => {
const rotatedFile = new File([blob], file.name, { type: file.type });
// 上传 rotatedFile(例如使用 uni.uploadFile)
console.log('旋转后的文件:', rotatedFile);
}, file.type);
};
};
}
注意事项
- 兼容性:部分浏览器可能限制自动播放,需用户交互触发。
- 性能:大文件处理可能较慢,建议分帧或提示用户。
- 格式支持:确保导出格式与原文件一致(如 MP4)。
上传处理后的文件
使用 uni.uploadFile 上传旋转后的视频:
uni.uploadFile({
url: '你的上传地址',
filePath: rotatedFile,
name: 'file',
success: (res) => {
console.log('上传成功', res);
}
});
此方法适用于 H5 平台,其他平台(如 App)需调用原生 API 或插件实现旋转。

