2010-01-12 122 views
8

我想以编程方式录制在我的笔记本电脑中使用python播放的声音。我发现PyAudio并用以下程序完成任务上来:在python中录制输出声音

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, 

但后来我得到这个错误:

Traceback (most recent call last):
File "./test.py", line 25, in
data = stream.read(chunk)
File "/Library/Python/2.5/site-packages/pyaudio.py", line 562, in read
paCanNotReadFromAnOutputOnlyStream)
IOError: [Errno Not input stream] -9975

有没有办法来实例化PyAudio流,使其输入从计算机的输出,我不必将耳机插孔连接到麦克风?有没有更好的方法去做这件事?我宁愿粘着W /一个Python应用程序,并避免可可。

+1

声音已经在您的笔记本电脑中? “另存为...”是Macintosh的问题。 – 2010-01-12 12:13:12

+0

有没有简单的方法来保存在你的浏览器中的Flash播放器中播放的文件(我猜他们是.flv文件)?我知道很多次,像youtube和vimeo这样的网站都有链接来下载.flv文件,但很多时候他们没有链接来执行此操作。 – aaronstacy 2010-01-12 15:57:23

回答

5

您可以安装Soundflower,它允许您创建额外的音频设备并在它们之间路由音频。这样,您可以将系统的输出定义到Soundflower设备,并使用PyAudio从它读取音频。

你也可以看看PyJack,这是一个Jack的音频客户端。

0

遗憾的是,世界上没有万无一失的办法做到这一点,但Audio HijackWiretap都可以,最好的工具。

+0

他们是否有编程方式的API或其他方式来完成这项工作? – aaronstacy 2010-01-12 04:24:25

0

我可以通过不使用编程方式给出答案。 面板>声音>录音>>启用立体声混音。 这需要驱动程序支持。 我也发现这使我真实的声音回声。 至少这解决了我的问题。