一、下载和配置 ffmpeg 所需环境
1. 下载 ffmpeg
对于 Windows,最推荐的来源是 gyan.dev
打开浏览器,访问 https://www.gyan.dev/ffmpeg/builds/
选择并下载文件:
您会看到多个版本。请在 “release builds” 部分找到名为 ffmpeg-release-full.7z 的文件并点击下载。这个 “full” 版本包含了所有常用的库和功能。
2. 解压文件:
下载的是一个 .7z 压缩包,您可能需要安装 7-Zip 或 Bandizip 等免费解压软件来打开它。
将压缩包解压到一个永久、简单的位置。例如,直接解压到 C: 盘根目录,并将其重命名为 ffmpeg。
最终,您的 ffmpeg.exe 文件应该位于类似 C:\ffmpeg\bin\ffmpeg.exe 的路径下。
3. 配置环境变量 (最关键的一步):
为了能在任何位置使用 ffmpeg 命令,您需要将它所在的 bin 文件夹路径添加到系统环境变量中。
按下键盘上的 Win 键,直接输入 “环境变量”,然后选择 “编辑系统环境变量”。
在弹出的 “系统属性” 窗口中,点击右下角的 “环境变量...” 按钮。
在下方的 “系统变量” 区域里,找到并双击名为 Path 的变量。
在弹出的 “编辑环境变量” 窗口中,点击右上角的 “新建”。
将您刚才解压的 bin 文件夹的完整路径(例如 C:\ffmpeg\bin)粘贴进去。
一路点击 “确定” 保存所有窗口。
4. 验证安装:
重新打开一个新的命令提示符(CMD)或 PowerShell 窗口(注意:必须是新的,旧的窗口不会加载新的环境变量)。
输入以下命令并按回车:
ffmpeg -version |
如果您看到一大段关于 ffmpeg 版本和库的信息输出,而不是 “不是内部或外部命令”,那么恭喜您,安装成功!
二、使用 Powershell 执行脚本(脚本如下,记得修改用户配置区域)
# ===================================================================
# --- 用户配置区域 ---
# ===================================================================
# 1. 【请修改这里】指定您存放 m4a 文件的【源文件夹】路径
$sourceFolder = "请在这里粘贴您的源文件夹路径"
# 2. 【请修改这里】指定您希望存放 MP3 文件的【输出文件夹】路径
$outputFolder = "请在这里粘贴您的输出文件夹路径"
# 3. 【可选修改】在这里设置你想同时运行的线程数 (推荐设置为您的 CPU 核心数)
$maxJobs = 4
# ===================================================================
# --- 脚本主体 (以下部分无需修改) ---
# ===================================================================
# 检查源文件夹是否存在
if (-not (Test-Path -Path $sourceFolder -PathType Container)) {
Write-Host "错误:指定的源文件夹不存在,请检查路径: $sourceFolder" -ForegroundColor Red
Read-Host "按回车键退出"
exit
}
# 检查输出文件夹是否存在,如果不存在则创建它
if (-not (Test-Path -Path $outputFolder -PathType Container)) {
Write-Host "指定的输出文件夹不存在,将自动创建: $outputFolder" -ForegroundColor Yellow
try {
New-Item -ItemType Directory -Path $outputFolder -ErrorAction Stop | Out-Null
} catch {
Write-Host "错误:无法创建输出文件夹,请检查路径或权限。" -ForegroundColor Red
Read-Host "按回车键退出"
exit
}
}
# 获取所有 m4a 文件
$files = Get-ChildItem -Path $sourceFolder -Filter *.m4a
# 检查是否有 m4a 文件需要转换
if ($files.Count -eq 0) {
Write-Host "在指定的源文件夹中没有找到任何 .m4a 文件。" -ForegroundColor Yellow
Read-Host "按回车键退出"
exit
}
Write-Host "找到 $($files.Count) 个 .m4a 文件,准备开始转换..."
# 循环处理文件
foreach ($file in $files) {
# 构造输出文件名
$outputName = Join-Path -Path $outputFolder -ChildPath ($file.BaseName + ".mp3")
# 如果同名的 mp3 文件已经存在,则跳过
if (Test-Path -Path $outputName) {
Write-Host "跳过已存在的文件: $($file.Name)" -ForegroundColor Cyan
continue
}
# 等待直到当前运行的任务数小于最大值
while (@(Get-Job -State Running).Count -ge $maxJobs) {
Start-Sleep -Seconds 1
}
# 在后台启动一个新的 ffmpeg 转换任务
Write-Host "开始转换: $($file.Name)" -ForegroundColor Green
Start-Job -ScriptBlock {
# 接收传递过来的参数
param($inputFile, $outputFile)
# 执行 ffmpeg 命令,-y 参数可以覆盖不完整的旧文件,-loglevel error 只显示错误信息,让界面更干净
ffmpeg -y -i "$inputFile" -vn -acodec libmp3lame -q:a 2 "$outputFile" -loglevel error
} -ArgumentList $file.FullName, $outputName
}
# 等待所有剩余的任务完成
Write-Host "所有任务已启动,正在后台处理,请稍候..."
while (@(Get-Job).Count -gt 0) {
# 等待任务完成,然后接收并移除,释放内存
Get-Job | Wait-Job | Receive-Job
Get-Job | Remove-Job
}
Write-Host "全部转换完成!转换后的 MP3 文件已保存在 '$outputFolder' 文件夹中。" -ForegroundColor Magenta
Read-Host "按回车键退出"