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

python 将 aac 转为 mp3,保持原有目录结构

需要提前安装 FFmpeg


import os
import subprocess
import time
from concurrent.futures import ThreadPoolExecutor, as_completeddef convert_file(input_path, output_path):command = ['ffmpeg','-y',  # 自动覆盖现有文件'-i', input_path,'-acodec', 'libmp3lame','-b:a', '192k',output_path]try:subprocess.run(command, check=True, stderr=subprocess.PIPE, timeout=300)  # 5分钟超时return f"Converted: {output_path}"except subprocess.CalledProcessError as e:return f"Error converting {input_path}: {e.stderr.decode()}"except subprocess.TimeoutExpired:return f"Timeout converting {input_path}"def convert_aac_to_mp3(input_dir, output_dir):start_time = time.time()total_files = 0processed_files = 0converted_files = 0with ThreadPoolExecutor(max_workers=os.cpu_count()) as executor:futures = []for root, _, files in os.walk(input_dir):for filename in files:if filename.lower().endswith('.aac'):total_files += 1input_path = os.path.join(root, filename)rel_path = os.path.relpath(root, input_dir)output_filename = os.path.splitext(filename)[0] + '.mp3'output_path = os.path.join(output_dir, rel_path, output_filename)os.makedirs(os.path.dirname(output_path), exist_ok=True)futures.append(executor.submit(convert_file, input_path, output_path))for future in as_completed(futures):result = future.result()print(result)processed_files += 1if "Converted" in result:converted_files += 1print(f"Progress: {processed_files}/{total_files} files processed")end_time = time.time()print(f"\nConversion completed.")print(f"Total files: {total_files}")print(f"Converted files: {converted_files}")print(f"Failed conversions: {total_files - converted_files}")print(f"Total time: {end_time - start_time:.2f} seconds")

使用脚本

input_dir = input("请输入包含 AAC 文件的目录路径: ")
output_dir = input("请输入 MP3 文件的输出目录路径: ")
convert_aac_to_mp3(input_dir, output_dir)

相关文章:

  • Spring 全家桶使用教程 —— 后端开发从入门到精通
  • 江协科技STM32学习- P19 TIM编码器接口
  • 深入理解函数【JavaScript】
  • WPF项目中使用Caliburn.Micro框架实现日志和主题切换
  • ubuntu20.04系统安装zookeeper简单教程
  • 【PostgreSQL】PostgreSQL数据库允许其他IP连接到数据库(Windows Linux)
  • MATLAB案例 | Copula的密度函数和分布函数图
  • vue echarts tooltip动态绑定模板,并且处理vue事件绑定
  • 将ai模型部署在服务器,会比本地离线更快吗
  • Proteus-7.8sp2安装
  • 论文阅读 | 一种基于潜在向量优化的可证明安全的图像隐写方法(TMM 2023)
  • Apache Cordova和PhoneGap
  • Redis支持数据类型,它们各自的应用场景是
  • 基于深度学习的文本情感原因提取研究综述——论文阅读
  • Spring Boot 2.x基础教程:实现文件上传
  • 【Linux系统编程】快速查找errno错误码信息
  • 10个最佳ES6特性 ES7与ES8的特性
  • 78. Subsets
  • CSS 三角实现
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Effective Java 笔记(一)
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript新鲜事·第5期
  • jquery ajax学习笔记
  • js算法-归并排序(merge_sort)
  • JWT究竟是什么呢?
  • leetcode388. Longest Absolute File Path
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • npx命令介绍
  • vue-cli3搭建项目
  • 从伪并行的 Python 多线程说起
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何学习JavaEE,项目又该如何做?
  • 入口文件开始,分析Vue源码实现
  • 跳前端坑前,先看看这个!!
  • 怎样选择前端框架
  • 主流的CSS水平和垂直居中技术大全
  • ###项目技术发展史
  • (12)Hive调优——count distinct去重优化
  • (LeetCode 49)Anagrams
  • (笔记自用)LeetCode:快乐数
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)计算机毕业设计高校学生选课系统
  • (过滤器)Filter和(监听器)listener
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (四)JPA - JQPL 实现增删改查
  • (学习总结)STM32CubeMX HAL库 学习笔记撰写心得
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .axf 转化 .bin文件 的方法
  • .NET C# 使用 iText 生成PDF