使用PyAudio录制扬声器输出

问题描述 投票:6回答:4

我正在尝试使用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()

有人可以帮帮我吗?

python pyaudio
4个回答
8
投票

如果有人像我一样磕磕绊绊,我发现了一个PyAudio fork来记录windows上的输出。 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
投票

您无法像输入一样从输出流中进行记录。要进行录制,您需要将PyAudio连接到输入设备,如麦克风。至少这是做事的正常方式。

首先尝试连接麦克风,看看是否有任何问题。如果这样做,那么尝试做一些不寻常的事情。

作为迭代的一个小的加速,而不是记录和查看文件,通常更容易打印几个块的最大值,以确保您引入数据。通常只是观看数字滚动并将它们与声音进行比较,可以快速估计事物是否正确连接。

import audioop
mx = audioop.max(data, 2)
print mx

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']

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中为此环回设备设置默认值(回退):

Pavu control example

然后你可以启动脚本,等待5秒,你应该有一个output.wav。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.