使用pydub裁剪音频文件生成空文件,求排查错误原因
问题原因与代码错误分析
1. 时间范围逻辑错误(直接导致空文件)
当输入的结束时间小于等于开始时间时,song[start:end]会生成空的AudioSegment对象,导出后就是空MP3文件。比如输入开始时间10秒、结束时间5秒,转换为毫秒后是10000:5000,这种反向切片在pydub中会返回空片段。
另外,如果输入的开始时间超过音频总时长,切片结果也必然为空。
2. 路径截取错误
代码中path = path[:-5]是硬编码截取路径,.mp3后缀是4个字符,正确的截取应该是path[:-4]。比如原路径是test.mp3,[:-5]会得到te,导出文件名变成ten.mp3;如果原路径是my_audio.mp3,[:-5]会得到my_aud,导出文件名是my_audn.mp3,虽不直接导致空文件,但会导致文件名不符合预期,甚至可能因路径错误导出到意外位置。
3. 缺乏输入有效性验证
代码没有对用户输入做必要检查:
- 未验证输入是否为整数,若输入非数字内容会直接报错。
- 未验证开始/结束时间是否在音频时长范围内,比如开始时间超过音频总长度,切片结果为空。
- 未检查开始时间是否小于结束时间,这是导致空文件最常见的场景。
修复后的示例代码
from pydub import AudioSegment path = input("Enter path of mp3 file: ") song = AudioSegment.from_mp3(path) audio_duration = len(song) // 1000 # 获取音频总时长(秒) # 验证开始时间输入 while True: try: start = int(input(f"At which second shall the new file begin? (0-{audio_duration}): ")) if 0 <= start < audio_duration: break print(f"请输入0到{audio_duration}之间的整数") except ValueError: print("请输入有效的整数") # 验证结束时间输入 while True: try: end = int(input(f"At which second shall the new file end? ({start+1}-{audio_duration}): ")) if start < end <= audio_duration: break print(f"请输入{start+1}到{audio_duration}之间的整数") except ValueError: print("请输入有效的整数") start_ms = start * 1000 end_ms = end * 1000 newmp3 = song[start_ms:end_ms] # 正确处理文件名(兼容含多个点的路径) dot_index = path.rfind('.') if dot_index != -1: new_path = path[:dot_index] + "_cut.mp3" else: new_path = path + "_cut.mp3" newmp3.export(new_path, format="mp3") print(f"New Audio File is created and saved at: {new_path}")
内容的提问来源于stack exchange,提问作者Chras
相关产品推荐
相关产品推荐

