视频音轨更换
替换视频原音轨为新音频(BGM / 配音)
替换/多音轨合并
替换视频原音轨为新音频(BGM / 配音)
视频处理涉及复杂的解码 / 编码 / 滤镜操作,桌面 FFmpeg(开源 / 免费)是业界事实标准。安装 5 分钟,运行如下命令一次解决:
用 Homebrew,5 秒安装
Debian/Ubuntu/Fedora
无需本地安装
按上方系统对应的命令安装。验证:ffmpeg -version 应输出版本号。
将 input.mp4 改为你的实际视频文件路径。
用终端 (Terminal / cmd / PowerShell) 切到视频所在目录,粘贴命令并回车。
短视频几秒,长视频几分钟。输出文件出现在同目录。
了解工具定位 · 使用场景 · 对比优势
旅游博主将中文 Vlog 替换为英文旁白,同时保留环境背景音。原视频只有一个中文音轨,用本工具上传新录制的英文音轨,选择「替换原音轨」模式,一键输出新视频。省去重新剪辑时间轴、对齐音画的手动操作。
在线教育机构制作了一节编程课视频,讲师讲中文,但海外学员需要英文讲解。用本工具将英文旁白作为第二音轨合并到原视频中,输出 MP4 文件。学员在播放器里可自由切换「中文」「英文」或同时播放。
企业录制了一场线上研讨会,但主讲人声音嘈杂、有回音。用本工具将主讲人用专业麦克风重录的音频文件替换掉视频中的原音轨,保留幻灯片画面和观众提问片段。无需重新录制整个视频。
影视剪辑爱好者在做「台词串烧」混剪时,原视频的 BGM 和台词混杂。用本工具将混剪视频的原音轨替换为单独提取的台词音轨(无 BGM),再在剪辑软件中叠加新的 BGM。避免因提取音轨导致的画质二次压缩。
创作者拍摄了一段口播视频,但原背景音乐版权受限。用本工具将视频的原音轨替换为免版权 BGM,同时保留人声部分。输出后直接上传平台,无需在剪辑软件里重新对齐人声和画面。
| 维度 | 本工具 | 竞品 A(Kapwing) | 传统方法(Premiere Pro) |
|---|---|---|---|
| 处理速度 | 秒级(WASM 本地处理) | 分钟级(上传+云端转码) | 小时级(导入+手动对齐) |
| 数据隐私 | 纯浏览器处理,文件不上传服务器 | 需上传文件到云端服务器 | 文件存储在本地硬盘 |
| 离线可用 | 支持(浏览器内 WASM 处理) | 不支持(必须联网) | 支持(需安装专业软件) |
| 文件大小限制 | 受浏览器内存限制(约 2GB) | 免费版上限 250MB | 仅受硬盘空间限制 |
| 操作复杂度 | 拖拽文件,一键替换 | 需选择轨道、调整时间轴 | 需创建序列、拖拽轨道、手动对齐 |
| 收费模式 | 免费 | 免费版有水印,Pro 版 $16/月 | 订阅制 $22.99/月 |
| 平台依赖 | 浏览器(Chrome/Edge/Firefox) | 浏览器(需登录) | 仅 Windows/macOS 桌面端 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 输入视频文件(含原音轨),上传新音轨文件(MP3格式),点击“替换音轨” | 输出视频文件,原音轨被新音轨替换,视频画面不变 | 典型场景:给视频配上自制配音或背景音乐 |
| 输入视频文件(含原音轨),上传新音轨文件(AAC格式),点击“合并音轨” | 输出视频文件,包含原音轨和新音轨两个可选音轨 | 典型场景:保留原声同时添加解说或外语配音 |
| 输入视频文件(无音轨),上传新音轨文件(WAV格式),点击“替换音轨” | 输出视频文件,新音轨被添加为唯一音轨 | 边界 case:处理无声视频(如纯动画或延时摄影) |
| 输入视频文件(含原音轨),上传新音轨文件(大小超过2GB),点击“替换音轨” | 提示“文件过大,请压缩后上传”或直接处理失败 | 边界 case:浏览器端处理受内存限制,大文件需压缩 |
| 输入视频文件(含原音轨),上传新音轨文件(采样率48kHz),点击“合并音轨” | 输出视频文件,两个音轨采样率自动统一为48kHz | 易错 case:不同采样率的音轨会被自动重采样 |
| 输入视频文件(含原音轨),上传新音轨文件(时长30秒),视频时长60秒,点击“替换音轨” | 输出视频文件,新音轨循环播放至视频结束 | 易错 case:音轨短于视频时自动循环,可能导致节奏错位 |
上传一个 MOV 文件,输出格式选 MP4,直接点击替换上传 MOV 文件后,输出格式保持为 MOV,或先转码为 MP4 再替换音轨不同容器格式(MOV/MP4/MKV)对音视频编码器支持不同,直接换容器可能造成播放器不识别或音画不同步。
上传一段 2 分钟的视频和一段 30 秒的音频,直接替换主音轨先裁剪或循环音频使其时长匹配视频时长,或使用多音轨合并模式保留原音轨作为备用替换音轨时默认以视频时长为准,音频短则末尾静音,音频长则被截断;合并模式可保留多轨,播放器可手动切换。
上传 44100Hz 立体声的音频替换 48000Hz 5.1 声道的视频音轨先用工具将音频重采样为 48000Hz、立体声或 5.1 声道再替换FFmpeg 在替换时默认不会自动重采样,不匹配的音频流会导致部分播放器(如电视、机顶盒)无法解码或无声。
拖入一个 .srt 或 .ass 字幕文件到音轨替换区域确认文件格式为 .mp3 / .aac / .wav / .flac 等常见音频格式字幕文件是文本,工具后端用 FFmpeg 处理时无法识别为音频流,会直接报错或生成无声视频。
替换一个 10MB 的视频,输出变成 200MB 或 500KB检查音频码率设置:若原视频音轨是 128kbps,新音轨是 320kbps,文件会增大;若新音轨是 32kbps,文件会减小视频文件大小主要由视频码率决定,音轨码率影响较小;但极端差异(如 32kbps vs 320kbps)会导致文件体积变化明显,属于正常现象。
上传一个 .m4p 文件作为新音轨先使用合法工具(如 iTunes 自身)将 DRM 移除或转换为无保护的 .m4a / .mp3FFmpeg 无法解码受 FairPlay 等 DRM 加密的音频流,工具会直接报错,且该操作可能违反版权协议。
合并了中英双音轨,但在网页上只听到中文,以为英文轨丢失使用支持多音轨切换的播放器(如 VLC、PotPlayer、IINA)打开文件,手动切换音轨浏览器原生 <video> 标签通常只播放默认音轨(轨道 0),多音轨文件需要播放器 UI 支持切换,并非工具合并失败。
上传一个 H.265(HEVC)编码的视频,输出格式选 MP4输出格式选 MKV,或先将视频转码为 H.264 再替换音轨MP4 容器对 H.265 支持不完善,部分播放器解码时会出现绿屏;MKV 容器对 H.265 兼容性更好。
公式推导 · 流程图解 · 依据出处
A = B × (1 - α) + C × α
A — 输出音轨(混合后音频流)B — 原始视频音轨(被替换的基础)C — 新导入音轨(替换或叠加的源)α — 混合权重(0~1,0 全保留原音,1 全替换)视频原音轨 B 为背景音乐(-20dB),新音轨 C 为人声旁白(-10dB)。设 α=0.7,则输出 A = B×0.3 + C×0.7。若 B 采样值 0.2,C 采样值 0.5,则 A = 0.2×0.3 + 0.5×0.7 = 0.06 + 0.35 = 0.41(归一化幅度)。最终输出音轨以 0.41 幅度混合,人声更突出。
适用于线性 PCM 音频流(WAV/AIFF)的简单替换或叠加。不适用于压缩编码格式(MP3/AAC)的直接混合,需先解码。基于数字音频混合基本原理(采样点加权求和),无特定论文来源。
3 种主流语言 · 复制即用
import subprocess
import os
# 替换视频音轨:将 new_audio.mp3 替换 video.mp4 的原有音轨
input_video = "video.mp4"
input_audio = "new_audio.mp3"
output_file = "output.mp4"
# 使用 FFmpeg:-map 0:v 保留视频流,-map 1:a 使用新音频,-c copy 不重新编码视频
cmd = [
"ffmpeg",
"-i", input_video,
"-i", input_audio,
"-map", "0:v:0",
"-map", "1:a:0",
"-c:v", "copy",
"-shortest",
output_file
]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
print(f"错误: {result.stderr}")
else:
print(f"成功生成 {output_file}")
# 多音轨合并:将两个音频文件合并为双音轨视频
input_video2 = "video.mp4"
input_audio1 = "track1.mp3"
input_audio2 = "track2.mp3"
output_multi = "multi_track.mp4"
cmd2 = [
"ffmpeg",
"-i", input_video2,
"-i", input_audio1,
"-i", input_audio2,
"-map", "0:v:0",
"-map", "1:a:0",
"-map", "2:a:0",
"-c:v", "copy",
"-c:a", "aac",
"-shortest",
output_multi
]
subprocess.run(cmd2, check=True)
print(f"成功生成多音轨文件 {output_multi}")package main
import (
"fmt"
"os/exec"
"strings"
)
func replaceAudioTrack(videoPath, audioPath, outputPath string) error {
// 替换视频音轨:保留视频流,替换为新的音频流
cmd := exec.Command("ffmpeg",
"-i", videoPath,
"-i", audioPath,
"-map", "0:v:0",
"-map", "1:a:0",
"-c:v", "copy",
"-shortest",
outputPath,
)
output, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("FFmpeg 失败: %v, 输出: %s", err, string(output))
}
return nil
}
func mergeAudioTracks(videoPath, audio1Path, audio2Path, outputPath string) error {
// 多音轨合并:保留视频流,添加两个独立音频流
cmd := exec.Command("ffmpeg",
"-i", videoPath,
"-i", audio1Path,
"-i", audio2Path,
"-map", "0:v:0",
"-map", "1:a:0",
"-map", "2:a:0",
"-c:v", "copy",
"-c:a", "aac",
"-shortest",
outputPath,
)
output, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("FFmpeg 失败: %v, 输出: %s", err, string(output))
}
return nil
}
func main() {
// 替换音轨示例
if err := replaceAudioTrack("video.mp4", "new_audio.mp3", "output.mp4"); err != nil {
fmt.Println("替换音轨失败:", err)
return
}
fmt.Println("音轨替换成功")
// 多音轨合并示例
if err := mergeAudioTracks("video.mp4", "track1.mp3", "track2.mp3", "multi_track.mp4"); err != nil {
fmt.Println("多音轨合并失败:", err)
return
}
fmt.Println("多音轨合并成功")
}
const { execSync } = require('child_process');
const path = require('path');
function replaceAudioTrack(videoPath, audioPath, outputPath) {
// 替换视频音轨:保留视频流,替换为新音频
const cmd = [
'ffmpeg',
'-i', videoPath,
'-i', audioPath,
'-map', '0:v:0',
'-map', '1:a:0',
'-c:v', 'copy',
'-shortest',
outputPath
];
try {
execSync(cmd.join(' '), { stdio: 'pipe' });
console.log(`成功生成 ${outputPath}`);
} catch (error) {
console.error('替换音轨失败:', error.stderr.toString());
}
}
function mergeAudioTracks(videoPath, audio1Path, audio2Path, outputPath) {
// 多音轨合并:保留视频流,添加两个独立音频流
const cmd = [
'ffmpeg',
'-i', videoPath,
'-i', audio1Path,
'-i', audio2Path,
'-map', '0:v:0',
'-map', '1:a:0',
'-map', '2:a:0',
'-c:v', 'copy',
'-c:a', 'aac',
'-shortest',
outputPath
];
try {
execSync(cmd.join(' '), { stdio: 'pipe' });
console.log(`成功生成多音轨文件 ${outputPath}`);
} catch (error) {
console.error('多音轨合并失败:', error.stderr.toString());
}
}
// 使用示例
replaceAudioTrack('video.mp4', 'new_audio.mp3', 'output.mp4');
mergeAudioTracks('video.mp4', 'track1.mp3', 'track2.mp3', 'multi_track.mp4');8 个高频疑问