首页 > 解决方案 > 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()

标签: pythonflaskaudio-recordingpyaudio

解决方案


在你的情况下rfile应该是一个全局变量。

如果您不rfile作为全局变量引用,则复制对象并且对 _stream 的引用丢失导致

AttributeError:“NoneType”对象没有属性“stop_stream”

rfile = Recorder(channels=2)在调用之间松开并在函数外部声明def start_recording():(如全局变量 programiz.com/python-programming/...),def stop_recording():您将知道您正在处理相同的对象实例Recorder


推荐阅读