pyAudio上的stop_stream函数不起作用,有任何建议吗?

问题描述 投票:1回答:1

我是使用pyAudio库的初学者。我有一个为我的项目处理非阻塞录制的类。我已经在init函数中为流声明了一个变量,其数据类型为None。简而言之,我也做了2个函数start_recording和stop_recording来处理流变量。 start_recording效果很好,但是stop_recording函数捕获了错误并说:

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

我知道问题是由我在init函数的self._stream变量中提供的None数据类型引起的,但是我不知道如何解决该错误,有人可以帮助我吗?谢谢:)

ps.s。这是我上的课

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 stop上扔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()
python flask audio-recording pyaudio
1个回答
0
投票
如果没有将rfile引用为全局变量,则会复制对象,并丢失对_stream的引用,导致

[AttributeError:'NoneType'对象没有属性'stop_stream

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

0
投票
@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()
© www.soinside.com 2019 - 2024. All rights reserved.