A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张晨 于 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输出到文件。
  1. import java.io.*;
  2. import javax.sound.sampled.*;

  3. public class GetFiles {
  4.        
  5.         private String[] fileNames;
  6.         private AudioInputStream[] ais;
  7.         private long lenth=0;
  8.        
  9.         public long getLenth()
  10.         {
  11.                 return lenth;
  12.         }
  13.         public AudioFormat getType()
  14.         {
  15.                 return ais[1].getFormat();
  16.         }
  17.        
  18.         public GetFiles(String[] s)
  19.         {
  20.                 fileNames = s;
  21.         }
  22.        
  23.         public AudioInputStream[] StrToFis()
  24.         {
  25.                 int size = fileNames.length;
  26.                 ais = new AudioInputStream[size];
  27.                
  28.                
  29.                 for(int i = 0 ; i < size; i++)
  30.                 {
  31.                         try {
  32.                                 ais[i] = AudioSystem.getAudioInputStream(new File(fileNames[i]));
  33.                                 lenth += ais[i].getFrameLength();
  34.                         } catch (UnsupportedAudioFileException | IOException e) {
  35.                                 e.printStackTrace();
  36.                         }
  37.                 }
  38.                 return ais;
  39.         }
  40.                
  41. }
复制代码
  1. import java.util.*;
  2. import javax.sound.sampled.AudioInputStream;

  3. public class Container {
  4.        
  5.         private AudioInputStream[] source;
  6.        
  7.         public Container(AudioInputStream[] f)
  8.         {
  9.                 source = f;
  10.         }
  11.        
  12.         public Enumeration<AudioInputStream> fisToEnum()
  13.         {
  14.                 Vector<AudioInputStream> v = new Vector<AudioInputStream>();
  15.                 for (AudioInputStream f: source)
  16.                 {
  17.                         v.add(f);
  18.                 }
  19.                 return v.elements();
  20.         }
  21.        
  22.        
  23. }
复制代码
  1. import java.util.*;
  2. import java.io.*;
  3. import javax.sound.sampled.*;

  4. public class OutputToFile {
  5.         Enumeration<AudioInputStream> e;
  6.         private String path;
  7.         private AudioFormat fileType;  //输出类型
  8.         private long lenth;  //文件长度
  9.        
  10.        
  11.         public OutputToFile(Enumeration<AudioInputStream> eVal,String s,
  12.                         AudioFormat type,long len)
  13.         {
  14.                 e = eVal;
  15.                 path = s;
  16.                 fileType = type;
  17.                 lenth = len;
  18.         }
  19.        
  20.         public void Write() {
  21.                 SequenceInputStream sis = new SequenceInputStream(e);
  22.                
  23.                 AudioInputStream appendFiles = new AudioInputStream(sis,fileType,lenth);
  24.                
  25.                 try {
  26.                         AudioSystem.write(appendFiles,  
  27.                                         AudioFileFormat.Type.WAVE, new File(path));
  28.                 } catch (IOException e1) {
  29.                         // TODO Auto-generated catch block
  30.                         e1.printStackTrace();
  31.                 }
  32.         }
  33. }
复制代码
下面是main文件:
  1. public class Combine {

  2.        
  3.         public static void main(String[] args) {

  4.                 //输入wav文件路径
  5.                 String s1 = "D:\\voice\\a\\afterclap.wav";
  6.                 String s2 = "D:\\voice\\a\\afterdeck.wav";
  7.                
  8.                 String[] s100 = {s1,s2};//,s2,s3,s4,s5,s6};
  9.                
  10.                 //输出wav文件路径
  11.                 String destination = "d:\\wvole.wav" ; //必须写完整路径(包括后缀)
  12.                
  13.                
  14.                 GetFiles g= new GetFiles(s100);
  15.                 Container c = new Container(g.StrToFis());
  16.                 OutputToFile o = new OutputToFile(c.fisToEnum(),destination,g.getType(),
  17.                                 g.getLenth());
  18.                 o.Write();
  19.         }

  20. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
宁超 + 2 很不错。

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马