用python生成一边录音一边显示FFT画布canvas.draw()的多线程程序
时间: 2024-06-11 21:10:08 浏览: 121
vc 同时录音和播放录音的多线程程序
5星 · 资源好评率100%
以下是一个用Python编写的多线程程序,可以一边录音一边显示FFT画布:
```python
import pyaudio
import numpy as np
import matplotlib.pyplot as plt
import threading
import time
# 初始化PyAudio
p = pyaudio.PyAudio()
# 设置参数
CHUNK = 1024 # 每次读取的音频块大小
FORMAT = pyaudio.paInt16 # 音频格式
CHANNELS = 1 # 声道数
RATE = 44100 # 采样率
# 创建一个缓存区用于存储录音数据
frames = []
# 创建一个锁对象,用于控制画布的访问
lock = threading.Lock()
# 创建一个绘图对象
fig, ax = plt.subplots()
# 创建一个FFT画布
canvas = ax.plot(np.zeros(CHUNK))[0]
# 设置画布参数
ax.set_ylim(0, 10000)
ax.set_xlim(0, CHUNK)
# 创建一个函数用于更新画布
def update_canvas():
while True:
# 获取当前的FFT数据
with lock:
data = np.abs(np.fft.rfft(np.fromstring(b''.join(frames), dtype=np.int16)))
# 更新画布
canvas.set_ydata(data)
fig.canvas.draw()
# 等待一段时间
time.sleep(0.1)
# 创建一个录音线程
def record_thread():
# 打开音频输入流
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
while True:
# 读取音频数据
data = stream.read(CHUNK)
# 将数据加入缓存区
with lock:
frames.append(data)
# 创建一个更新画布线程
def canvas_thread():
# 开始更新画布
update_canvas()
# 创建两个线程
record = threading.Thread(target=record_thread)
canvas = threading.Thread(target=canvas_thread)
# 启动线程
record.start()
canvas.start()
# 等待线程结束
record.join()
canvas.join()
# 关闭PyAudio
p.terminate()
```
该程序使用PyAudio库读取麦克风录音数据,并在一个线程中实时更新FFT画布。为了避免同时访问画布导致的竞争问题,使用了一个锁对象来控制画布的访问。同时,为了实现录音和画布更新的并行运行,使用了两个线程。
阅读全文