用Java连接WAV文件

时间:2012-01-09 07:58:09

标签: java audio

这是我的代码连接四个wav文件并生成wavAppended.wav。这个连接文件很好地在Windows Media Player中播放。 但是通过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 个答案:

答案 0 :(得分:1)

WAV文件无法正常工作 - 您不能只将多个文件放在一起(例如,与无法连接JPEG图像相同),因为数据上有标题,并且有多个不同的文件数据可能格式化。我很惊讶文件加载了。

答案 1 :(得分:1)

为了让您开始使用WAV处理,您可以查看我的small project。它可以根据时间索引文件将WAV文件复制并粘贴到一起。该项目应包含您需要的所有Java WAV处理(使用javax.sound.sampled)。 Butcher implementationComposer包含实际处理。

  

这个想法很简单:获取输入音频文件并创建单词索引   包含在这些文件中。索引条目是单词,开始时间和   时间结束。当创建一个新句子时,它将被拼接在一起   单词取自索引。

     

AudioInputStream是与Java Sound交互的主类   API。您从中读取音频数据。如果您创建音频数据,则执行此操作   通过创建一个AudioSystem可以读取的AudioInputStream。该   实际编码由AudioSystem实现完成,具体取决于   输出音频格式。

     

Butcher类与音频文件有关。它可以阅读   并写入音频文件并从输入字节创建AudioInputStreams   阵列。另一个有趣的想法是Butcher可以切割样品   来自AudioInputStream。 AudioInputStream由帧组成   表示PCM信号的样本。帧的长度为   多个字节。从中剪切有效范围的帧   AudioInputStream必须考虑帧大小。该   以毫秒为单位的开始和结束时间必须转换为起始字节   和起始帧和结束帧的结束字节。 (开始和结束   数据存储为时间戳,以使它们独立于   所用文件的基础编码。)

     

Composer会创建输出文件。对于给定的句子   输入文件中每个单词的音频数据,连接起来   音频数据并将结果写入磁盘。

最后,您需要了解PCM和WAV格式。 Java声音API不会抽象出来。

答案 2 :(得分:1)

在上面给出的示例中,您需要使用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"));
        }

}