FLAC to MP3 批量转换 Python
FLAC to MP3 批量转换 Python ,需要FFMPEG支持。
- 从 FFmpeg 官网 下载 Windows 版本
- 解压到任意目录(如
C:\ffmpeg
) - 将
C:\ffmpeg\bin
添加到系统 PATH 环境变量 - 在命令行中运行
ffmpeg -version
验证安装
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
FLAC to MP3 批量转换器
使用ffmpeg将指定目录下的所有FLAC文件转换为高压缩比MP3格式
保持原有目录结构,输出到新目录
"""import os
import sys
import subprocess
import argparse
from pathlib import Path
import shutildef check_ffmpeg():"""检查ffmpeg是否可用"""try:result = subprocess.run(['ffmpeg', '-version'], capture_output=True, text=True, check=True,encoding='utf-8', errors='ignore')print("✓ FFmpeg已检测到")return Trueexcept (subprocess.CalledProcessError, FileNotFoundError):print("✗ 错误: 未找到ffmpeg,请确保ffmpeg已安装并在PATH中")return Falsedef find_flac_files(directory):"""递归查找目录下所有FLAC文件"""flac_files = []for root, dirs, files in os.walk(directory):for file in files:if file.lower().endswith('.flac'):flac_files.append(os.path.join(root, file))return flac_filesdef copy_existing_mp3_files(input_dir, output_dir):"""复制已存在的MP3文件到输出目录"""mp3_files = []for root, dirs, files in os.walk(input_dir):for file in files:if file.lower().endswith('.mp3'):mp3_files.append(os.path.join(root, file))copied_count = 0for mp3_file in mp3_files:# 计算相对路径rel_path = os.path.relpath(mp3_file, input_dir)output_file = output_dir / rel_path# 确保输出目录存在output_file.parent.mkdir(parents=True, exist_ok=True)# 复制文件try:shutil.copy2(mp3_file, output_file)copied_count += 1except Exception as e:print(f" ✗ 复制MP3文件失败: {rel_path} - {e}")return copied_count, len(mp3_files)def convert_flac_to_mp3(input_file, output_file, quality=8):"""使用ffmpeg将FLAC转换为MP3"""# 确保输出目录存在output_dir = os.path.dirname(output_file)os.makedirs(output_dir, exist_ok=True)# ffmpeg命令 - 使用指定的质量级别cmd = ['ffmpeg','-i', input_file, # 输入文件'-codec:a', 'libmp3lame', # 使用LAME MP3编码器'-q:a', str(quality), # 质量级别'-y', # 覆盖输出文件output_file]try:result = subprocess.run(cmd, capture_output=True, text=True, check=True,encoding='utf-8', errors='ignore')return True, ""except subprocess.CalledProcessError as e:return False, e.stderrdef main():parser = argparse.ArgumentParser(description='批量将FLAC文件转换为MP3格式',formatter_class=argparse.RawDescriptionHelpFormatter,epilog="""
使用示例:python flac_to_mp3_converter.py C:/Musicpython flac_to_mp3_converter.py "D:/Audio Files" --quality 6质量级别说明:0-3: 高质量,大文件4-6: 中等质量(推荐)7-9: 高压缩比,小文件 """)parser.add_argument('input_dir', nargs='?',help='包含FLAC文件的输入目录')parser.add_argument('--quality', '-q', type=int, default=8, choices=range(0, 10),help='MP3质量级别 (0-9, 默认: 8)')parser.add_argument('--output-suffix', default='_output',help='输出目录后缀 (默认: _output)')args = parser.parse_args()# 如果没有提供输入目录,则交互式询问if not args.input_dir:print("FLAC to MP3 批量转换器")print("=" * 30)while True:input_path = input("请输入包含FLAC文件的目录路径: ").strip().strip('"')if input_path:args.input_dir = input_pathbreakelse:print("路径不能为空,请重新输入。")# 验证输入目录input_dir = Path(args.input_dir).resolve()if not input_dir.exists():print(f"✗ 错误: 输入目录不存在: {input_dir}")return 1if not input_dir.is_dir():print(f"✗ 错误: 指定路径不是目录: {input_dir}")return 1# 检查ffmpegif not check_ffmpeg():return 1# 设置输出目录output_dir = input_dir.parent / (input_dir.name + args.output_suffix)print(f"输入目录: {input_dir}")print(f"输出目录: {output_dir}")print(f"MP3质量级别: {args.quality}")print("-" * 50)# 查找所有FLAC文件print("正在搜索FLAC文件...")flac_files = find_flac_files(str(input_dir))if not flac_files:print("✗ 未找到FLAC文件")return 0print(f"找到 {len(flac_files)} 个FLAC文件")# 复制已存在的MP3文件print("正在复制现有MP3文件...")copied_mp3, total_mp3 = copy_existing_mp3_files(input_dir, output_dir)if total_mp3 > 0:print(f"✓ 复制了 {copied_mp3}/{total_mp3} 个MP3文件")# 转换文件successful = 0failed = 0for i, flac_file in enumerate(flac_files, 1):# 计算相对路径rel_path = os.path.relpath(flac_file, input_dir)# 修改扩展名为mp3mp3_filename = os.path.splitext(rel_path)[0] + '.mp3'output_file = output_dir / mp3_filename# 检查输出文件是否已存在(可能是MP3文件)if output_file.exists():print(f"[{i}/{len(flac_files)}] 跳过: {rel_path} (输出文件已存在)")successful += 1continueprint(f"[{i}/{len(flac_files)}] 转换: {rel_path}")# 执行转换success, error = convert_flac_to_mp3(flac_file, str(output_file), args.quality)if success:# 显示文件大小对比input_size = os.path.getsize(flac_file)output_size = os.path.getsize(str(output_file))compression_ratio = (1 - output_size / input_size) * 100print(f" ✓ 成功 ({input_size//1024//1024}MB → {output_size//1024//1024}MB, 压缩{compression_ratio:.1f}%)")successful += 1else:print(f" ✗ 失败: {error}")failed += 1print("-" * 50)print(f"转换完成!")print(f"成功: {successful} 个文件")print(f"失败: {failed} 个文件")if successful > 0:# 计算总体压缩比input_total = sum(os.path.getsize(f) for f in flac_files)output_total = sum(os.path.getsize(str(output_dir / (os.path.splitext(os.path.relpath(f, input_dir))[0] + '.mp3'))) for f in flac_files if os.path.exists(str(output_dir / (os.path.splitext(os.path.relpath(f, input_dir))[0] + '.mp3'))))if output_total > 0:total_compression = (1 - output_total / input_total) * 100print(f"总体压缩比: {total_compression:.1f}%")print(f"节省空间: {(input_total - output_total)//1024//1024}MB")return 0 if failed == 0 else 1if __name__ == '__main__':sys.exit(main())
使用方法
1. 命令行使用
基本用法
python flac2mp3.py "C:\Music\FLAC Files"
指定质量级别
python flac2mp3.py "C:\Music\FLAC Files" --quality 6
自定义输出目录后缀
python flac2mp3.py "C:\Music\FLAC Files" --output-suffix "_mp3"
2. 交互式使用
直接运行脚本,程序会提示输入目录路径:
python flac2mp3.py
参数说明
参数 | 简写 | 默认值 | 描述 |
---|---|---|---|
input_dir | - | - | 包含 FLAC 文件的输入目录 |
--quality | -q | 8 | MP3 质量级别 (0-9) |
--output-suffix | - | _output | 输出目录后缀 |
质量级别说明
级别 | 质量 | 文件大小 | 建议使用场景 |
---|---|---|---|
0-3 | 高质量 | 大文件 | 专业音乐制作、收藏级音频 |
4-6 | 中等质量 | 中等大小 | 推荐 - 日常听音乐 |
7-9 | 高压缩比 | 小文件 | 移动设备、存储空间有限 |
使用示例
示例 1: 基本转换
python flac2mp3.py "D:\Music\Classical"
- 输入目录:
D:\Music\Classical
- 输出目录:
D:\Music\Classical_output
- 质量级别: 8(默认)
示例 2: 高质量转换
python flac2mp3.py "D:\Music\Jazz" --quality 4
- 输入目录:
D:\Music\Jazz
- 输出目录:
D:\Music\Jazz_output
- 质量级别: 4(高质量)
示例 3: 自定义输出目录
python flac2mp3.py "D:\Music\Rock" --quality 6 --output-suffix "_mp3_files"
- 输入目录:
D:\Music\Rock
- 输出目录:
D:\Music\Rock_mp3_files
- 质量级别: 6(中等质量)