如何使用Python遍历目录识别媒体文件并批量转换为MP3
Python批量转换媒体文件为MP3格式实现方案
先安装依赖库,终端执行命令:pip install moviepy
注:moviepy会自动下载适配的ffmpeg二进制依赖,如果运行时提示ffmpeg相关错误,手动安装ffmpeg并添加到系统环境变量即可。
原代码核心问题
- 后缀判断逻辑错误:
os.listdir()返回的是完整文件名,直接和.mpeg这类后缀字符串比对永远无法命中 - 输出文件名未做处理:直接用原文件名写音频会覆盖原文件,也无法保证输出为MP3格式
- 缺少异常处理:遇到损坏文件、无音频流的文件会直接中断整个批量任务
- 未做格式兼容:无法识别大写后缀(比如
.MP4/.MPEG),也没有覆盖常见媒体格式
可直接运行的正确实现
import os from moviepy.editor import VideoFileClip # 定义支持转换的常见媒体格式后缀(包含视频、非MP3音频) SUPPORT_MEDIA_EXT = { '.mp4', '.mpeg', '.mpg', '.avi', '.mov', '.mkv', '.flv', '.wmv', '.webm', '.m4a', '.wav', '.flac', '.aac', '.ogg', '.wma' } if __name__ == '__main__': # 遍历当前脚本所在目录的所有条目 for filename in os.listdir('.'): # 跳过子文件夹,只处理文件 if not os.path.isfile(filename): continue # 拆分文件名和后缀,后缀统一转小写做匹配,兼容大写后缀的文件 name, ext = os.path.splitext(filename) ext = ext.lower() # 跳过非支持格式、本身就是MP3的文件 if ext not in SUPPORT_MEDIA_EXT: continue output_name = f"{name}.mp3" # 跳过已经转换完成的文件,避免重复处理 if os.path.exists(output_name): print(f"[跳过] {filename} 对应的MP3文件已存在") continue try: print(f"[处理中] 正在转换:{filename}") # 加载媒体文件 clip = VideoFileClip(filename) # 校验是否包含音频流 if clip.audio is None: print(f"[跳过] {filename} 不包含音频流") clip.close() continue # 提取音频保存为MP3,加logger=None关闭冗余进度日志,需要看进度可以删掉这个参数 clip.audio.write_audiofile(output_name, logger=None) # 释放文件句柄,避免内存泄漏 clip.close() print(f"[完成] {filename} 转换成功,输出文件:{output_name}") except Exception as e: print(f"[失败] {filename} 转换出错:{str(e)}")
使用说明
- 把脚本放到需要批量转换的媒体文件所在目录直接运行即可
- 转换后的MP3文件和原文件同目录,不会修改、删除原媒体文件
- 代码默认自动跳过已存在的MP3文件、无音频流的文件、损坏文件,不会因为单个文件异常中断整个批量任务
- 如果需要转换指定目录下的文件,把
os.listdir('.')里的.替换成目标目录的绝对路径即可
内容的提问来源于stack exchange,提问作者user19387627
相关产品推荐
相关产品推荐

