【问题标题】:record output sound in python在python中录制输出声音
【发布时间】:2011-01-04 00:53:09
【问题描述】:

我想用 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 行,在
数据 = stream.read(块)
文件“/Library/Python/2.5/site-packages/pyaudio.py”,第 562 行,已读
paCanNotReadFromAnOutputOnlyStream)
IOError: [Errno 不是输入流] -9975

有没有办法实例化 PyAudio 流,以便它从计算机的输出输入,而我不必将耳机插孔连接到麦克风?有没有更好的方法来解决这个问题?我宁愿坚持使用 python 应用程序并避免使用可可。

【问题讨论】:

  • 你的笔记本电脑里已经有声音了? “另存为...”有什么问题,它是 Macintosh。
  • 有没有一种简单的方法可以在浏览器中保存在 Flash 播放器中播放的文件(我猜它们是 .flv 文件)?我知道很多时候像 youtube 和 vimeo 这样的网站都有下载 .flv 文件的链接,但很多时候他们没有这样做的链接。

标签: python macos audio audio-streaming


【解决方案1】:

不幸的是,没有万无一失的方法,但Audio HijackWiretap 是最好的工具。

【讨论】:

  • 他们是否有 API 或其他以编程方式完成工作的方式?
【解决方案2】:

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

您还可以查看PyJack,这是Jack 的音频客户端。

【讨论】:

  • Soundflower 已失效或提供的链接已失效。而且不是程序化的答案。 Pyjack 是非标准的。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    以编程方式执行此操作会很棘手。基本上,不可能拦截“输出”前面的音频流量。因此,您需要做的是创建自己的虚拟音频设备,并让您想要捕捉的任何应用程序在该设备上播放。

    其他人也提到的不同第三方应用程序似乎在 MacOS 上提供了此类功能。我可以添加Loopback,但我对这两种工具都没有经验。

    以编程方式,您必须完全模仿类似的东西。

    【讨论】:

      【解决方案5】:

      pycorder 上查看此脚本。它在python中记录输出声音。我会考虑修改其中一个函数以使用带有 sounddevice 模块的输出流来记录输出。您可以查看 sounddevice here 的文档。该脚本有效,您可以根据需要实现它,但用输出流替换记录系统可能会使代码不那么混乱,效率更高。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多