Java实时音频FFT

Java实时音频FFT,java,arrays,audio,byte,buffer,Java,Arrays,Audio,Byte,Buffer,我的目标是从一个实时源接收两个声道的音频,执行一些FFT分析并显示数据的实时图形 到目前为止,我已经研究并达到了一个地步,我可以从我的音频接口创建一个targetdataline,使用指定音频格式的两个音频通道。我已经为这个字节流创建了一个缓冲区,但是我想独立地处理每个音频通道。我是否需要在流写入缓冲区时分割流,并拥有两个缓冲区?或者我需要将缓冲区拆分为不同的数组来处理吗 final AudioFormat format = getFormat(); DataLine

我的目标是从一个实时源接收两个声道的音频,执行一些FFT分析并显示数据的实时图形

到目前为止,我已经研究并达到了一个地步,我可以从我的音频接口创建一个targetdataline,使用指定音频格式的两个音频通道。我已经为这个字节流创建了一个缓冲区,但是我想独立地处理每个音频通道。我是否需要在流写入缓冲区时分割流,并拥有两个缓冲区?或者我需要将缓冲区拆分为不同的数组来处理吗

    final AudioFormat format = getFormat();


        DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);

        TargetDataLine line = (TargetDataLine) m.getLine(info);

        line.open(format);
        line.start();
        System.out.println("Line Started");
        Thread captureThread = new Thread(){

            int bufferSize = (int) (format.getSampleRate() * format.getFrameRate() * format.getChannels());
            byte buffer[] = new byte[bufferSize / 5];

                out = new ByteArrayOutputStream();

                while(running) {
                int numBytesRead = line.read(buffer, 0, buffer.length);
                while (numBytesRead > 0) {
                    arraytoProcess = buffer;

                    Thread fftThread;
                    fftThread = new Thread(){
                        public void fftrun() {
                            try {

                                fftCalc();
                            } catch (ParseException ex) {
                                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        };
                    };
                     while (numBytesRead == buffer.length){
                         fftThread.start();
                     }
                }

我相信我已经犯了很大的错误,不过任何指点都会有所帮助。当我试着运行这个程序的时候,我意识到完成“fftThread”所花费的时间比每次通过缓冲区所花费的时间要长,所以我得到了一个非法的线程状态异常(但是它当前得到的是所有字节(立体声通道)传递到此线程。我尝试过好的旧搜索引擎,但是对于如何处理访问TargetDataStream的多个通道,事情还不是很清楚。

我会忽略立体声,直到您使用单个通道为止……此外,我会简化,忽略任何流媒体方面,并使用独立音频缓冲区进行FFT然后让你的可视化工作…只有在你的输入信号保证的情况下,才能恢复立体声。两个通道通常具有非常相似的频谱,因此将多个通道折叠为一个应该是好的…最后将你的独立工作代码插入流媒体上下文谢谢你的回答。最终结果不是测量立体声源,而是测量麦克风输入&来自音频接口的参考输入,以计算双fft。除非我有误解,否则我相信来自音频接口的两个通道从我的接口沿一条TargetDataLine向下传输,所以我需要将它们分开。我同意尝试现在只做一个,以便于ge但是,由于某种原因,我有一个“getFormats()”方法来尝试TargetDataLine中所有可用的不同格式,并返回兼容的格式,因为没有可用的mono行