Запись с микрофона Java

1

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

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

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

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

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

Теги:
input
random
noise
microphone

1 ответ

0

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

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

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

  • 0
    Я использую 1.0.23 jcommon и 1.0.19 jfreechart. Дело в том, что вы не получите никаких изменений, даже если вы говорите с микрофоном, я попытаюсь применить масштабирование, но я не думаю, что это решение.
  • 0
    Хорошо, с 1.0.19 это компилируется как дано. Теперь и график меняется, если я говорю в микрофон. Но это не больше, чем ~ -140 до ~ 140. Как бы громко я ни говорил. (Моя жена уже спрашивала, что я делаю здесь :-) Ммм ... У меня нет никакой дальнейшей идеи.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню