Как я могу напечатать звук в виде байтового массива? или массив int?

Я делаю антифазный звук с помощью Java.(Антифаза - это отраженная волна. X-координата не изменяется, но Y-координата вверх ногами.)

Прежде чем отражать звуковую волну, я должен получить массив байтов (или массив int) из звука.

Я получаю звук с микрофона моего ноутбука.

Вот мой код (я получил оригинальный код, который записывает звук в виде файла, в Интернете. Я немного его изменил)

public class NoiseController extends Thread{
private TargetDataLine line;
private AudioInputStream audioInputStream;

public NoiseController(TargetDataLine line) {
    this.line = line;
    this.audioInputStream = new AudioInputStream(line);
}

public void start() {
    line.start();
    super.start();
}

public void stopRecording() {
    line.stop();
    line.close();
}

public void run() {
    try {
        int packet;
        while((packet = audioInputStream.read()) != -1)
            System.out.println(packet);
    }
    catch(IOException ioe) {
        ioe.getStackTrace();
    }
}

public static void main(String[] args) {
    AudioFormat audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100.0F, 16, 2, 4, 44100.0F, false);
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat);
    TargetDataLine targetDataLine = null;

    try {
        targetDataLine = (TargetDataLine)AudioSystem.getLine(info);
        targetDataLine.open(audioFormat);
    }
    catch(LineUnavailableException lue) {
        out("unable to get a recording line");
        lue.printStackTrace();
        System.exit(-1);
    }

    AudioFileFormat.Type targetType = AudioFileFormat.Type.WAVE;
    NoiseController recorder = new NoiseController(targetDataLine);
    System.out.println(targetDataLine);
    System.out.println(targetType);

    out("Press ENTER to start the recording.");

    try {
        System.in.read();
    }
    catch(IOException ioe) {
        ioe.printStackTrace();
    }

    recorder.start();
    out("Recording...");
    out("Press ENTER to stop the recording.");

    try {
        System.in.read();
        System.in.read();
    }
    catch(IOException ioe) {
        ioe.getStackTrace();
    }

    recorder.stopRecording();
    out("Recording stopped.");
}

private static void out(String msg) {
    System.out.println(msg);
}

}

Тем не менее, консоль ничего не печатает во время записи... Он показывает только

com.sun.media.sound.DirectAudioDevice$DirectTDL@25154f_ WAVE Press ENTER to start the recording. Recording... Press ENTER to stop the recording. Recording stopped.

Если я редактирую run() лайк AudioSystem.write(stream, fileType, out);

вместо

int packet;
        while((packet = audioInputStream.read()) != -1)
            System.out.println(packet);

Программа сохраняет файл WAV.

Что не так в моей программе?

1 ответ

Вы не печатаете Исключение, как сказал Уве Аллнер.

Я также пытаюсь исправить это, и я думаю, что результат должен быть таким:

 public class NoiseController extends Thread {
    private final TargetDataLine        line;
    private final AudioInputStream  audioInputStream;

    public NoiseController(final TargetDataLine line) {
        this.line = line;
        this.audioInputStream = new AudioInputStream(line);
    }

    @Override
    public void start() {
        line.start();
        super.start();
    }

    public void stopRecording() {
        line.stop();
        line.close();
        try {
            audioInputStream.close();
        } catch (final IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try {
            final int bufferSize = 1024;
            int read = 0;
            final byte[] frame = new byte[bufferSize];
            while ((read = audioInputStream.read(frame)) != -1 && line.isOpen()) {
                // only the first read bytes are valid
                System.out.println(Arrays.toString(frame));
            }
        } catch (final IOException ioe) {
            ioe.printStackTrace();
        }
    }

    public static void main(final String[] args) {
        final AudioFormat audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100.0F, 16, 2, 4, 44100.0F, false);
        final DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat);
        TargetDataLine targetDataLine = null;

        try {
            targetDataLine = (TargetDataLine) AudioSystem.getLine(info);
            targetDataLine.open(audioFormat);
        } catch (final LineUnavailableException lue) {
            out("unable to get a recording line");
            lue.printStackTrace();
            System.exit(-1);
        }

        final AudioFileFormat.Type targetType = AudioFileFormat.Type.WAVE;
        final NoiseController recorder = new NoiseController(targetDataLine);
        System.out.println(targetDataLine);
        System.out.println(targetType);

        out("Press ENTER to start the recording.");

        try {
            System.in.read();
        } catch (final IOException ioe) {
            ioe.printStackTrace();
        }

        recorder.start();
        out("Recording...");
        out("Press ENTER to stop the recording.");

        try {
            System.in.read();
            System.in.read();
        } catch (final IOException ioe) {
            ioe.printStackTrace();
        }

        recorder.stopRecording();
        out("Recording stopped.");
    }

    private static void out(final String msg) {
        System.out.println(msg);
    }
 }
Другие вопросы по тегам