当前位置: 首页 > news >正文

FLAC to MP3 批量转换 Python

FLAC to MP3 批量转换 Python ,需要FFMPEG支持。

  1. 从 FFmpeg 官网 下载 Windows 版本
  2. 解压到任意目录(如 C:\ffmpeg
  3. 将 C:\ffmpeg\bin 添加到系统 PATH 环境变量
  4. 在命令行中运行 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-q8MP3 质量级别 (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(中等质量)
http://www.dtcms.com/a/486704.html

相关文章:

  • 开源鸿蒙6.1和8.1版本被确定为LTS建议版本,最新路标正式发布!-转自开源鸿蒙OpenHarmony社区
  • linux sdl图形编程之helloworld.
  • 开发一个网站系统报价电子商务网站建设试卷及答案
  • 瑞芯微算法环境搭建(2)------编译opencv
  • 计算机视觉(opencv)——人脸网格关键点检测
  • 自己做网站投入编程培训机构需要哪些证件
  • AXI总线的基础知识
  • 【泛微OA】泛微OA平台实现计算具体的天数
  • 「深度学习笔记1」深度学习全面解析:从基本概念到未来趋势
  • puppeteer 生成pdf,含动态目录,目录带页码
  • 深度学习的卷积神经网络中医舌诊断病系统-ResNet50与VGG16方法的比较研究
  • 如何查看网站空间wordpress图片多选
  • Android的Activity与intent知识点
  • 一、前置基础(MVC学习前提)_核心特性_【C# MVC 前置】委托与事件:从 “小区通知” 看懂 MVC 过滤器的底层逻辑
  • 网站建设年度汇报详情页设计理念怎么写
  • Spring Boot项目中Maven引入依赖常见报错问题解决
  • Android 13 启动的时候会显示一下logo,很不友好
  • seo网站快速排名外包关键词seo排名优化如何
  • Linux防火墙:核心机制与安全实践全解析
  • SX1261IMLTRT射频收发器Semtech赋能远距离物联网连接的低功耗射频芯片IC
  • Flutter---坐标网格图标
  • 邢台做网站多少钱洪泽网站建设
  • 整体设计 逻辑系统程序 之30 定稿V1 之1 含 4 套程序架构、三式模型与时空约束体系
  • 基于单片机的智能洗衣机的设计与实现(论文+源码)
  • 【ComfyUI】SDXL Revision 文本提示实现参考图像概念迁移生成
  • Zabbix 模板、监控项、图形指南
  • 个人如何做网站软件湛江免费制作网站
  • 嘉兴公司网站模板建站建设厅官方网站
  • 【javaFX基础】javaFX文档学习及基础编程实践
  • [c++语法学习]Day10:c++引用