实时录制音频并画图,可以暂停也可以继续
时间: 2024-02-02 17:37:50 浏览: 26
这个问题需要分成两个部分来解答,一是如何实时录制音频,二是如何同时画图,并且可以暂停和继续。
1. 实时录制音频
在Python中,我们可以使用pyaudio库来录制音频。下面是一个简单的录音例子:
```python
import pyaudio
import wave
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("* recording")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("* done recording")
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
```
在上面的例子中,我们使用pyaudio库打开一个音频输入流,并且在每个CHUNK大小的数据块中读取音频数据。我们将所有块收集到一个列表中,并且在录制完成后写入到WAVE文件中。
2. 画图并且可以暂停和继续
对于画图部分,我们可以使用matplotlib库。为了能够在运行时暂停和继续,我们可以使用一个while循环,不断检查用户是否按下了暂停按钮,如果按下了,就等待,如果没有按下,就继续画图。
下面是一个简单的例子:
```python
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x = np.arange(0, 2*np.pi, 0.01)
line, = ax.plot(x, np.sin(x))
def onClick(event):
global pause
pause ^= True
pause = False
fig.canvas.mpl_connect('button_press_event', onClick)
while True:
if not pause:
line.set_ydata(np.sin(x))
fig.canvas.draw()
fig.canvas.flush_events()
```
在上面的例子中,我们创建了一个简单的sin函数曲线,并且在每次循环中更新它的位置。我们还定义了一个onClick函数,这个函数将在用户点击画布时被调用,并且将pause标志设置为True,表示暂停画图。
最后,我们只需要将这两个例子结合起来即可。在录制每个音频块时,我们可以计算音频的频谱,并且画出来。在每个块的结束时,我们可以将画布清空,并且等待下一个块的到来。
```python
import pyaudio
import wave
import numpy as np
import matplotlib.pyplot as plt
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 10
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("* recording")
fig, ax = plt.subplots()
line, = ax.plot([], [])
def onClick(event):
global pause
pause ^= True
pause = False
fig.canvas.mpl_connect('button_press_event', onClick)
frames = []
while True:
if not pause:
data = stream.read(CHUNK)
frames.append(data)
y = np.fromstring(data, dtype=np.int16)
fft_data = np.abs(np.fft.fft(y))[:CHUNK // 2]
line.set_xdata(np.arange(len(fft_data)))
line.set_ydata(fft_data)
ax.relim()
ax.autoscale_view()
fig.canvas.draw()
fig.canvas.flush_events()
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open("output.wav", 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
```
在上面的例子中,我们创建了一个新的画布,并且在每个块中画出音频块的频谱。当用户点击画布时,我们将暂停标志设置为True。最后,我们将所有块写入到WAVE文件中。