本帖最后由 张晨 于 2011-11-6 17:05 编辑
总体思想是:
使用SequenceInputStream(Enumeration<? Extends super> e )合并wav的输入流
所以需要一个Vector容器来产生Enumeration 对象
所以在Vector容器中装FileInputStream对象
然后靠FileOutputStream输出。
但是这样做导致了,虽然文件虽然被正确的写入,但是即使拼合了n个wav文件也只能读出第一个,很明显,是wav的编码方式导致的。
所以只能去找文档帮助,然后早搜搜前人的经验,于是输如流改为:
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(path));
而输出流改为:
AudioSystem .write(AudioInputStream stream, AudioFileFormat.Type fileType, OutputStream out)
Ok ,bingo!成功实现想要的功能,不很完善,毕竟只用了两天时间,而我的时间也不是很够,后续估计要等黑马考试完成后在完善了。
后续完善的地方,首先做的是把语音数据库做成一个键值数据库(用Properties):单词=路径,然后加入gui,放上一个textArea,直接在上面写入单词,实现自动查找语音路径,就不用很尴尬的去修改main文件了,此程序可扩展性是挺高的。
类与类之间的关系
GetFiles类:接受一个字符串数组作为wav文件的源地址,封装入AudioInputStream[],并且返回此数组;
Container类:接受一个AudioInputStream[]数组,封装入Vector容器中,并且放回容器的elements()方法,即Enumeration对象。
OutputToFile类,接受一个Enumeration对象,将其中的流 装入SequenceInputStream,利用AudioInputStream构造方法合并流,然后AudioSystem.write输出到文件。- import java.io.*;
- import javax.sound.sampled.*;
- public class GetFiles {
-
- private String[] fileNames;
- private AudioInputStream[] ais;
- private long lenth=0;
-
- public long getLenth()
- {
- return lenth;
- }
- public AudioFormat getType()
- {
- return ais[1].getFormat();
- }
-
- public GetFiles(String[] s)
- {
- fileNames = s;
- }
-
- public AudioInputStream[] StrToFis()
- {
- int size = fileNames.length;
- ais = new AudioInputStream[size];
-
-
- for(int i = 0 ; i < size; i++)
- {
- try {
- ais[i] = AudioSystem.getAudioInputStream(new File(fileNames[i]));
- lenth += ais[i].getFrameLength();
- } catch (UnsupportedAudioFileException | IOException e) {
- e.printStackTrace();
- }
- }
- return ais;
- }
-
- }
复制代码- import java.util.*;
- import javax.sound.sampled.AudioInputStream;
- public class Container {
-
- private AudioInputStream[] source;
-
- public Container(AudioInputStream[] f)
- {
- source = f;
- }
-
- public Enumeration<AudioInputStream> fisToEnum()
- {
- Vector<AudioInputStream> v = new Vector<AudioInputStream>();
- for (AudioInputStream f: source)
- {
- v.add(f);
- }
- return v.elements();
- }
-
-
- }
复制代码- import java.util.*;
- import java.io.*;
- import javax.sound.sampled.*;
- public class OutputToFile {
- Enumeration<AudioInputStream> e;
- private String path;
- private AudioFormat fileType; //输出类型
- private long lenth; //文件长度
-
-
- public OutputToFile(Enumeration<AudioInputStream> eVal,String s,
- AudioFormat type,long len)
- {
- e = eVal;
- path = s;
- fileType = type;
- lenth = len;
- }
-
- public void Write() {
- SequenceInputStream sis = new SequenceInputStream(e);
-
- AudioInputStream appendFiles = new AudioInputStream(sis,fileType,lenth);
-
- try {
- AudioSystem.write(appendFiles,
- AudioFileFormat.Type.WAVE, new File(path));
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- }
- }
复制代码 下面是main文件:- public class Combine {
-
- public static void main(String[] args) {
- //输入wav文件路径
- String s1 = "D:\\voice\\a\\afterclap.wav";
- String s2 = "D:\\voice\\a\\afterdeck.wav";
-
- String[] s100 = {s1,s2};//,s2,s3,s4,s5,s6};
-
- //输出wav文件路径
- String destination = "d:\\wvole.wav" ; //必须写完整路径(包括后缀)
-
-
- GetFiles g= new GetFiles(s100);
- Container c = new Container(g.StrToFis());
- OutputToFile o = new OutputToFile(c.fisToEnum(),destination,g.getType(),
- g.getLenth());
- o.Write();
- }
- }
复制代码 |