python音频播放器过滤无抖动

时间:2014-09-23 20:48:53

标签: python audio

对于我需要的项目

  • 阅读WAV文件
  • 过滤
  • 播放WAV文件

以下代码是"工作"除了声音爆裂,这是因为我无法保证音频输出的继续数据流。过滤需要一些时间,而且声音会在很短的时间内冻结。

将来我想对原始音频数据做一些额外的计算。我想知道哪种方法最能保持声音平滑。

import pyaudio  
import wave  
from scipy import signal
from struct import *

chunk = 1024

f = wave.open("sample.wav","rb")  
p = pyaudio.PyAudio()

stream = p.open(format = p.get_format_from_width(f.getsampwidth()),  
            channels = f.getnchannels(),  
            rate = f.getframerate(),  
            output = True)  

data = f.readframes(chunk)
b, a = signal.butter(2, 0.01)

tmp = len(data)/2
s = '<'
for i in range(0,tmp):
    s = s + 'h'

while data != '':
    sig = signal.filtfilt(b, a, unpack(s,data))

    output_signal = pack(s,*sig)
    stream.write(output_signal) 
    data = f.readframes(chunk)

stream.stop_stream()  
stream.close()  
p.terminate()   

提前致谢!

1 个答案:

答案 0 :(得分:0)

您可以尝试在两个程序中拆分数据的生产者和使用者(这是pyaudio),并使用常规的Unix管道连接它们。 Unix管道起缓冲作用。例如:

在producer.py中:

while data != '':
    sig = signal.filtfilt(b, a, unpack(s,data))
    output_signal = pack(s,*sig)
    sys.stdout.write(output_signal)      # <===
    data = f.readframes(chunk)
在consumer.py中

while 1:
    data = sys.stdin.read(1024)
    if not data: break
    stream.write(data)

命令行调用:

python producer.py | python consumer.py

如果有效,那么您也可以使用python consumer.py从其他程序中运行os.popen()