Конкатенация файлов WAV в Java - PullRequest
2 голосов
/ 09 января 2012

Вот мой код, который объединяет четыре файла wav и создает файл wavAppended.wav.Этот объединенный файл прекрасно воспроизводится в проигрывателе Windows Media.Но через класс PlaySound можно услышать только one.wav.Кто-нибудь может помочь?

class PlaySound extends Object implements LineListener
{
   File soundFile;
   JDialog playingDialog;
   Clip clip;

   public void PlaySnd(String s) throws Exception
   {
      JFileChooser chooser = new JFileChooser();
      soundFile = new File(s);
      Line.Info linfo = new Line.Info(Clip.class);
      Line line = AudioSystem.getLine(linfo);
      clip = (Clip) line;
      clip.addLineListener(this);
      AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile);
      clip.open(ais);
      clip.start();
    }

    public void update(LineEvent le)
    {
        LineEvent.Type type = le.getType();
        playingDialog.setVisible(false);
        clip.stop();
        clip.close();
     }
}

public class Main
{
   public static void main(String[] args)
   {
      int i;
      String wavFile[] = new String[4];
      wavFile[0] = "D://one.wav";
      wavFile[1] = "D://two.wav";
      wavFile[2] = "D://three.wav";
      wavFile[3] = "D://space.au";
      AudioInputStream appendedFiles;

      try
      {
          AudioInputStream clip0=AudioSystem.getAudioInputStream(new File(wavFile[0]));
          AudioInputStream clip1=AudioSystem.getAudioInputStream(new File(wavFile[1]));
          AudioInputStream clip3;

          for (i=0;i<4;i++)
          {
              appendedFiles = new AudioInputStream(
                 new SequenceInputStream(clip0, clip1),
              clip0.getFormat(),
              clip0.getFrameLength() + clip1.getFrameLength());
              AudioSystem.write(appendedFiles, AudioFileFormat.Type.WAVE, new File("D:\\wavAppended.wav"));

              clip3 = AudioSystem.getAudioInputStream(new File("D:\\wavAppended.wav"));
              clip0=clip3;
              clip1 = AudioSystem.getAudioInputStream(new File(wavFile[i+2]));

            }

            PlaySound p = new PlaySound();
            p.PlaySnd("D://wavAppended.wav");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

Ответы [ 3 ]

1 голос
/ 09 января 2012

Чтобы начать работу с WAV, вы можете взглянуть на мой небольшой проект .Он может копировать и вставлять файлы WAV вместе на основе файла индекса времени.Проект должен содержать всю необходимую вам обработку Java WAV (используя javax.sound.sampled).Реализация Butcher и Composer содержит фактическую обработку.

Идея проста: взять входные аудиофайлы и создать индекс слов, содержащихся в этих файлах.,Запись индекса - это слово, время начала и время окончания.Когда новое предложение создано, оно будет сшито вместе с отдельными словами, взятыми из индекса.

AudioInputStream - это основной класс для взаимодействия с Java Sound API.Вы читаете аудиоданные с него.Если вы создаете аудиоданные, вы делаете это, создавая AudioInputStream, из которого AudioSystem может читать.Фактическое кодирование выполняется реализацией AudioSystem в зависимости от выходного аудиоформата.

Класс Butcher относится к аудиофайлам.Он может читать и записывать аудиофайлы и создавать AudioInputStreams из входного байтового массива.Другая интересная мысль, что Мясник может вырезать образцы из AudioInputStream.AudioInputStream состоит из кадров, которые представляют выборки сигнала ИКМ.Кадры имеют длину в несколько байтов.Чтобы вырезать допустимый диапазон кадров из AudioInputStream, необходимо принять во внимание размер кадра.Время начала и окончания в миллисекундах должно быть переведено в начальный и конечный байты начального и конечного кадров.(Начальные и конечные данные хранятся в виде временных меток, чтобы они не зависели от базовой кодировки используемого файла.)

Composer создает выходной файл.Для данного предложения он берет аудиоданные для каждого слова из входных файлов, объединяет аудиоданные и записывает результат на диск.

В конце вам понадобится некоторое понимание PCM и формат WAV.API звука Java не абстрагируется от этого.

1 голос
/ 26 июля 2017

В приведенном выше примере вам нужно использовать SequenceInputStream, тогда он будет работать нормально.пожалуйста, найдите мой код ниже, чтобы объединить два файла.

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

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;

public class JoinWav{

        public static void main(String... args) throws Exception{
                String wav_1 = "1497434542598100215.wav";
                String wav_2 = "104860397153760.wav";
                AudioInputStream stream_1 = AudioSystem.getAudioInputStream(new File(wav_1));
                AudioInputStream stream_2 = AudioSystem.getAudioInputStream(new File(wav_2));
                System.out.println("Info : Format ["+stream_1.getFormat()+"] Frame Length ["+stream_1.getFrameLength()+"]");
                AudioInputStream stream_join = new AudioInputStream(new SequenceInputStream(stream_1,stream_2),stream_1.getFormat(),stream_1.getFrameLength()+stream_2.getFrameLength());
                AudioSystem.write(stream_join,AudioFileFormat.Type.WAVE,new File("join.wav"));
        }

}
1 голос
/ 09 января 2012

WAV-файлы не работают таким образом - вы не можете просто объединить несколько файлов (например, вы не можете объединить JPEG-изображения), так как в данных есть заголовок, и есть несколько разныхформатирует данные могут быть. Я удивлен, что файл загружается вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...