这是我的代码连接四个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();
}
}
}
答案 0 :(得分:1)
WAV文件无法正常工作 - 您不能只将多个文件放在一起(例如,与无法连接JPEG图像相同),因为数据上有标题,并且有多个不同的文件数据可能格式化。我很惊讶文件加载了。
答案 1 :(得分:1)
为了让您开始使用WAV处理,您可以查看我的small project。它可以根据时间索引文件将WAV文件复制并粘贴到一起。该项目应包含您需要的所有Java WAV处理(使用javax.sound.sampled)。 Butcher implementation和Composer包含实际处理。
这个想法很简单:获取输入音频文件并创建单词索引 包含在这些文件中。索引条目是单词,开始时间和 时间结束。当创建一个新句子时,它将被拼接在一起 单词取自索引。
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"));
}
}