python - 试图退出线程以停止 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
解决方案
self.frames 数据被初始化为一个空列表,并且您的记录函数将数据附加到 self.frames,无论它是否为空。如果你在 startrecording 函数中将 self.frames 重置为一个空列表,你应该会得到你期望的结果。
推荐阅读
- reactjs - 使用 React Router 更新状态
- webpack - 如何使用可读的包构建 Nextjs?
- react-native - 如何使用 expo build:web 禁用生成源地图
- c# - 使用编码字符串发布请求
- reactjs - 如何使用 React Native 键入包含图标的按钮?
- reactjs - 尽管在 header 中设置了有效的 JWT,但来自 axios 的 Post Request 总是返回 Unauthorized / Axios Deletes Headers
- javascript - 使用自托管 cors -anywhere 网站获取数据时出现 403 错误
- react-native - ScrollableTabView 初始页不起作用
- maple - 是否可以从 Maple 的程序内部进行绘图?
- iframe - 如何使弹出 iframe 中的链接加载到基本 URL 而不是 iframe 中?