黑马程序员技术交流社区
标题:
现学现卖,JAVA实现WAV文件合并的源程序,自由组合英语录音
[打印本页]
作者:
张晨
时间:
2011-11-6 17:02
标题:
现学现卖,JAVA实现WAV文件合并的源程序,自由组合英语录音
本帖最后由 张晨 于 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();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2