如何让 Processing 接收来自计算机的音频输入?

Posted

技术标签:

【中文标题】如何让 Processing 接收来自计算机的音频输入?【英文标题】:How do I get Processing to recieve input from the audio from my computer? 【发布时间】:2015-08-18 19:40:36 【问题描述】:

我很难在网上找到解决方案。基本上,我正在尝试为我在计算机上播放的音乐创建自己的音频可视化器,并希望 Processing 分析来自 iTunes 的音频(或来自我的计算机的音频输出),这样我就可以在编码时卡住。

我已经查看了 Processing 提供的 Sound Library,这是一种将声音文件加载到草图中并播放它以及从计算机上的麦克风接收输入的简便方法,但我明白了此库无法接收来自 iTunes(或任何其他媒体播放器)的输入。该文档没有太大帮助。如果我可以截取计算机的音频输出,而不是将歌曲加载到我的草图中并且必须一遍又一遍地分析同一首歌曲,那么构建我的可视化器会容易得多......

有什么建议吗?

p.s 是的,我知道 iTunes 有一个内置的可视化工具。我想自己做。

【问题讨论】:

您需要打开并收听系统音频端口。看看Audiosystem class tutorial。您可以从中嗅探音频并对其进行实时处理以构建您的可视化器。 仅供参考,您不想将应用程序编程为收听来自特定程序的音频,而是将其编程为直接从音频总线读取声音——这样任何东西 i> 将捕获当前从任何地方播放的内容。最难的部分是确定当前的混音器和输出设备,然后编写一个后台线程,将这些数据传送到您的可视化进程。 【参考方案1】:

如果您使用的是更新版本的 Processing,请查看 FFT example:

import processing.sound.*;
FFT fft;
AudioIn in;
int bands = 512;
float[] spectrum = new float[bands];

void setup() 
  size(512, 360);
  background(255);
    
  // Create an Input stream which is routed into the Amplitude analyzer
  fft = new FFT(this);
  in = new AudioIn(this, 0);
  
  // start the Audio Input
  in.start();
  
  // patch the AudioIn
  fft.input(in);
      

void draw()  
  background(255);
  fft.analyze(spectrum);

  for(int i = 0; i < bands; i++)
  // The result of the FFT is normalized
  // draw the line for frequency band i scaling it up by 5 to get more amplitude.
  line( i, height, i, height - spectrum[i]*height*5 );
   

处理 2 和更早版本随 Minim library 一起提供。 查看绘制频谱部分。 此外,对于进一步处理,您可能需要查看this post。

在路由作为输入播放的音频时,您可以查看SoundFlower 或JACK。两者都应该允许您将系统音频作为输入路由。

另外,既然您提到了 iTunes,这里是 iTunes Visualiser 的创建者 Robert Hodgin 的 Audio-driven landscape(还有许多其他很棒的东西)。

【讨论】:

此代码示例有一些错误。请检查 FFT 示例链接以查看正确的代码示例。 谢谢@MrPablo!我没有注意到 input() 方法的签名发生了变化,它不再访问波段数。我已经更新了 sn-p。

以上是关于如何让 Processing 接收来自计算机的音频输入?的主要内容,如果未能解决你的问题,请参考以下文章

如何快速播放来自http数据流的音频

来自 Ruby Web 应用程序的实时音频录制/播放

[Audio processing] FFMPEG转音频格式和采样率

[Audio processing] wav音频文件合并

音频:如何设置默认麦克风的电平?

AVCaptureSession + AVAudioEngine + AVPlayer=来自接收器和扬声器而不是扬声器的低音频