❶ java实现 mp3格式转换wav
/*
*实现录音机的功能
*/
packagecom.liuyun.MyRecord1;
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
importjava.io.*;
importjavax.sound.sampled.*;
importjava.lang.*;
{
//定义录音格式
AudioFormataf=null;
//定义目标数据行,可以从中读取音频数据,该TargetDataLine接口提供从目标数据行的缓冲区读取所捕获数据的方法。
TargetDataLinetd=null;
//定义源数据行,源数据行是可以写入数据的数据行。它充当其混频器的源。应用程序将音频字节写入源数据行,这样可处理字节缓冲并将它们传递给混频器。
SourceDataLinesd=null;
//定义字节数组输入输出流
ByteArrayInputStreams=null;
ByteArrayOutputStreambaos=null;
//定义音频输入流
AudioInputStreamais=null;
//定义停止录音的标志,来控制录音线程的运行
Booleanstopflag=false;
//记录开始录音的时间
longstartPlay;
//定义所需要的组件
JPaneljp1,jp2,jp3;
JLabeljl1=null;
JButtoncaptureBtn,stopBtn,playBtn,saveBtn;
publicstaticvoidmain(String[]args){
//创造一个实例
MyRecordmr=newMyRecord();
}
//构造函数
publicMyRecord()
{
//组件初始化
jp1=newJPanel();
jp2=newJPanel();
jp3=newJPanel();
//定义字体
FontmyFont=newFont("华文新魏",Font.BOLD,30);
jl1=newJLabel("录音机功能的实现");
jl1.setFont(myFont);
jp1.add(jl1);
captureBtn=newJButton("开始录音");
//对开始录音按钮进行注册监听
captureBtn.addActionListener(this);
captureBtn.setActionCommand("captureBtn");
//对停止录音进行注册监听
stopBtn=newJButton("停止录音");
stopBtn.addActionListener(this);
stopBtn.setActionCommand("stopBtn");
//对播放录音进行注册监听
playBtn=newJButton("播放录音");
playBtn.addActionListener(this);
playBtn.setActionCommand("playBtn");
//对保存录音进行注册监听
saveBtn=newJButton("保存录音");
saveBtn.addActionListener(this);
saveBtn.setActionCommand("saveBtn");
this.add(jp1,BorderLayout.NORTH);
this.add(jp2,BorderLayout.CENTER);
this.add(jp3,BorderLayout.SOUTH);
jp3.setLayout(null);
jp3.setLayout(newGridLayout(1,4,10,10));
jp3.add(captureBtn);
jp3.add(stopBtn);
jp3.add(playBtn);
jp3.add(saveBtn);
//设置按钮的属性
captureBtn.setEnabled(true);
stopBtn.setEnabled(false);
playBtn.setEnabled(false);
saveBtn.setEnabled(false);
//设置窗口的属性
this.setSize(400,300);
this.setTitle("录音机");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
publicvoidactionPerformed(ActionEvente){
if(e.getActionCommand().equals("captureBtn"))
{
//点击开始录音按钮后的动作
//停止按钮可以启动
captureBtn.setEnabled(false);
stopBtn.setEnabled(true);
playBtn.setEnabled(false);
saveBtn.setEnabled(false);
//调用录音的方法
capture();
//记录开始录音的时间
startPlay=System.currentTimeMillis();
}elseif(e.getActionCommand().equals("stopBtn")){
//点击停止录音按钮的动作
captureBtn.setEnabled(true);
stopBtn.setEnabled(false);
playBtn.setEnabled(true);
saveBtn.setEnabled(true);
//调用停止录音的方法
stop();
//记录停止录音的时间
longstopPlay=System.currentTimeMillis();
//输出录音的时间
System.out.println("Playcontinues"+(stopPlay-startPlay));
}elseif(e.getActionCommand().equals("playBtn"))
{
//调用播放录音的方法
play();
}elseif(e.getActionCommand().equals("saveBtn"))
{
//调用保存录音的方法
save();
}
}
//开始录音
publicvoidcapture()
{
try{
//af为AudioFormat也就是音频格式
af=getAudioFormat();
DataLine.Infoinfo=newDataLine.Info(TargetDataLine.class,af);
td=(TargetDataLine)(AudioSystem.getLine(info));
//打开具有指定格式的行,这样可使行获得所有所需的系统资源并变得可操作。
td.open(af);
//允许某一数据行执行数据I/O
td.start();
//创建播放录音的线程
Recordrecord=newRecord();
Threadt1=newThread(record);
t1.start();
}catch(LineUnavailableExceptionex){
ex.printStackTrace();
return;
}
}
//停止录音
publicvoidstop()
{
stopflag=true;
}
//播放录音
publicvoidplay()
{
//将baos中的数据转换为字节数据
byteaudioData[]=baos.toByteArray();
//转换为输入流
s=newByteArrayInputStream(audioData);
af=getAudioFormat();
ais=newAudioInputStream(s,af,audioData.length/af.getFrameSize());
try{
DataLine.InfodataLineInfo=newDataLine.Info(SourceDataLine.class,af);
sd=(SourceDataLine)AudioSystem.getLine(dataLineInfo);
sd.open(af);
sd.start();
//创建播放进程
Playpy=newPlay();
Threadt2=newThread(py);
t2.start();
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
//关闭流
if(ais!=null)
{
ais.close();
}
if(s!=null)
{
s.close();
}
if(baos!=null)
{
baos.close();
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
//保存录音
publicvoidsave()
{
//取得录音输入流
af=getAudioFormat();
byteaudioData[]=baos.toByteArray();
s=newByteArrayInputStream(audioData);
ais=newAudioInputStream(s,af,audioData.length/af.getFrameSize());
//定义最终保存的文件名
Filefile=null;
//写入文件
try{
//以当前的时间命名录音的名字
//将录音的文件存放到F盘下语音文件夹下
FilefilePath=newFile("F:/语音文件");
if(!filePath.exists())
{//如果文件不存在,则创建该目录
filePath.mkdir();
}
longtime=System.currentTimeMillis();
file=newFile(filePath+"/"+time+".wav");
AudioSystem.write(ais,AudioFileFormat.Type.WAVE,file);
//将录音产生的wav文件转换为容量较小的mp3格式
//定义产生后文件名
StringtarFileName=time+".mp3";
Runtimerun=null;
try{
run=Runtime.getRuntime();
longstart=System.currentTimeMillis();
//调用解码器来将wav文件转换为mp3文件
<strong><spanstyle="color:#ff0000;">Processp=run.exec(filePath+"/"+"lame-b16"+filePath+"/"+file.getName()+""+filePath+"/"+tarFileName);//16为码率,可自行修改
</span></strong>//释放进程
p.getOutputStream().close();
p.getInputStream().close();
p.getErrorStream().close();
p.waitFor();
longend=System.currentTimeMillis();
System.out.println("convertneedcosts:"+(end-start)+"ms");
//删除无用的wav文件
if(file.exists())
{
file.delete();
}
}catch(Exceptione){
e.printStackTrace();
}finally{
//最后都要执行的语句
//run调用lame解码器最后释放内存
run.freeMemory();
}
}catch(Exceptione){
e.printStackTrace();
}finally{
//关闭流
try{
if(s!=null)
{
s.close();
}
if(ais!=null)
{
ais.close();
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
//设置AudioFormat的参数
()
{
//下面注释部分是另外一种音频格式,两者都可以
AudioFormat.Encodingencoding=AudioFormat.Encoding.
PCM_SIGNED;
floatrate=8000f;
intsampleSize=16;
StringsignedString="signed";
booleanbigEndian=true;
intchannels=1;
returnnewAudioFormat(encoding,rate,sampleSize,channels,
(sampleSize/8)*channels,rate,bigEndian);
////采样率是每秒播放和录制的样本数
//floatsampleRate=16000.0F;
////采样率8000,11025,16000,22050,44100
////sampleSizeInBits表示每个具有此格式的声音样本中的位数
//intsampleSizeInBits=16;
////8,16
//intchannels=1;
////单声道为1,立体声为2
//booleansigned=true;
////true,false
//booleanbigEndian=true;
////true,false
//returnnewAudioFormat(sampleRate,sampleSizeInBits,channels,signed,bigEndian);
}
//录音类,因为要用到MyRecord类中的变量,所以将其做成内部类
classRecordimplementsRunnable
{
//定义存放录音的字节数组,作为缓冲区
bytebts[]=newbyte[10000];
//将字节数组包装到流里,最终存入到baos中
//重写run函数
publicvoidrun(){
baos=newByteArrayOutputStream();
try{
stopflag=false;
while(stopflag!=true)
{
//当停止录音没按下时,该线程一直执行
//从数据行的输入缓冲区读取音频数据。
//要读取bts.length长度的字节,cnt是实际读取的字节数
intcnt=td.read(bts,0,bts.length);
if(cnt>0)
{
baos.write(bts,0,cnt);
}
}
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
//关闭打开的字节数组流
if(baos!=null)
{
baos.close();
}
}catch(IOExceptione){
e.printStackTrace();
}finally{
td.drain();
td.close();
}
}
}
}
//播放类,同样也做成内部类
classPlayimplementsRunnable
{
//播放baos中的数据即可
publicvoidrun(){
bytebts[]=newbyte[10000];
try{
intcnt;
//读取数据到缓存数据
while((cnt=ais.read(bts,0,bts.length))!=-1)
{
if(cnt>0)
{
//写入缓存数据
//将音频数据写入到混频器
sd.write(bts,0,cnt);
}
}
}catch(Exceptione){
e.printStackTrace();
}finally{
sd.drain();
sd.close();
}
}
}
}