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