如何解决每次循环播放 wav 文件时,如何消除烦人的“啪”声?
我正在尝试创建一个简单的可控和非阻塞循环播放器。使用 simpleaudio 创建的以下类有效,但是,在音频的每个循环之间有一个短暂的停顿和明显的爆裂/噼啪声。老实说,我不确定是什么原因造成的,我不确定如何解决它,而不是完全使用不同的音频模块。有什么建议吗?
import simpleaudio as sa
from threading import Thread
class WavPlayer(Thread):
def __init__(self,filepath,loop=False):
self.loop = loop
self.wav_obj = sa.WaveObject.from_wave_file(filepath)
self.play_obj = None
Thread.__init__(self)
def run(self):
self.play_obj = self.wav_obj.play() #initialize play buffer and play once
while self.loop is True:
if not self.play_obj.is_playing():
print("played again")
self.play_obj = self.wav_obj.play()
def terminate(self):
print("music terminated")
self.play_obj.stop()
self.loop = False
self.join()
main_loop = WavPlayer("main_loop.wav",True)
menu_loop = WavPlayer("menu.wav",True)
main_loop.start()
z = input("Enter to end theme looping")
main_loop.loop = False
z = input("Enter to terminate music")
main_loop.terminate()
print("playing next song")
menu_loop.start()
cont = ''
while cont != 'n':
cont = input("continue testing non-blocking? enter n to stop: ")
menu_loop.terminate()
Filedropper link to menu_loop wav file
Filedropper link to main_loop wav file
解决方法
我在编写一个调音器时遇到了同样的问题,该调音器从有限数量的样本中生成无限长的音符(我使用了 pyaudio
,并且调音音符是一个非常简单的声音,这使得爆破声非常明显,但补救要容易得多)。
如果你循环一个波浪对象:
** **
* * *
* * *
* * *
** **
...由于最后一个和第一个样本之间的巨大差异,您会听到砰的一声。删除一些样本直到最后一个和第一个样本匹配将消除流行音乐(simpleaudio
允许您将样本读入 numpy
数组,然后您可以(稍微)截断(稍微)直到第一个和最后一个样本匹配).
在零交叉处切割是这种情况的一个特例,请参阅 this discussion。当然,一些声音库可能已经在零交叉处截断了您的样本。
在麻烦扩展程序以将样本转换为 numpy
数组并截断它们之前,您首先可以尝试使用 Audacity 之类的声音编辑器并手动完成,然后聆听结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。