Ошибка записи Java soundApi

Я пытаюсь записать моноканальный файл .wav 16 кГц, используя этот код

import java.io.File;
import java.io.IOException;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.TargetDataLine;

public class Main {

    public static void main(String[] args) {
        System.out.println("Say what you see..");

        try {
            AudioFormat format = new AudioFormat(
                    AudioFormat.Encoding.PCM_SIGNED, 16000, 8, 1, 4, 16000,
                    false);

            DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
            if (!AudioSystem.isLineSupported(info))
                System.out.println("Line not Supported");
            final TargetDataLine targetLine = (TargetDataLine) AudioSystem
                    .getLine(info);
            targetLine.open();

            System.out.println("Recording");
            targetLine.start();

            Thread thread = new Thread() {

                @Override
                public void run() {
                    AudioInputStream audioStream = new AudioInputStream(
                            targetLine);
                    File audioFile = new File("record.wav");
                    try {
                        AudioSystem.write(audioStream,
                                AudioFileFormat.Type.WAVE, audioFile);
                    } catch (IOException ioe) {
                        ioe.printStackTrace();
                    }
                    System.out.println("stopped recording");
                }

            };
            thread.start();
            Thread.sleep(5000);
            targetLine.stop();
            targetLine.close();
            System.out.println("Done");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Когда я запускаю его, я всегда получаю эту ошибку:

Line not Supported
java.lang.IllegalArgumentException: No line matching interface TargetDataLine supporting format PCM_SIGNED 16000.0 Hz, 8 bit, mono, 4 bytes/frame,  is supported.at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:476)at Main.main(Main.java:29)

PS: я тестировал его много раз с разными параметрами для AudioFormat. Он работал только тогда, когда я пробовал эти параметры, то есть стерео и 44,1 кГц.

AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100,16,2,4,44100,false); 

person Beeee    schedule 28.02.2016    source источник


Ответы (1)


Вы должны указать AudioFormat, который соответствует одному из форматов, поддерживаемых TargetDataLine.

Например, микрофон на моем Mac поддерживает:

Поддерживаемые форматы аудио

«неизвестная частота дискретизации» означает, что частота дискретизации не имеет значения.

Основное отличие, которое я вижу здесь, заключается в том, что вы указываете 4 байта на кадр, для 8-битного моно это должен быть 1 байт на кадр.

person greg-449    schedule 01.03.2016
comment
@QA_Col См. мой ответ здесь - person greg-449; 06.12.2019