У меня есть немного странный вопрос. Проект - это распознавание звуковых волн, у меня есть нейронные сети и работает, и, как выясняется, я уделял меньше всего внимания, как боль в заднице.
Это приложение для 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 С# разработчик, поэтому будьте нежны! :)
Какую версию jfreechart вы используете? С 1.0.0 мне пришлось добавить несколько аргументов для createXYLineChart(...)
.
Если я запустил ваш код, я вижу, что ваш масштаб оси Y динамически изменяется. От ~ -8 до ~ 8, если микрофон не подключен (со случайными всплесками). От ~ -125 до ~ 125, если есть один (с синусоидальной кривой). Разве нет шума на каждой линии? Может быть, он выглядит менее впечатляюще, если вы примените подходящую фиксированную шкалу к своей оси Y.
Меня удивляет, что график не меняется, если я действительно говорю в микрофон.