视频压缩
通过调整 CRF / 码率减小视频体积 · 平衡质量与体积
码率/CRF/分辨率多档
通过调整 CRF / 码率减小视频体积 · 平衡质量与体积
视频处理涉及复杂的解码 / 编码 / 滤镜操作,桌面 FFmpeg(开源 / 免费)是业界事实标准。安装 5 分钟,运行如下命令一次解决:
用 Homebrew,5 秒安装
Debian/Ubuntu/Fedora
无需本地安装
按上方系统对应的命令安装。验证:ffmpeg -version 应输出版本号。
将 input.mp4 改为你的实际视频文件路径。
用终端 (Terminal / cmd / PowerShell) 切到视频所在目录,粘贴命令并回车。
短视频几秒,长视频几分钟。输出文件出现在同目录。
CRF:常用 23-28(值越高体积越小质量越低)。CRF 28 通常可减 60% 体积。
-preset:slow(慢但小) / medium / fast,控制编码速度 vs 体积。
了解工具定位 · 使用场景 · 对比优势
调整视频码率、CRF 值或分辨率,在文件大小与画质之间找到平衡点。自媒体运营者压缩素材上传平台、开发者批量处理测试视频、普通用户缩小手机录像以便分享,均可使用。处理在服务端通过 FFmpeg 完成,视频上传后自动压缩,结果可随时下载。
短视频创作者在发布作品到抖音、快手等平台时,常遇到原始素材体积过大导致上传慢或超出平台限制。使用本工具,通过调节码率或选择 CRF 模式,在保持画面基本清晰的前提下将文件压缩至平台要求的 500MB 以下,大幅缩短上传等待时间,同时保留足够画质供手机端观看。
教育机构讲师需要将录制的课程视频(1080p、时长 1 小时)上传到学习平台,但平台对单个文件有 200MB 限制。本工具支持多档分辨率调节,讲师可选择将分辨率降至 720p 并配合中等 CRF 值,在保证文字和幻灯片内容清晰可读的前提下,将文件体积压缩 70% 以上,满足平台上传要求。
商务人士在发送项目演示视频或产品介绍视频时,常受限于邮件附件 25MB 的大小限制。使用本工具,通过降低码率或选择较高的 CRF 值(如 28),可将原本 100MB 的视频压缩至 20MB 以下,同时保持关键画面(如产品外观、图表)的辨识度,确保收件方无需下载额外软件即可在线预览。
个人用户手机或电脑中积累了大量家庭录像、旅行视频,占用几十 GB 空间。本工具提供分辨率多档选项,用户可将 4K 视频降采样至 1080p 并配合适当码率,在保留回忆画面细节的前提下将文件体积缩小 80%,释放出大量存储空间用于安装新应用或保存其他重要文件。
网站运营者需要将产品展示视频嵌入页面,但原始视频过大导致网页加载缓慢、跳出率升高。使用本工具,通过精确控制码率或选择 CRF 模式,在保证视频在网页上播放流畅的前提下将文件压缩至 5MB 以内,显著提升页面加载速度与用户体验,同时降低服务器带宽成本。
| 维度 | 本工具 (tl654.com) | HandBrake (桌面端) | 传统方法 (Premiere Pro) |
|---|---|---|---|
| 数据隐私 | 纯浏览器端处理,视频不上传服务器 | 本地处理,无网络传输 | 本地处理,但需安装大型软件 |
| 离线可用 | 需联网加载 WASM 引擎,加载后离线可用 | 完全离线 | 完全离线 |
| 处理速度 | 1-3 秒(小文件),受浏览器性能限制 | 5-30 秒(同配置),原生性能更优 | 数分钟至数小时(含渲染队列) |
| 操作门槛 | 打开网页即用,零配置 | 需下载安装,学习编码参数 | 需掌握专业剪辑流程 |
| 收费模式 | 免费,无隐藏付费 | 免费开源 | 订阅制(¥34.6/月起) |
| 批量处理 | 单次单文件 | 支持队列批量 | 支持序列批量 |
| 平台兼容 | 任何现代浏览器(Win/Mac/Linux) | 仅桌面端(Win/Mac/Linux) | 仅 Win/Mac |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 输入视频:1080p 30fps 1分钟.mp4 输出设置:CRF=23,分辨率保持1080p,编码h264 | 输出文件:1080p 30fps 1分钟_compressed.mp4(文件大小从 150MB → 45MB,画质肉眼无损) | 典型场景:CRF 23 是通用平衡档,适合日常视频备份 |
| 输入视频:4K 60fps 5分钟.mp4 输出设置:目标码率 10Mbps,分辨率降为1080p,编码h265 | 输出文件:4K转1080p_10Mbps.mp4(文件大小从 2.1GB → 375MB,流畅播放于移动设备) | 典型场景:高分辨率视频降档,适合手机/平板存储 |
| 输入视频:1080p 30fps 30秒.mp4 输出设置:CRF=0(无损模式),分辨率保持1080p,编码h264 | 输出文件:1080p_lossless.mp4(文件大小从 75MB → 210MB,画质完全无损耗) | 边界 case:CRF=0 为无损,文件反而变大,仅用于剪辑中间片 |
| 输入视频:720p 24fps 10秒.mp4 输出设置:CRF=51(最高压缩),分辨率保持720p,编码h264 | 输出文件:720p_maxcompress.mp4(文件大小从 25MB → 1.2MB,画面出现明显块状模糊) | 边界 case:CRF=51 为极端压缩,仅用于缩略图或极低带宽场景 |
| 输入视频:1080p 30fps 2分钟.mp4 输出设置:分辨率设为 320x240,CRF=23,编码h264 | 输出文件:320x240_thumbnail.mp4(文件大小从 300MB → 3.5MB,分辨率过低无法看清文字) | 边界 case:过度缩小分辨率,适合预览缩略图而非正常观看 |
| 输入视频:1920x1080 60fps 1分钟.mp4 输出设置:目标码率 100kbps,分辨率保持1080p,编码h264 | 输出文件:1080p_100kbps.mp4(文件大小从 200MB → 0.75MB,画面严重马赛克且帧率下降) | 易错 case:码率过低导致画质崩溃,新手常误以为码率越低越好 |
| 输入视频:1080p 30fps 5分钟.mp4 输出设置:CRF=23,分辨率设为 3840x2160(升频),编码h264 | 输出文件:upscaled_4K.mp4(文件大小从 750MB → 2.3GB,画质未提升且文件变大) | 易错 case:升频不会增加细节,只会浪费存储空间 |
CRF: 51CRF: 18-23(默认 23)CRF 值越小质量越高(文件越大),值越大压缩越狠(质量越低)。51 是最高压缩比,画质几乎不可用;0 是无损。新手常把 CRF 当百分比用。
原视频 1080p → 目标 4K(3840×2160),码率保持 2 Mbps目标 4K 时至少把码率提到 8-15 Mbps,或改用 CRF 模式分辨率翻 4 倍(像素数×4),固定码率下每个像素分到的比特数只剩 1/4,画质严重劣化;但编码器仍会生成 4K 容器,文件大小可能因分辨率元数据膨胀。
码率模式选 CBR 2 Mbps用 VBR(可变码率)或 CRF 模式CBR 强制每帧用相同比特数,静态场景浪费带宽、动态场景不够用。VBR 或 CRF 按画面复杂度分配比特,同等画质下文件更小。CBR 仅用于直播/流媒体协议要求。
视频码率 1 Mbps,音频码率 320 kbps视频码率 1 Mbps,音频码率 128-192 kbps(AAC)人耳对 128 kbps AAC 以上差异不敏感,320 kbps 的音频会吃掉 1/3 的码率预算,导致视频画质严重下降。音频用 128-192 kbps 足够,省下的比特给视频。
60 fps → 30 fps,预期文件大小减半30 fps 文件通常只比 60 fps 小 10-20%(运动场景),静态场景几乎不变帧率减半只减少了帧数,但编码器对相邻帧做帧间预测,运动少的帧压缩率极高。真正省体积的是降码率或降分辨率,不是降帧率。
输出格式选 PNG 序列或 TIFF 序列输出格式选 H.264(MP4)或 H.265(HEVC)视频压缩工具的输出应为视频编码格式。PNG 序列是逐帧无损图片,体积是 H.264 的 10-50 倍,且不能直接播放。只有需要逐帧编辑时才用序列帧。
把一个 2 Mbps 的 H.264 视频再压到 1 Mbps源文件码率已经很低时,直接使用原文件或仅改容器格式有损压缩是信息丢弃过程,二次压缩会叠加失真(块效应、振铃)。从 2 Mbps 压到 1 Mbps 画质下降远大于从 20 Mbps 压到 10 Mbps。建议用原素材(相机/录屏)压缩。
输入是 720×576(DVD PAL,PAR 16:15),输出设 720×576(方形像素)输出分辨率改为 768×576(保持显示宽高比 4:3),或指定 -aspect 4:3非方形像素视频(如 DVD、DV)的存储分辨率 ≠ 显示分辨率。直接缩放会拉伸画面。工具若没自动检测 PAR,需手动设置输出分辨率或 aspect 参数。
公式推导 · 流程图解 · 依据出处
B = W × H × F × bpp × 1/8
B — 压缩后视频码率(bps)W — 视频宽度(像素)H — 视频高度(像素)F — 帧率(fps)bpp — 每像素比特数(由CRF/码率控制决定)原始视频 1920×1080,30fps,目标 bpp=0.1(对应 CRF≈23 中等质量)。则 B = 1920 × 1080 × 30 × 0.1 × 1/8 = 777,600 bps ≈ 778 kbps。压缩后文件大小约 778 kbps × 时长(秒)/ 8 = 字节数。
适用于 H.264/H.265 编码的恒定质量(CRF)或目标码率模式。bpp 值通常 0.05~0.3(低质量~高质量),低于 0.02 时块效应明显,高于 0.5 时收益递减。不适用于无损压缩或纯帧内编码(如 MJPEG)。
3 种主流语言 · 复制即用
import subprocess
import os
# 使用 FFmpeg 压缩视频:CRF 模式 + 调整分辨率
input_path = "input.mp4"
output_path = "output_crf28_720p.mp4"
# CRF 值范围 0-51,28 为良好平衡点;分辨率设为 1280x720
cmd = [
"ffmpeg",
"-i", input_path,
"-c:v", "libx264",
"-crf", "28",
"-vf", "scale=1280:720",
"-c:a", "aac",
"-b:a", "128k",
"-y", # 覆盖输出文件
output_path
]
try:
subprocess.run(cmd, check=True, capture_output=True, text=True)
print(f"压缩完成:{output_path}")
except subprocess.CalledProcessError as e:
print(f"FFmpeg 错误:{e.stderr}")package main
import (
"fmt"
"os/exec"
)
func main() {
// 使用 FFmpeg 压缩视频:指定码率 1Mbps + 分辨率 1280x720
input := "input.mp4"
output := "output_bitrate1m_720p.mp4"
args := []string{
"-i", input,
"-c:v", "libx264",
"-b:v", "1M",
"-vf", "scale=1280:720",
"-c:a", "aac",
"-b:a", "128k",
"-y",
output,
}
cmd := exec.Command("ffmpeg", args...)
if err := cmd.Run(); err != nil {
fmt.Printf("压缩失败:%v\n", err)
return
}
fmt.Printf("压缩完成:%s\n", output)
}const { execSync } = require('child_process');
const path = require('path');
// 使用 FFmpeg 压缩视频:CRF 模式 + 指定分辨率
const input = 'input.mp4';
const output = 'output_crf23_1080p.mp4';
const cmd = [
'ffmpeg',
'-i', input,
'-c:v', 'libx264',
'-crf', '23',
'-vf', 'scale=1920:1080',
'-c:a', 'aac',
'-b:a', '128k',
'-y',
output
].join(' ');
try {
execSync(cmd, { stdio: 'inherit' });
console.log(`压缩完成:${output}`);
} catch (err) {
console.error('FFmpeg 执行失败:', err.message);
}7 个高频疑问