在pyaudio/wave中录制和播放字节列表
我想用pyaudio和wave库来录音和播放我的声音,但我不知道该怎么做,因为wave库需要一个文件路径。即使我试着把它设置成一个包含几秒钟前录音的字节列表的变量,还是不行,因为我不能对列表使用'read'。有没有人有什么想法?我想做一个像KORG那样的循环播放器。
我希望在停止录音后立即播放,就像真正的循环播放器一样,而不需要把录音保存为文件。
这是我的代码(Python 3.4):
def record(self): #recording a voice
#var for bytes from recording
self.stream = self.player.open(format = self.FORMAT,
channels = self.CHANNELS,
rate = self.RATE,
input = True,
frames_per_buffer = self.CHUNK)
print("Recording")
self.frames = [] #byte list
#recoring for a few seconds (5sec at this moment)
for i in range(0, int(self.RATE / self.CHUNK * self.RECORD_SECONDS)):
self.data = self.stream.read(self.CHUNK) #sing stream do data var
self.frames.append(self.data) #add bytes to the end of a list
print("Stop recording")
self.stopRecording()
def stopRecording(self):
self.stream.stop_stream()
self.stream.close()
print("Recording has been stopped")
self.play()
def play(self): #playing a record
print("Playing")
f = wave.open(self.frames,"rb")
#read data
data = f.readframes(CHUNK)
#play stream
while data != '':
self.stream.write(data)
data = f.readframes(CHUNK)
self.stopPlaying()
1 个回答
1
在你停止录制之后,需要把你收集到的数据合并起来,可以用 data = ''.join(self.frames)
这行代码。最后,你需要建立一个循环(可以是 for 循环或 while 循环),来逐个发送你的字节列表。下面是我怎么做的:
import pyaudio
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 41000
RECORD_SECONDS = 5
p = pyaudio.PyAudio()
stream = p.open(format = FORMAT,
channels = CHANNELS,
rate = RATE,
input = True,
output = True,
frames_per_buffer = chunk)
print ("***Recording***")
all = []
for i in range(0, RATE / chunk * RECORD_SECONDS):
data = stream.read(chunk)
all.append(data)
print("***Stop recording***")
print ("***START PLAY***")
data = ''.join(all)
for i in range(0, len(data), chunk):
stream.write(data[i:i+chunk])