2014-09-28 2 views
1

У меня есть немного странный вопрос. Проект является распознаванием звуковой волны, у меня есть нейронные сети вверх и вниз, и, как оказалось, вещь, которую я уделял наименьшему вниманию, оказалась болью в заднице.Запись микрофона Java

Это приложение для Java, которое теперь нужно захватить звук с помощью компьютерного микрофона, и я слежу за документацией о звукозаписывающих устройствах, и вот мой код очень прост, потому что более сложный оказался бюстом!

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-битными форматами, это не так, я тоже пробовал это.

Итак, вопрос в том, что этот код регистрируется, потому что это не звук, а документация оракула специально говорит, что это способ получить ручку микрофона.

И каков правильный способ сделать это, очевидно? Любая помощь будет оценена по достоинству.

P.S. Я нахожусь на лету над этим проектом im C# разработчиком, поэтому будьте нежны! :)

ответ

0

Какая версия jfreechart Вы используете? С 1.0.0 мне пришлось добавить несколько аргументов в createXYLineChart(...).

Если я запустил ваш код, я вижу, что ваш масштаб оси Y настраивается динамически. От ~ -8 до ~ 8, если микрофон не подключен (со случайными всплесками). От ~ -125 до ~ 125, если есть один (с синусоидальной кривой). Разве нет шума на каждой линии? Может быть, он выглядит менее впечатляюще, если вы примените подходящую фиксированную шкалу к своей оси Y.

Меня удивляет то, что график не меняется, если я действительно говорю в микрофон.

+0

Я использую 1.0.23 jcommon и 1.0.19 jfreechart. Дело в том, что вы не получаете никаких изменений, даже если разговариваете с микрофоном, я попытаюсь применить масштабирование, но я не думаю, что это решение. – Vladimir

+0

ОК, с 1.0.19 он компилируется как заданный. Теперь также меняется график, если я говорю в микрофон. Но это не превышает ~ -140 до ~ 140. Как бы я ни говорил. (Моя жена уже спрашивала, что я здесь делаю :-) Мм ... У меня нет дальнейших идей. –

+0

Спасибо. За это усилие даже высокочастотные свистки, которые имеют высокую энергию по частоте спектра, похоже, не имеют никакого эффекта. – Vladimir