首页 > 解决方案 > 试图退出线程以停止 Python 中的录制

问题描述

我正在尝试使用 python 构建一个录音机。代码是:

import threading
import pyaudio
import wave
class App():
    chunk = 1024 
    sample_format = pyaudio.paInt16 
    channels = 2
    fs = 44100  

    frames = []  


    def startrecording(self):
        self.p = pyaudio.PyAudio()
        self.isrecording = True
    
        print('Recording')
        t = threading.Thread(target=self.record)
        t.start()

    def stoprecording(self):
        self.isrecording = False
        print('recording complete')
        self.filename = (r'File_path')
        self.filename = self.filename+".wav"
        wf = wave.open(self.filename, 'wb')
        wf.setnchannels(self.channels)
        wf.setsampwidth(self.p.get_sample_size(self.sample_format))
        wf.setframerate(self.fs)
        wf.writeframes(b''.join(self.frames))
        wf.close()

    def record(self):
   
        while self.isrecording:
            data = self.stream.read(self.chunk)
            self.frames.append(data)



    

我面临的问题是当我调用 startrecording 函数开始录制时。当我调用 stoprecording 函数时,录制停止并且 .wav 文件保存到定义的路径。但是当我调用 startrecording 函数和 stoprecording 函数时,我会得到一个 .wav 文件,其中也包含来自先前保存的文件的录音。简而言之,threding 不会停止,每次我停止录制功能时,它都会给我一个包含从我开始录制的初始时间到我有停止录制功能的最近时间的录制的文件。

For ex.
File 1 =10s
File 2 =12s
But I am getting File2 = 10+12=22s

标签: pythonmultithreadingpyaudio

解决方案


self.frames 数据被初始化为一个空列表,并且您的记录函数将数据附加到 self.frames,无论它是否为空。如果你在 startrecording 函数中将 self.frames 重置为一个空列表,你应该会得到你期望的结果。


推荐阅读