stop_stream pyAudio 上的功能不起作用,有什么建议吗?
stop_stream function on pyAudio does not work, any suggestion?
我是使用 pyAudio 库的初学者。我有一个 class 来处理我的项目的非阻塞记录。我在 init 函数中为流声明了一个变量,数据类型为 None。简而言之,我制作了 2 个函数,start_recording 和 stop_recording,来处理流变量。 start_recording 运行良好,但 stop_recording 函数捕获错误并表示:
"AttributeError: 'NoneType' object has no attribute 'stop_stream'"。
我知道问题是由我在 init 函数的 self._stream 变量中提供的 None 数据类型引起的,但我不知道如何解决该错误,任何人都可以帮我?谢谢:)
p.s。这是我的 class 我做的
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 的按钮点击事件中,现在我不知道如何将 Recorder 对象扔到 url 停止在我的烧瓶上,这是我的代码url ajax 在我的 routes flask 中,你能给我一个主意吗?之前谢谢
@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
引用为全局变量,则会复制对象并丢失对 _stream 的引用,从而导致
AttributeError: 'NoneType' object has no attribute 'stop_stream
在调用 def start_recording():
和 def stop_recording():
之间松开并在函数外部声明 rfile = Recorder(channels=2)
(如全局变量 programiz.com/python-programming/...)会知道您正在处理同一个对象实例 Recorder
我是使用 pyAudio 库的初学者。我有一个 class 来处理我的项目的非阻塞记录。我在 init 函数中为流声明了一个变量,数据类型为 None。简而言之,我制作了 2 个函数,start_recording 和 stop_recording,来处理流变量。 start_recording 运行良好,但 stop_recording 函数捕获错误并表示:
"AttributeError: 'NoneType' object has no attribute 'stop_stream'"。
我知道问题是由我在 init 函数的 self._stream 变量中提供的 None 数据类型引起的,但我不知道如何解决该错误,任何人都可以帮我?谢谢:)
p.s。这是我的 class 我做的
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 的按钮点击事件中,现在我不知道如何将 Recorder 对象扔到 url 停止在我的烧瓶上,这是我的代码url ajax 在我的 routes flask 中,你能给我一个主意吗?之前谢谢
@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
引用为全局变量,则会复制对象并丢失对 _stream 的引用,从而导致
AttributeError: 'NoneType' object has no attribute 'stop_stream
在调用 def start_recording():
和 def stop_recording():
之间松开并在函数外部声明 rfile = Recorder(channels=2)
(如全局变量 programiz.com/python-programming/...)会知道您正在处理同一个对象实例 Recorder