视频格式转换
MP4 / WebM / MOV / AVI / MKV 等格式互转 · 桌面 FFmpeg 操作指引
MP4/AVI/MOV/MKV/WebM/FLV/3GP 互转
MP4 / WebM / MOV / AVI / MKV 等格式互转 · 桌面 FFmpeg 操作指引
视频处理涉及复杂的解码 / 编码 / 滤镜操作,桌面 FFmpeg(开源 / 免费)是业界事实标准。安装 5 分钟,运行如下命令一次解决:
用 Homebrew,5 秒安装
Debian/Ubuntu/Fedora
无需本地安装
按上方系统对应的命令安装。验证:ffmpeg -version 应输出版本号。
将 input.mp4 改为你的实际视频文件路径。
用终端 (Terminal / cmd / PowerShell) 切到视频所在目录,粘贴命令并回车。
短视频几秒,长视频几分钟。输出文件出现在同目录。
参数说明:-crf 23 质量等级(0=无损,51=最差,18-28 推荐);-c:v 视频编码器;-c:a 音频编码器。
在线替代:本站 视频压缩工具 支持浏览器内 MP4/WebM 简单转换(重新编码)。
了解工具定位 · 使用场景 · 对比优势
将视频文件在 MP4、AVI、MOV、MKV、WebM、FLV、3GP 格式之间快速互转。剪辑师处理多平台素材、运营人员统一视频格式、普通用户压缩或转换老式录像,无需安装软件。视频在浏览器本地处理,不经过任何服务器,文件不上传。
短视频创作者需要将剪辑完成的 4K 素材上传到抖音/B站/YouTube,各平台对格式和编码要求不同(抖音推荐 MP4/H.264,B站支持 MOV/ProRes 但限制大小)。本工具一键将原始 MOV 或 AVI 转为平台指定的 MP4 参数,避免因格式不符被二次压缩导致画质损失,同时保持原始帧率和分辨率。
家庭用户下载了 MKV 格式的高清电影,但电视或旧款机顶盒只支持 MP4 或 AVI。本工具将 MKV 转为 MP4(H.264 编码),同时保留多音轨和字幕轨道,确保在客厅电视、卧室投影仪甚至车载播放器上都能直接播放,无需折腾第三方播放器。
手机相册堆积了大量微信接收的 MOV 和 FLV 视频,单个文件动辄几百 MB,占满 128GB 空间。本工具批量将 MOV/FLV 转为 WebM(VP9 编码)或压缩版 MP4,体积缩小 50%-70%,画质肉眼几乎无差别,释放存储空间的同时保留视频内容。
游戏主播用 OBS 录制了 4K/60fps 的 FLV 直播回放,但剪辑软件(如 Premiere Pro)对 FLV 支持不佳,需要先转码。本工具将 FLV 转为 MOV(ProRes 编码)或 MP4(DNxHD),保留原始帧率和色彩深度,避免剪辑时卡顿或掉帧,提升后期效率。
企业内部培训部门收集了不同来源的教学视频:供应商提供的 AVI 演示、录屏软件的 WebM 操作指南、手机拍摄的 MOV 素材。本工具将所有格式统一转为 MP4(H.264 + AAC),确保在内部 LMS 系统、钉钉/企业微信上都能流畅播放,避免因格式不兼容导致员工观看失败。
| 维度 | 本工具 | 竞品 A(HandBrake) | 传统方法(本地软件) |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,文件不上传服务器 | 需下载安装,处理在本地 | 需下载安装,处理在本地 |
| 处理速度 | 1 秒内启动,小文件即时完成 | 启动慢,需加载编码器,数秒至分钟 | 启动慢,需加载编码器,数秒至分钟 |
| 离线可用 | 需联网加载 WASM 引擎,完成后可离线 | 完全离线运行 | 完全离线运行 |
| 大小限制 | 受浏览器内存限制,建议 500MB 以内 | 无限制(取决于硬盘) | 无限制(取决于硬盘) |
| 收费 | 免费,无隐藏费用 | 免费开源 | 多数免费,部分高级功能付费 |
| 注册 | 无需注册,打开即用 | 无需注册 | 无需注册 |
| 平台 | 全平台(任何现代浏览器) | Windows / macOS / Linux | Windows / macOS / Linux |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| input.mp4 | output.avi | 典型场景:MP4 转 AVI,兼容老设备 |
| input.mkv | output.mp4 | 常见用法:MKV 转 MP4,适配播放器 |
| input.flv | output.webm | 典型场景:FLV 转 WebM,用于网页嵌入 |
| input.3gp | output.mp4 | 边界 case:3GP 转 MP4,提升画质与兼容性 |
| input.mov | output.mkv | 边界 case:MOV 转 MKV,保留多音轨 |
| input.avi | output.flv | 易错 case:AVI 转 FLV,注意码率设置 |
| input.webm | output.mov | 易错 case:WebM 转 MOV,需确认编码支持 |
把一个 H.265 编码的 .mp4 文件直接拖入工具,选择“转成 .avi”先确认源文件编码格式(可用 mediainfo 查看),再选择目标容器。如果目标容器不支持源编码(如 AVI 不支持 H.265),工具会报编码错误或输出黑屏视频。容器(.mp4/.avi)和编码(H.264/H.265)是两回事。FFmpeg 默认会尝试重新编码,但某些旧容器(如 AVI)不支持新编码,需手动指定编码器(如 -c:v mpeg4)。
输出文件名填写为“我的视频”,未加 .mp4 后缀输出文件名填写为“我的视频.mp4”FFmpeg 通过扩展名推断输出格式。无扩展名时默认输出为 raw 流文件,播放器无法识别,工具也可能报错“无法确定输出格式”。
输入路径为“C:/My Videos/2024 clip.avi”输入路径为“C:/My Videos/2024 clip.avi” 或 “C:\My Videos\2024 clip.avi” (工具内部已做路径处理,但用户自行使用命令行时需加引号)FFmpeg 命令行中空格会被解析为参数分隔符;路径含空格必须用双引号包裹或使用 8.3 短路径。浏览器端工具通常已处理,但若用户自行调用 FFmpeg 则需注意。
输入 .mkv(H.264 编码),输出选 .gif,未指定编码器输出选 .gif 时,应同时指定编码器为 -c:v gif,或先转成高质量 MP4 再转 GIFGIF 只支持 256 色索引色,直接转会丢失大量颜色信息。FFmpeg 默认用 libx264 编码器输出 .gif 会报错“Encoder not found”,需显式指定 -c:v gif 并接受低质量。
输入 .mp4(含 AAC 音频),输出 .webm,未指定音频编码器输出 .webm 时,应指定音频编码器 -c:a libopus(推荐)或 -c:a libvorbis,或加 -c copy 保持原音频流WebM 容器只支持 Vorbis 和 Opus 音频编码。若源音频是 AAC,FFmpeg 默认会尝试复制但失败,导致输出文件无音轨。需显式指定音频编码器或重新编码。
源文件是 640x480 @ 30fps,输出设置 1920x1080 @ 60fps输出尺寸和帧率应不超过源文件实际内容的分辨率和帧率(或使用缩放滤镜 -vf scale=1920:1080 但会模糊)FFmpeg 不会自动插值补帧或超分辨率。强行放大只会得到模糊/马赛克画面,且帧率翻倍会生成重复帧,文件体积暴增但画质无提升。
H.264 编码时设置 -crf 51(最高压缩/最差画质)H.264 编码时 -crf 18-28 是合理范围(18 视觉无损,28 可接受压缩);H.265 对应 -crf 24-34CRF 值范围 0-51(H.264),值越大画质越差。51 会产生严重块状噪声和色块,几乎不可用。用户常误以为“压缩率高=好”,实际是画质崩坏。
输入文件为“video.mp4”,输出文件名也设为“video.mp4”输出文件名使用不同名称,如“video_converted.mp4”FFmpeg 默认会覆盖同名文件。若输入输出路径相同,工具会在读取完成前开始写入,导致源文件被截断损坏。浏览器端工具通常有保护机制,但本地 FFmpeg 需注意。
公式推导 · 流程图解 · 依据出处
B = f(F, C, R, P)
B — 输出视频比特率(kbps)F — 输出视频帧率(fps)C — 色彩深度与色度采样因子R — 输出视频分辨率(像素总数)P — 压缩编码预设(如 H.264/H.265)将 1080p 30fps 的 MP4 转为 720p 24fps 的 WebM。源文件 1920×1080@30fps,目标 1280×720@24fps,采用 VP9 编码(中等质量预设)。FFmpeg 命令行:-c:v libvpx-vp9 -b:v 1500k -crf 30。输出文件大小约为 1500kbps × 120 秒 / 8 ≈ 22.5 MB。
适用于 FFmpeg 后端编码流程,比特率由编码器根据分辨率、帧率、预设自动计算。不适用于无损压缩或恒定质量(CRF)模式,此时比特率不固定。基于 FFmpeg 官方文档 libavcodec 编码器行为。
3 种主流语言 · 复制即用
import subprocess
import os
# 使用 FFmpeg 将 AVI 转换为 MP4
input_file = "input.avi"
output_file = "output.mp4"
# 确保输入文件存在
if not os.path.exists(input_file):
print(f"错误:输入文件 {input_file} 不存在")
exit(1)
# 执行转换命令
try:
result = subprocess.run(
["ffmpeg", "-i", input_file, "-c:v", "libx264", "-c:a", "aac", output_file],
capture_output=True,
text=True,
check=True
)
print(f"转换成功:{output_file}")
except subprocess.CalledProcessError as e:
print(f"转换失败:{e.stderr}")
# 示例输出:
# 转换成功:output.mp4package main
import (
"fmt"
"os"
"os/exec"
)
func main() {
inputFile := "input.mkv"
outputFile := "output.mp4"
// 检查输入文件是否存在
if _, err := os.Stat(inputFile); os.IsNotExist(err) {
fmt.Printf("错误:输入文件 %s 不存在\n", inputFile)
return
}
// 构建 FFmpeg 命令:MKV 转 MP4,保留视频和音频流
cmd := exec.Command("ffmpeg", "-i", inputFile, "-c", "copy", outputFile)
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
fmt.Printf("转换失败:%v\n", err)
return
}
fmt.Printf("转换成功:%s\n", outputFile)
}
// 示例输出:
// 转换成功:output.mp4const { execSync } = require('child_process');
const fs = require('fs');
const inputFile = 'input.flv';
const outputFile = 'output.mp4';
// 检查输入文件是否存在
if (!fs.existsSync(inputFile)) {
console.error(`错误:输入文件 ${inputFile} 不存在`);
process.exit(1);
}
try {
// 使用 FFmpeg 转换 FLV 到 MP4
execSync(`ffmpeg -i "${inputFile}" -c:v libx264 -c:a aac "${outputFile}"`, {
stdio: 'inherit'
});
console.log(`转换成功:${outputFile}`);
} catch (error) {
console.error(`转换失败:${error.message}`);
}
// 示例输出:
// 转换成功:output.mp49 个高频疑问