在Python中录制音频

11 投票
1 回答
14672 浏览
提问于 2025-04-15 17:54

我想用Python编程来录制从我的笔记本电脑输出的声音。我找到了PyAudio,并写了一个程序来完成这个任务:

import pyaudio, wave, sys

chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = sys.argv[1]

p = pyaudio.PyAudio()
channel_map = (0, 1)

stream_info = pyaudio.PaMacCoreStreamInfo(
    flags = pyaudio.PaMacCoreStreamInfo.paMacCorePlayNice,
    channel_map = channel_map)

stream = p.open(format = FORMAT,
                rate = RATE,
                input = True,
                input_host_api_specific_stream_info = stream_info,
                channels = CHANNELS)

all = []
for i in range(0, RATE / chunk * RECORD_SECONDS):
        data = stream.read(chunk)
        all.append(data)
stream.close()
p.terminate()

data = ''.join(all)
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(data)
wf.close()

问题是我必须把耳机插孔连接到麦克风插孔。我尝试把这些代码行:

input = True,
input_host_api_specific_stream_info = stream_info,

换成这些:

output = True,
output_host_api_specific_stream_info = stream_info,

但是我得到了这个错误:

追踪(最近的调用最后):
文件 "./test.py",第25行,
data = stream.read(chunk)
文件 "/Library/Python/2.5/site-packages/pyaudio.py",第562行,
paCanNotReadFromAnOutputOnlyStream)
IOError: [错误号 不可输入流] -9975

有没有办法让PyAudio的流从电脑的输出输入,而不需要把耳机插孔连接到麦克风?有没有更好的方法?我更希望使用Python应用程序,而不是用Cocoa。

1 个回答

0

想要通过程序来实现这个功能会有点棘手。简单来说,你无法直接拦截输出设备前面的音频流。所以,你需要做的是创建一个自己的虚拟音频设备,然后让你想要捕捉音频的应用程序把声音播放到这个设备上。

还有一些其他人提到的第三方应用程序,在MacOS上似乎也能提供这样的功能。我可以提到一下 Loopback,不过我对这些工具没有使用经验。

从编程的角度来看,你需要模仿这样的功能。

撰写回答