视频变速
0.5x / 2x 等倍速调整 · 保持 / 不保持音调
0.25x~4x 变速(setpts)
0.5x / 2x 等倍速调整 · 保持 / 不保持音调
视频处理涉及复杂的解码 / 编码 / 滤镜操作,桌面 FFmpeg(开源 / 免费)是业界事实标准。安装 5 分钟,运行如下命令一次解决:
用 Homebrew,5 秒安装
Debian/Ubuntu/Fedora
无需本地安装
按上方系统对应的命令安装。验证:ffmpeg -version 应输出版本号。
将 input.mp4 改为你的实际视频文件路径。
用终端 (Terminal / cmd / PowerShell) 切到视频所在目录,粘贴命令并回车。
短视频几秒,长视频几分钟。输出文件出现在同目录。
atempo:音频倍速 0.5-100x。超过此范围用链式 atempo=2.0,atempo=2.0=4x。
了解工具定位 · 使用场景 · 对比优势
将视频播放速度调整为 0.25 倍到 4 倍。剪辑师快速预览素材、学习者逐帧分析教程、创作者制作快慢镜头效果,无需重新编码即可完成。视频文件在浏览器本地处理,不上传服务器。
短视频创作者在剪辑口播或 Vlog 时,常遇到原片语速过慢、观众流失率高的问题。使用 1.2x-1.5x 加速,能在不改变音高(需配合音频变速)的前提下让视频节奏更紧凑,3 分钟素材压缩到 2 分钟,完播率提升。同时 0.5x 慢放可用于展示产品细节或表情特写,无需额外拍摄。
学生或备考者观看录播课程时,讲师语速偏慢、废话多。用 1.5x-2x 加速,1 小时课程 40 分钟学完,节省时间用于刷题。遇到难点段落临时切回 0.75x 慢放,逐句理解公式推导。无需下载视频到本地,浏览器直接处理,不占存储。
健身爱好者或教练录制深蹲、硬拉等动作后,用 0.25x-0.5x 慢放逐帧观察膝盖角度、杠铃轨迹是否偏移。原速 10 秒的动作慢放至 40 秒,肉眼可见发力顺序错误,避免因动作不规范导致的慢性损伤。
游戏玩家录制击杀集锦时,想突出关键操作(如闪避、连招)。将 1 秒内的快速操作慢放至 0.25x(4 秒),配合后续加速跳过跑图部分,形成节奏对比。无需专业剪辑软件,上传片段直接输出变速后视频,适合发朋友圈或短视频平台。
职场人回看 1 小时会议录像时,用 2x-4x 变速快速扫过寒暄、沉默段落,遇到讨论决议时切回 1x 正常听取。4x 下 1 小时视频 15 分钟看完,提取关键结论。工具纯前端处理,不上传服务器,适合涉密会议内容。
| 维度 | 本工具 | 竞品 A (Kapwing) | 传统方法 (Premiere Pro) |
|---|---|---|---|
| 数据隐私 | 纯浏览器,零上传 | 上传到服务器处理 | 本地文件,不联网 |
| 处理速度 | 1 秒内完成 | 5-10 秒(含上传/下载) | 数分钟(含渲染导出) |
| 离线可用 | 是,完全离线 | 否,必须联网 | 是,需安装软件 |
| 大小限制 | 无,仅受浏览器内存限制 | 免费版 250MB | 无,受硬盘空间限制 |
| 收费 | 免费 | 免费版有水印,付费 $16/月 | 付费,订阅 $22.99/月 |
| 注册 | 无需注册 | 需注册账号 | 需注册并激活许可证 |
| 操作门槛 | 打开即用,无需学习 | 需简单学习界面 | 需专业剪辑知识 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 0.5x | 播放时长变为原始 2 倍,画面慢放 | 典型场景:慢动作回放,0.5x 是常用慢放倍率 |
| 2x | 播放时长变为原始 0.5 倍,画面快进 | 典型场景:快速浏览视频内容,2x 是常用快放倍率 |
| 0.25x | 播放时长变为原始 4 倍,极慢动作 | 边界 case:工具支持的最低倍率,画面极慢 |
| 4x | 播放时长变为原始 0.25 倍,极速快进 | 边界 case:工具支持的最高倍率,画面极快 |
| 1x | 播放时长不变,原始速度 | 边界 case:1x 为原始速度,输出无变化 |
| 0x | 输入值超出范围,请使用 0.25x ~ 4x | 易错 case:用户误输入 0x,工具会提示范围 |
| 5x | 输入值超出范围,请使用 0.25x ~ 4x | 易错 case:用户输入超过 4x 的倍率,工具会提示范围 |
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" input.mp4ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4FFmpeg 不允许覆盖正在读取的文件;同文件名会导致写入失败或文件损坏,必须指定不同输出名
setpts=0.1*PTS 或 setpts=5*PTSsetpts=0.5*PTS 或 setpts=2*PTS工具限速范围 0.25x~4x,超出此范围的 setpts 系数(如 0.1→10x 加速)会导致音画不同步或工具拒绝执行
ffmpeg -i input.mp4 -filter:v "setpts=2*PTS" output.mp4ffmpeg -i input.mp4 -filter:v "setpts=2*PTS" -af "atempo=0.5" output.mp4setpts 只改变视频帧速率,不改变音频;单独变速视频会导致音画不同步,必须配合 atempo 调整音频
atempo=0.25 或 atempo=4.0atempo=0.5 或 atempo=2.0FFmpeg atempo 滤波器仅支持 0.5~2.0 倍速;超出范围报错,需通过链式调用实现更大范围(如 atempo=2,atempo=2 实现 4x)
ffmpeg -i my video.mp4 -filter:v "setpts=0.5*PTS" out.mp4ffmpeg -i "my video.mp4" -filter:v "setpts=0.5*PTS" out.mp4Shell 将空格视为参数分隔符;不加引号会导致 FFmpeg 将 'my' 和 'video.mp4' 视为两个参数,引发 'No such file' 错误
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4-vf 是 -filter:v 的别名,两者等价;但若输入文件含多个视频流,需用 -filter:v:1 等指定具体流,否则默认只处理第一个
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" -c copy output.mp4ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" -c:v libx264 -crf 23 output.mp4-c copy 会复制原始编码流,但 setpts 改变了帧率,复制编码流会导致时间戳错乱;必须重新编码视频流
ffmpeg -i input.mp4 -filter:v "setpts=4*PTS" output.mp4ffmpeg -i input.mp4 -filter:v "setpts=4*PTS,setpts=N/FRAME_RATE/TB" output.mp4setpts 只缩放时间戳,不改变容器帧率;慢放时帧率不变但内容变慢,某些播放器会卡顿;需配合 fps 或 setpts 二次修正帧率
公式推导 · 流程图解 · 依据出处
T_new = T_original / speed_factor
T_new — 变速后的视频时长(秒)T_original — 原始视频时长(秒)speed_factor — 变速倍率,范围 0.25~4一段 120 秒的视频,以 2x 倍率加速。则 T_original=120,speed_factor=2,T_new = 120 / 2 = 60 秒。输出视频时长缩短为 60 秒。
适用于 FFmpeg setpts 滤镜实现的均匀变速,倍率在 0.25~4 之间。倍率超出范围或需要非均匀变速(如慢动作后加速)时不适用。
3 种主流语言 · 复制即用
import subprocess
import os
# 使用 FFmpeg setpts 滤镜实现视频变速
input_file = "input.mp4"
output_file = "output_2x.mp4"
speed_factor = 2.0 # 2x 加速
# setpts: 视频时间戳缩放,PTS = 原PTS / speed_factor
# 音频需同步调整:atempo 滤镜(范围 0.5~2.0,超范围需级联)
filter_video = f"setpts={1/speed_factor}*PTS"
filter_audio = f"atempo={speed_factor}" if 0.5 <= speed_factor <= 2.0 else None
if filter_audio:
cmd = [
"ffmpeg", "-i", input_file,
"-filter_complex", f"{filter_video};{filter_audio}",
"-c:v", "libx264", "-c:a", "aac",
output_file
]
else:
# 超范围时只处理视频,音频静音或丢弃
cmd = [
"ffmpeg", "-i", input_file,
"-vf", filter_video,
"-an", # 丢弃音频
"-c:v", "libx264",
output_file
]
subprocess.run(cmd, check=True)
print(f"生成 {output_file}")package main
import (
"fmt"
"os/exec"
"strconv"
)
func main() {
input := "input.mp4"
output := "output_0.5x.mp4"
speed := 0.5 // 0.5x 慢放
// setpts: PTS = PTS / speed,慢放时 speed<1 导致 PTS 增大
pts := 1.0 / speed
filter := fmt.Sprintf("setpts=%f*PTS", pts)
// 音频 atempo 范围 0.5~2.0,0.5x 在范围内
audioFilter := fmt.Sprintf("atempo=%f", speed)
cmd := exec.Command("ffmpeg",
"-i", input,
"-filter_complex", filter+";"+audioFilter,
"-c:v", "libx264",
"-c:a", "aac",
output,
)
if err := cmd.Run(); err != nil {
panic(err)
}
fmt.Println("生成 " + output + ",速度 " + strconv.FormatFloat(speed, 'f', 2, 64) + "x")
}// 纯前端模拟:用 Canvas 和 AudioContext 实现简单变速(非 FFmpeg)
// 实际工具使用 WASM FFmpeg,此处演示核心逻辑
function changeSpeed(videoUrl, speed, callback) {
const video = document.createElement('video');
video.src = videoUrl;
video.onloadedmetadata = () => {
// 设置 playbackRate 实现变速(0.25~4.0)
video.playbackRate = speed;
video.play();
callback(null, video);
};
video.onerror = (e) => callback(e);
}
// 示例:2x 加速播放
changeSpeed('input.mp4', 2.0, (err, el) => {
if (err) {
console.error('加载失败', err);
return;
}
console.log('播放速度:', el.playbackRate); // 2.0
});9 个高频疑问