Функция stop_stream на pyAudio не работает, есть предложения? - PullRequest
1 голос
/ 26 октября 2019

Я новичок в использовании библиотеки pyAudio. У меня есть класс, который обрабатывает неблокирующую запись для моего проекта. Я объявил переменную для потока в функции инициализации с типом данных None. Короче говоря, я сделал 2 функции, start_recording и stop_recording, для обработки потоковой переменной тоже. start_recording работает хорошо, но функция stop_recording обнаружила ошибку и сказала:

«AttributeError: объект« NoneType »не имеет атрибута« stop_stream »».

Я знаю, что проблема вызвана типом данных None, который я дал в переменной self._stream функции init, но я не знаю, как исправить эту ошибку, кто-нибудь может мне помочь? Спасибо:)

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, и теперь я понятия не имею, как бросить объект Recorder на остановку URL в моей фляге, вот мой код 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()

1 Ответ

0 голосов
/ 26 октября 2019

В вашем случае rfile должна быть глобальной переменной.

Если вы не ссылаетесь на rfile как на глобальную переменную, объект копируется, и ссылка на _stream теряется, вызывая

AttributeError: у объекта 'NoneType' нет атрибута 'stop_stream

Освободить и объявить rfile = Recorder(channels=2) вне вашей функции (как глобальная переменная programiz.com/python-programming/…)Таким образом, между вызовами def start_recording(): и def stop_recording(): вы будете знать, что работаете над одним и тем же экземпляром объекта Recorder

...