Java Sound Api: WAV-файл не воспроизводится после сохранения записи на диск - PullRequest
0 голосов
/ 26 октября 2011

Я записываю звук с микрофона и сохраняю его в виде файла .wav на диск.

Я не могу воспроизвести файл wav с помощью Media Player?Это нормально?

AudioFormat format = new AudioFormat(
                AudioFormat.Encoding.PCM_SIGNED,
                44100.0F, 16, 2, 4, 44100.0F, false);
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); // format is an AudioFormat object

    // Obtain and open the line.
    try {
        targetLine = (TargetDataLine) AudioSystem.getLine(info);
        targetLine.open(format);
        targetLine.start();
        ByteArrayOutputStream out  = new ByteArrayOutputStream();
        int numBytesRead;
        byte[] data = new byte[targetLine.getBufferSize() / 5];

        targetLine.start();

        while (recording) {
           numBytesRead =  targetLine.read(data, 0, data.length);
           out.write(data, 0, numBytesRead);
           System.out.println(Arrays.toString(data));
        }     


        File fileOut = new File("C:\\audio\\audio6.wav");
        AudioInputStream ais = new AudioInputStream(targetLine);

        if (AudioSystem. isFileTypeSupported(AudioFileFormat.Type.WAVE,ais)) {
            AudioSystem.write(ais, AudioFileFormat.Type.WAVE, fileOut);
            System.out.println("writen");
        }   
        targetLine.stop();

        ais.close();

Ответы [ 2 ]

0 голосов
/ 11 ноября 2011

Вы загружаете записанные данные в ByteArrayOutputStream, а затем никогда ничего не делаете с ним (как указал Джон Скит).

Когда логическое значение «запись» ложно, ТО вы присоединяете TargetDataLineв AudioInputStream?Но если запись ложна, то я предполагаю, что через TDL нет данных.Данные получают из TDL с помощью метода read (), и они находятся в цикле while.

Я думаю, что возможно создать AIS через ByteArrayInputStream, который может быть сделан из ByteArrayOutputStream, который вы использовали дляСоберите данные из TDL.

Таким образом, после того, как логическое значение записи станет ложным, попробуйте сделать AIS следующим образом:

ByteArrayInputStream bais = new ByteArrayInputStream(out.toByteArray());
AudioInputStream ais = new AudioInputStream(bais, format, baos.size());
0 голосов
/ 26 октября 2011

Вы должны иметь возможность воспроизводить файл в медиаплеере, если он работает правильно.

Я бы порекомендовал получить копию бесплатного аудио-редактора Audacity (http://audacity.sourceforge.net/) и посмотреть данные). Сначала убедитесь, что в файле есть какие-то данные, а затем убедитесь, что вы указали правильный порядковый номер, битовую глубину и частоту дискретизации (переключитесь и посмотрите, не вызывает ли какой-либо из них заметный шум).

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

Если вы еще не нашли его, это отличный ресурс для Java Audio http://www.jsresources.org/

...