2012-01-09 112 views
2

这里是我的代码,连接四个wav文件并生成wavAppended.wav。这个级联文件很好地在Windows Media Player中播放。 但是通过PlaySound类,只能听到one.wav。 任何人都可以帮忙吗?在Java中连接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(); 
     } 
    } 
} 

回答

1

WAV文件不工作的方式 - 你不能只是把多个文件一起(同你不能连接JPEG图像,例如),因为有一个数据头,数据可能有多种不同的格式。我很惊讶该文件加载。

+0

感谢您的回复。 – 2012-01-09 11:37:32

1

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

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

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

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

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

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

+0

先生托马斯,谢谢你的回复。但我处在处理wav文件的初步阶段。你能否通过实施你的两个阶段来证明? – 2012-01-09 15:31:15

+0

这个项目本身就是一个演示,用Java声音API可以做什么。你的问题要简单得多。您只需从您的AudioInputStreams中读取所有字节并将它们写入一个整合的AudioInputStreams。 (作曲家基本上是一样的,但是通过剪切输入流中的部分而变得有点模糊。) – 2012-01-09 17:35:00

+0

我认为这是常见的问题,需要将'OutputStream'转换为'InputStream'。检查[这里](http://ostermiller.org/convert_java_outputstream_inputstream.html)几个建议如何做到这一点。 – RockyMM 2012-02-29 11:55:20

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")); 
     } 

}