python - pyAudio 上的 stop_stream 功能不起作用,有什么建议吗?
问题描述
我是使用 pyAudio 库的初学者。我有一个类为我的项目处理非阻塞记录。我已经在 init 函数中为流声明了一个变量,数据类型为无。简而言之,我也制作了两个函数 start_recording 和 stop_recording 来处理流变量。start_recording 运行良好,但 stop_recording 函数发现错误并说:
“AttributeError:‘NoneType’对象没有属性‘stop_stream’”。
我知道问题是由我在 init 函数的 self._stream 变量中给出的 None 数据类型引起的,但我不知道如何解决该错误,任何人都可以帮助我吗?谢谢 :)
ps这是我的课
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 的按钮单击事件中,现在我不知道如何在我的烧瓶中的 url 停止上抛出 Recorder 对象,这是我的路由烧瓶中的 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
作为全局变量引用,则复制对象并且对 _stream 的引用丢失导致
AttributeError:“NoneType”对象没有属性“stop_stream”
rfile = Recorder(channels=2)
在调用之间松开并在函数外部声明def start_recording():
(如全局变量 programiz.com/python-programming/...),def stop_recording():
您将知道您正在处理相同的对象实例Recorder
推荐阅读
- c# - .dtbcache 文件有什么作用?
- c++ - 如何在 C++ 中增加数组值?
- python - Pandas:将列标题转换为行标签
- zlib - 如何使用 zlib 计算 CRC32-C 校验和
- node.js - 解析多部分/相关响应并将附件保存到文件
- eclipse - 如何更改 Eclipse Neon.3 中的 Google App Engine SDK 位置?
- wordpress - 全宽菜单 Wordpress
- vagrant - Vagrant up 失败并显示警告:远程连接断开。重试
- javascript - 如何在 tabNavigator 中重新加载屏幕?
- javascript - Wordpress Envira Gallery 不会以禁止状态加载