Python pyAudio上的停止流功能';不行,有什么建议吗?

Python pyAudio上的停止流功能';不行,有什么建议吗?,python,flask,audio-recording,pyaudio,Python,Flask,Audio Recording,Pyaudio,我是pyAudio库的初学者。我有一个类来处理我的项目的非阻塞记录。我在init函数中为stream声明了一个数据类型为None的变量。简言之,我制作了2个函数,开始录制和停止录制,来处理流变量。开始录制工作正常,但停止录制功能发现错误并表示: “AttributeError:'非类型'对象没有'stop_stream'属性。” 我知道这个问题是由我在self.\u init函数的stream变量中给出的None数据类型引起的,但是我不知道如何修复这个错误,有人能帮我吗?谢谢:) p、 这是我上

我是pyAudio库的初学者。我有一个类来处理我的项目的非阻塞记录。我在init函数中为stream声明了一个数据类型为None的变量。简言之,我制作了2个函数,开始录制和停止录制,来处理流变量。开始录制工作正常,但停止录制功能发现错误并表示:

“AttributeError:'非类型'对象没有'stop_stream'属性。”

我知道这个问题是由我在self.\u init函数的stream变量中给出的None数据类型引起的,但是我不知道如何修复这个错误,有人能帮我吗?谢谢:)

p、 这是我上的课

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()
@app.route('/start\u recording',methods=['POST'])
def start_录制():
rfile=记录器(通道=2)
rfile.start_录制('output.wav'、'wb')
@app.route('/stop_recording/',methods=['POST'])
def停止_记录(rfile):
rfile.stop_录制()

在您的情况下,
rfile
应该是一个全局变量

如果不将
rfile
作为全局变量引用,则对象将被复制通过,对_流的引用将丢失

AttributeError:“非类型”对象没有“停止流”属性


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

您好欢迎来到StackOverflow。别忘了,你的代码应该是一个最小的可复制示例,在Python中缩进非常重要早期的
rfile
确实属于类
Recorder
,否则你会得到“AttributeError:'某物'对象没有属性'停止录制'”,但rfile中的文件显然与
@app.route中的不同('/start_recording',methods=['POST'])def start_recording():
rfilefile是一个全局变量吗?哦,rfile不是全局变量,我不知道如何在flask路线上声明它,很抱歉问我是flask Too的初学者,顺便说一句,我已经将rfile声明为一个全局变量,但是@piloupilicaly它不起作用。我也不知道,我认为这只是一个python问题在调用
def start_recording():
def stop_recording():
之间,在函数外部声明
rfile=Recorder(channels=2)
,这样您就知道正在处理同一个对象记录器实例