使用Pydub创建多声道音频报错求助:帧计数不匹配问题
问题:Pydub创建多声道音频报错,帧计数不匹配验证与解决
我用Pydub创建多声道音频文件时出现报错,已知各声道需要长度完全一致且帧计数相同,虽确认声道大小一致,但不知道怎么验证帧计数是否匹配。
我的代码
from pydub import AudioSegment from pydub.playback import play from playsound import playsound left_channel = AudioSegment.from_wav("scripts_OUN\Single Cricket Chirping Effect.wav") right_channel = AudioSegment.from_wav("scripts_OUN\d.wav") left_channel_v2 = left_channel + AudioSegment.silent(duration=152009) left = left_channel_v2.set_channels(1) right = right_channel.set_channels(1) print(len(left_channel_v2)) print(len(right_channel)) print(len(left_channel_v2)==len(right_channel)) print(left_channel.set_frame_rate) mutli_channel = AudioSegment.from_mono_audiosegments(left,right) mutli_channel.export("v3.wav", format="wav")
报错信息
- 输出方法绑定信息:
<bound method AudioSegment.set_frame_rate of <pydub.audio_segment.AudioSegment object at 0x000002ACB8076A40>> - 值错误:尝试将大小为12324755的数组分配给大小为12324781的扩展切片
问题分析与解决
1. 第一个输出问题
print(left_channel.set_frame_rate) 错误调用了方法对象,若要查看音频的帧率,应该访问frame_rate属性,改为:
print(left_channel.frame_rate) print(right_channel.frame_rate)
2. 帧计数不匹配的核心问题
len()返回的是毫秒时长,即使时长一致,若两个音频的帧率不同,实际帧数量(时长(ms) * 帧率 / 1000)会出现差异,且必须是整数,否则会有精度误差。
验证帧计数的方法
使用frame_count()方法直接获取每个声道的帧数量:
print(left.frame_count()) print(right.frame_count()) print(left.frame_count() == right.frame_count())
解决步骤
- 统一两个声道的帧率:将左右声道都设置为相同的帧率(比如44100)
- 精确计算需要补充的静音时长,确保最终帧计数完全一致
修改后的示例代码:
from pydub import AudioSegment # 加载音频 left_channel = AudioSegment.from_wav("scripts_OUN\Single Cricket Chirping Effect.wav") right_channel = AudioSegment.from_wav("scripts_OUN\d.wav") # 统一帧率为44100(可根据实际需求调整) target_frame_rate = 44100 left_channel = left_channel.set_frame_rate(target_frame_rate) right_channel = right_channel.set_frame_rate(target_frame_rate) # 计算需要补充的静音时长,确保帧计数一致 right_frame_count = right_channel.frame_count() left_frame_count = left_channel.frame_count() if left_frame_count < right_frame_count: # 计算需要补充的静音帧数量,转成毫秒 silence_frames = right_frame_count - left_frame_count silence_duration = int(silence_frames * 1000 / target_frame_rate) left_channel_v2 = left_channel + AudioSegment.silent(duration=silence_duration, frame_rate=target_frame_rate) else: left_channel_v2 = left_channel # 转为单声道 left = left_channel_v2.set_channels(1) right = right_channel.set_channels(1) # 验证帧计数 print(left.frame_count()) print(right.frame_count()) print(left.frame_count() == right.frame_count()) # 创建多声道音频并导出 multi_channel = AudioSegment.from_mono_audiosegments(left, right) multi_channel.export("v3.wav", format="wav")
内容的提问来源于stack exchange,提问作者Kerby Elpenord
相关产品推荐
相关产品推荐

