我是使用pyAudio库的初学者。我有一个类处理我的项目的非阻塞录制。我在init函数中为stream声明了一个数据类型为None的变量。简而言之,我做了两个函数,启动\录制和停止\录制,来处理流变量。启动\u录制工作正常,但停止\u录制功能发现错误并说:
AttributeError:'NoneType'对象没有“stop\u stream”属性。你知道吗
我知道这个问题是由于我在self.\u init函数的stream变量中给出的None数据类型引起的,但是我不知道如何修复这个错误,有人能帮我吗?谢谢:)
另外,这是我的课
class Recorder(object):
def __init__(self, channels=1, rate=44100, frames_per_buffer=1024):
self.channels = channels
self.rate = rate
self.frames_per_buffer = frames_per_buffer
self._p = pyaudio.PyAudio()
self.filewave = None
self._stream = None
def start_recording(self, filename, audio_format):
self.filewave = self.prepare_file(filename, audio_format)
self._stream = self._p.open(
format=pyaudio.paInt16,
channels=self.channels,
rate=self.rate,
input=True,
frames_per_buffer=self.frames_per_buffer,
stream_callback=self.get_callback())
self._stream.start_stream()
return self
def get_callback(self):
def callback(data, frame_count, time_info, status):
self.filewave.writeframes(data)
return data, pyaudio.paContinue
return callback
def prepare_file(self, filename, audio_format="wb"):
filewave = wave.open(filename, audio_format)
filewave.setnchannels(self.channels)
filewave.setsampwidth(self._p.get_sample_size(pyaudio.paInt16))
filewave.setframerate(self.rate)
return filewave
def stop_recording(self):
self._stream.stop_stream()
return self
def close_recording(self):
self._stream.close()
self._p.terminate()
self.filewave.close()
还要注意,我的代码是与ajax接口一起使用的。你知道吗
我的新问题是在ajax上的按钮点击事件,现在我不知道如何在我的flask上抛出url stop上的Recorder对象,这是我在我的flask中的url ajax代码,你能给我一个主意吗?谢谢你
@app.route('/start_recording', methods=['POST'])
def start_recording():
rfile = Recorder(channels=2)
rfile.start_recording('output.wav','wb')
@app.route('/stop_recording/<rfile>', methods=['POST'])
def stop_recording(rfile):
rfile.stop_recording()
在您的例子中,
rfile
应该是一个全局变量。你知道吗如果不将
rfile
引用为全局变量,则对象将被复制通过,而对流的引用将丢失松开并在函数外声明
rfile = Recorder(channels=2)
(就像一个全局变量)programiz.com/python公司-编程/…)这样在调用def start_recording():
和def stop_recording():
之间,您将知道您正在处理对象Recorder
的同一个实例相关问题 更多 >
编程相关推荐