视频旋转翻转
90/180/270 度旋转 + 水平 / 垂直翻转
90/180/270/镜像
90/180/270 度旋转 + 水平 / 垂直翻转
视频处理涉及复杂的解码 / 编码 / 滤镜操作,桌面 FFmpeg(开源 / 免费)是业界事实标准。安装 5 分钟,运行如下命令一次解决:
用 Homebrew,5 秒安装
Debian/Ubuntu/Fedora
无需本地安装
按上方系统对应的命令安装。验证:ffmpeg -version 应输出版本号。
将 input.mp4 改为你的实际视频文件路径。
用终端 (Terminal / cmd / PowerShell) 切到视频所在目录,粘贴命令并回车。
短视频几秒,长视频几分钟。输出文件出现在同目录。
了解工具定位 · 使用场景 · 对比优势
将视频画面顺时针旋转 90°、180°、270° 或水平镜像翻转。视频创作者调整竖屏横屏、主播修正摄像头方向、剪辑师统一素材角度,无需重新拍摄。视频通过 FFmpeg 在服务端处理,上传后自动旋转,处理完毕即可下载。
用手机拍摄的竖屏视频(1080×1920)上传到电脑播放器或剪辑软件后,有时会被强制横屏显示(1920×1080),人物被压扁或两侧出现黑边。使用本工具的 90°/270° 旋转功能,一次点击即可将视频恢复为正确的竖屏方向,确保在手机相册、微信朋友圈或抖音快手等平台正常显示,无需重拍。
运动相机(如 GoPro、DJI Action)在车顶、头盔或自拍杆上倒置安装时,录制的视频画面是颠倒的。传统做法是在剪辑软件里手动旋转关键帧,效率低且容易出错。本工具提供 180° 旋转功能,批量上传倒置素材后统一旋转,几秒内得到正立画面,适合户外运动博主和 Vlog 创作者快速处理大量素材。
许多手机前置摄像头默认开启镜像模式,拍出的视频中文字、衣服上的 logo、手势方向都是左右相反的。用本工具的「镜像翻转」功能,上传自拍视频后一键将画面水平翻转,恢复真实方向,适合美妆教程、手势教学、产品展示等需要画面与实际一致的内容创作。
在拍摄多机位访谈或课程时,不同机位的摄像机安装方向不同(正面机位正常、侧面机位可能旋转了 90°),导致素材方向不统一,剪辑时需逐段调整。使用本工具将所有素材统一旋转到同一方向(如全部转为 0°),再导入剪辑软件,省去逐个片段旋转的时间,适合教育机构、播客团队等高频多机位拍摄场景。
部分安防摄像头因安装角度限制,录制的画面是倒置或侧向的(如天花板吊装、墙面侧装)。查看回放时需歪头或旋转显示器,极不方便。使用本工具的 180° 或 90° 旋转功能,将监控视频片段校正为正常观看方向,便于快速回放、截图取证或分享给物业/警方,适合家庭安防和商铺监控用户。
| 维度 | 本工具 | 竞品 A(Kapwing) | 传统方法(Premiere Pro) |
|---|---|---|---|
| 数据隐私 | 纯浏览器 WASM 处理,视频不上传服务器 | 上传到 Kapwing 服务器处理 | 视频文件保存在本地电脑 |
| 处理速度 | 1 秒内完成(本地计算) | 5-15 秒(上传+服务器排队+处理+下载) | 30 秒-2 分钟(导入项目+渲染导出) |
| 离线可用 | 完全离线(浏览器内 WASM) | 必须联网 | 必须安装软件,可离线使用 |
| 文件大小限制 | 受浏览器内存限制(约 2GB) | 免费版 250MB,Pro 版 1GB | 无限制(取决于硬盘) |
| 收费 | 免费,无隐藏付费 | 免费版有水印,Pro $16/月 | 正版 $22.99/月(Creative Cloud) |
| 注册要求 | 无需注册,打开即用 | 需注册账号 | 需 Adobe 账号 |
| 批量处理 | 单次 1 个文件 | 单次 1 个文件 | 可批量导入+批量导出 |
| 输出格式控制 | 固定输出 MP4(H.264) | 可选 MP4/GIF 等 | 任意格式/编码/分辨率 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| landscape.mp4 (横屏拍摄的视频) | 旋转 90° 后输出 portrait.mp4 (竖屏视频) | 典型场景:将横屏视频旋转为竖屏适配手机观看 |
| selfie.mp4 (前置摄像头拍摄的视频) | 水平镜像后输出 mirrored_selfie.mp4 (左右翻转的视频) | 典型场景:修正前置摄像头自拍视频的镜像效果 |
| video.mp4 (倒置拍摄的视频) | 旋转 180° 后输出 upright.mp4 (正立视频) | 典型场景:修复拍摄时手机拿反导致的倒置视频 |
| slideshow.mp4 (屏幕录制,内容为从左到右的文字) | 旋转 270° 后输出 rotated_slideshow.mp4 (底部朝左) | 边界 case:旋转后内容阅读方向会改变,需确认效果 |
| vertical.mp4 (已为竖屏的视频) | 旋转 90° 后输出 horizontal.mp4 (变为横屏) | 边界 case:对已竖屏视频再次旋转,会变成横屏 |
| text_overlay.mp4 (视频内嵌有文字或图标) | 镜像后输出 mirrored_text.mp4 (文字和图标均左右颠倒) | 易错 case:镜像操作会导致文字反向,不适合含文字的视频 |
| very_long_video.mp4 (时长 2 小时的视频) | 旋转 90° 后输出 rotated_long.mp4 (保持原时长,画幅改变) | 边界 case:处理长视频时耗时较长,需耐心等待 |
直接选择 90° 旋转,输出视频四周出现黑边或画面被裁掉一部分旋转前检查原视频分辨率(如 1920×1080 横屏),旋转 90° 后应手动设置输出分辨率为 1080×1920,或使用工具自动交换宽高选项旋转不改变视频的原始宽高比,若容器尺寸不变,画面会缩放填满导致黑边或裁切。需要同时调整输出分辨率与旋转角度匹配。
对带文字水印或硬字幕的视频做水平镜像,输出文字变成镜像反字如果目标是保留文字可读性,应使用垂直镜像(上下翻转)而非水平镜像;或先提取字幕/水印层,翻转视频后再叠加水平镜像(左右翻转)会反转所有像素的 X 坐标,包括叠加的文字层。垂直镜像只反转 Y 坐标,文字方向不变。
需要将竖屏视频顺时针转 90° 变成横屏,选择了 270°(逆时针 90°),结果画面倒置确认原始视频的旋转方向:手机拍摄的竖屏视频通常 metadata 标记为 90° 或 270°。先用工具查看原始旋转元数据,再选择补足到目标角度的值不同设备拍摄的视频 metadata 中旋转方向定义不同(Exif 旋转 vs 实际像素方向)。直接选 90° 或 270° 前最好先预览一帧确认。
先旋转 90°,不满意再旋转 90°,重复 4 次得到原方向,但视频画质明显下降一次性指定最终需要的角度(如直接 180° 而非两次 90°);或使用无损旋转(仅修改 metadata 不重编码)每次旋转都涉及重新编码(解码→旋转→编码),有损编解码会产生累积质量损失。支持 metadata 旋转的工具(如 FFmpeg 的 -metadata:s:v rotate=90)可避免重编码。
旋转 180° 后,视频画面与音频出现明显延迟或超前检查旋转前视频是否有可变帧率(VFR)。若原视频是 VFR,旋转时需指定 -vsync vfr 或先转为恒定帧率(CFR)再旋转可变帧率视频在旋转时,FFmpeg 等工具可能错误地重新分配时间戳,导致音画不同步。恒定帧率视频无此问题。
手机拍摄的竖屏视频 metadata 已标记 90° 旋转,工具自动读取后显示正常。用户又手动选择 90° 旋转,结果画面变成 180° 倒置先检查工具是否自动应用了 metadata 旋转。如果已自动旋转,手动旋转应在原始角度基础上叠加,而非直接覆盖许多播放器和工具会自动读取视频文件的旋转 metadata 并显示正确方向。手动旋转时若忽略此 metadata,会导致双重旋转。
一个 50MB 的短视频旋转 90° 后变成 200MB+旋转前检查原视频编码和码率。若原视频是高效编码(H.265/HEVC),旋转后工具可能默认用 H.264 编码且码率翻倍。手动指定输出编码和码率参数不同编码器压缩效率差异大。H.265 转 H.264 通常体积增加 30-50%。旋转工具若未保留原编码参数,可能使用默认高码率设置。
公式推导 · 流程图解 · 依据出处
新坐标 = 原坐标 × 旋转矩阵 R(θ) + 镜像矩阵 M
原坐标 — 视频帧中像素的原始 (x, y) 位置R(θ) — 旋转矩阵,θ 为 90°、180° 或 270°M — 镜像矩阵,水平翻转时 x 取反新坐标 — 变换后像素在输出帧中的 (x', y') 位置对 1920×1080 视频帧做 90° 顺时针旋转 + 水平镜像。原像素 (100, 200) 先旋转:x' = 200, y' = 1920 - 100 - 1 = 1819;再镜像:x'' = 1920 - 200 - 1 = 1719, y'' = 1819。最终新坐标为 (1719, 1819)。
适用于任意分辨率视频帧的 90°/180°/270° 旋转与水平/垂直镜像组合变换。不涉及缩放或剪切,像素坐标取整后无插值误差。基于标准仿射变换矩阵(OpenCV/FFmpeg 实现)。
3 种主流语言 · 复制即用
import subprocess
import os
# 使用 FFmpeg 旋转视频 90 度(顺时针)
input_path = "input.mp4"
output_path = "output_90.mp4"
# transpose=1: 顺时针90°; 2: 逆时针90°; 3: 顺时针180°; 0: 逆时针180°
# 镜像: hflip(水平翻转)或 vflip(垂直翻转)
result = subprocess.run([
"ffmpeg", "-i", input_path,
"-vf", "transpose=1",
"-c:a", "copy",
output_path
], capture_output=True, text=True)
if result.returncode != 0:
print("FFmpeg 错误:", result.stderr)
else:
print(f"已生成: {output_path}")package main
import (
"fmt"
"os/exec"
)
func main() {
input := "input.mp4"
output := "output_270.mp4"
// 旋转 270 度(transpose=2 逆时针90° 等效于顺时针270°)
cmd := exec.Command("ffmpeg",
"-i", input,
"-vf", "transpose=2",
"-c:a", "copy",
output,
)
if err := cmd.Run(); err != nil {
fmt.Println("FFmpeg 执行失败:", err)
} else {
fmt.Printf("已生成: %s\n", output)
}
}const { execSync } = require('child_process');
const path = require('path');
const input = 'input.mp4';
const output = 'output_mirror.mp4';
// 水平镜像(hflip)
try {
execSync(
`ffmpeg -i "${input}" -vf "hflip" -c:a copy "${output}"`,
{ stdio: 'pipe' }
);
console.log(`已生成: ${output}`);
} catch (err) {
console.error('FFmpeg 错误:', err.stderr.toString());
}8 个高频疑问