我试图用PyAudio记录计算机扬声器的输出。我试图修改PyAudio文档中给出的代码示例,但它不起作用。这是我的代码:
import pyaudio
import wave
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"
p = pyaudio.PyAudio()
SPEAKERS = p.get_default_output_device_info()["hostApi"] #The part I have modified
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK,
input_host_api_specific_stream_info=SPEAKERS) #The part I have modified
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()
有人能帮帮我吗?
答案 0 :(得分:8)
如果有人像我一样磕磕绊绊,我找到了一个PyAudio fork来记录窗口上的输出。 https://github.com/intxcc/pyaudio_portaudio
说明:
官方PyAudio构建无法记录输出。但是在Windows Vista及更高版本中,引入了一个新的API WASAPI,其中包括以环回模式打开输出设备的流。在此模式下,流的行为类似于输入流,能够记录输出音频流。
要设置模式,必须设置一个特殊标志(AUDCLNT_STREAMFLAGS_LOOPBACK,https://msdn.microsoft.com/de-de/library/windows/desktop/dd316551(v=vs.85).aspx)。由于官方版本不支持此标志,因此需要编辑PortAudio和PyAudio,以添加环回支持。
新选项:“as_loopback”:( true | false)
答案 1 :(得分:1)
您无法像输入一样从输出流中进行录制。要录制,您需要将PyAudio连接到输入设备,就像麦克风一样。至少这是做事的正常方式。
首先尝试连接麦克风,看看是否有任何问题。如果这样做,那么尝试做一些不寻常的事情。
作为迭代的一个小加速,而不是记录和查看文件,只需打印几个块的最大值以确保您引入数据通常更容易。通常只是观看数字滚动并将它们与声音进行比较,可快速估计事物是否正确连接。
import audioop
mx = audioop.max(data, 2)
print mx
答案 2 :(得分:1)
如果在Windows平台上创建应用程序,则可以使用默认的 立体声混音器 虚拟设备来记录PC的输出。
2),通过以下方式将PyAudio连接到您的立体声混音器:
p = pyaudio.PyAudio()
stream = p.open(format = FORMAT,
channels = CHANNELS,
rate = RATE,
input = True,
input_device_index = dev_index,
frames_per_buffer = CHUNK)
其中 dev_index 是立体声混音器的索引。
3)要获取所需的索引,您可以列出设备:
for i in range(p.get_device_count()):
print p.get_device_info_by_index(i)
此外,您可以添加下一个代码以按设备名称自动获取索引:
for i in range(p.get_device_count()):
dev = p.get_device_info_by_index(i)
if (dev['name'] == 'Stereo Mix (Realtek(R) Audio)' and dev['hostApi'] == 0):
dev_index = dev['index'];
print('dev_index', dev_index)
4)继续与pyAudio一起使用,就像通过麦克风录音一样
data = stream.read(CHUNK)
答案 3 :(得分:0)
即使您将其作为输入打开,扬声器也是输出流。扬声器的hostApi值可能为0。 您可以检查每个连接设备的“ maxInputChannels”和“ maxOutputChannels”,扬声器的maxInputChannels应为0。 您无法写入输入流,也无法从输出流读取。
您可以使用以下代码检测可用设备:
import pyaudio
# detect devices:
p = pyaudio.PyAudio()
host_info = p.get_host_api_info_by_index(0)
device_count = host_info.get('deviceCount')
devices = []
# iterate between devices:
for i in range(0, device_count):
device = p.get_device_info_by_host_api_device_index(0, i)
devices.append(device['name'])
print devices
获得所有连接的设备后,您可以检查每个设备的“ hostApi”。 例如,如果说话者索引为5而不是:
p.get_device_info_by_host_api_device_index(0, 5)['hostApi']
答案 4 :(得分:0)
我必须用pyaudio记录我的扬声器输出,并使用pyaudio的documentation中的一些配置和代码。
代码
"""PyAudio example: Record a few seconds of audio and save to a WAVE file."""
import pyaudio
import wave
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
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()
配置
首先,在运行pulseaudio的情况下,创建回送设备:
pacmd load-module module-loopback latency_msec=5
然后在pavucontrol中将此环回设备设置默认值(后备):
然后您可以启动脚本,等待5秒钟,然后应该有一个output.wav。