Java麦克风录音

时间:2014-09-28 18:08:03

标签: java random input microphone noise

我有一个奇怪的问题。 该项目是声波识别,我有神经网络启动和运行,事实证明,我最少关注的事情是屁股上的痛苦。

这是一个需要通过计算机麦克风捕获声音的java应用程序,我遵循oracle文档进行声音捕获,现在我的代码非常简单,因为更复杂的一个似乎是一个半身像!

public class Main extends JFrame{
//audio prop.
private static int SampleRate=8000;
private static int BitsPerSample=16;
private static int Channel=1;
private static boolean signed=true;
private static boolean isBigEndian=true;

private static byte[] buffer;
static AudioFormat format;
static DataLine.Info info;
static TargetDataLine line;

private static XYSeries series;
private static XYSeriesCollection xyCollection;
private static JFreeChart chart; 

public void call(ChartPanel panel){     
    add(panel,BorderLayout.CENTER);
}

public static void main(String[] args) throws LineUnavailableException {
    ChartPanel chartPanel;
    format= new AudioFormat(SampleRate, BitsPerSample,Channel , signed, isBigEndian);
    info= new DataLine.Info(TargetDataLine.class, format);
    if(!AudioSystem.isLineSupported(info))
    {
        System.out.print("Line not supported");
    }
    else
    {
        /*
         * chart declarations
         */
        series= new XYSeries("Audio");
        xyCollection=new XYSeriesCollection();
        xyCollection.addSeries(series);
        chart= ChartFactory.createXYLineChart("Microphone Recording", "X","Y",  xyCollection);
        chartPanel=new ChartPanel(chart);
        Main obj= new Main();
        obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        obj.setSize(640,480);
        obj.call(chartPanel);
        obj.setVisible(true);
        line= (TargetDataLine) AudioSystem.getLine(info);
        line.open(format);
        line.start(); 
        buffer= new byte[line.getBufferSize()];
        ByteBuffer bb= ByteBuffer.allocate(2);
        bb.order(ByteOrder.BIG_ENDIAN);
        while(line.read(buffer, 0, buffer.length)>0){
                for(int i=0;i<buffer.length-1;i++){
                    series.add(i,buffer[i]);
                }
        }

    }

}

现在发生了这种情况,即使没有声音,我也会不断输入随机噪音! 如果你试图告诉我那是因为我没有根据每个样本格式的16位组合数据,那不是它,我也试过了。

所以问题是这段代码注册的原因是什么,因为它不合理,oracle文档明确说明这是获取麦克风句柄的方法。

显然这样做的正确方法是什么? 任何帮助将不胜感激。

P.S。我正忙着这个项目im c#developer,所以要温柔! :)

1 个答案:

答案 0 :(得分:0)

您使用的是哪个版本的 jfreechart ?使用1.0.0我必须向createXYLineChart(...)添加一些参数。

如果我运行你的代码,我可以看到你的Y轴刻度动态调整。如果没有连接麦克风,则从〜-8到~8(随机闪烁)。如果有一个(具有正弦曲线),从〜-125到~125。每条线路上都没有噪音吗?如果你将适当的固定比例应用到你的Y轴,它可能看起来不那么令人印象深刻。

让我想知道的是,如果我真的对着麦克风说话,图表就不会改变。