在过去的blog中,java也被用于完成收录机的多种作用。此次比以前提升了一点,录音功能独立获取。该程序流程是用LAME.exe伺服电机完成的。这一程序流程的功用是把视频录制获得的wav文件编号成MP3文档。結果,容积大幅度降低,由于LAME伺服电机在检测后的编号全过程中沒有处理途径空心的难题。因而,我只有遇到一个愚昧的方式。为了更好地放到特定的文件夹名称中(文件夹名称途径含有空网格图),我只有先储存在D盘,随后根据文档实际操作拷贝到特定的途径,再删掉。程序流程中也应用了照片,而且改动了java图标,因此我能在操作时注解掉。写的不太好,共同进步!

/** 完成收录机的作用* 1.在原先的根基上页面更为精减,字体变大使客户更为便捷* 2.在终止音频后便立即储存为.mp3文档* 3.对终止音频开展改善,将音频按键设置成相近手机微信的方式,按住时开展音频,松掉即终止音频并储存就可以* 4.在音频的情况下在控制面板上表明声频波,表明已经音频*/package com.liuyun.MyRecord6;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.io.*;import javax.sound.sampled.*;import java.lang.*;public class MyRecord6 extends JFrame implements MouseListener{//界定音频文件格式AudioFormat af = null;//界定总体目标数据信息行,能够从这当中载入声频数据信息,该 TargetDataLine 插口给予从总体目标数据信息行的缓冲区域载入所捕捉数据信息的方式。TargetDataLine td = null;//界定源数据信息行,源数据信息行是能够载入数据信息的数据库行。它当做其混频器的源。应用软件将声频字节数载入源数据信息行,那样可解决字节数缓存并将他们传送给混频器。SourceDataLine sd = null;//界定字节数二维数组I/O流ByteArrayInputStream bais = null;ByteArrayOutputStream baos = null;//界定音频输入流AudioInputStream ais = null;//界定终止音频的标示,来操纵音频进程的运作Boolean stopflag = false;//纪录逐渐音频的時间long startPlay;//设定一个播放视频的标示Boolean playflag;//每一次储存的最终的文件夹名称File tarFile = null;//界定声频波型每一次展现的字节int intBytes = 0;//界定每一次音频的情况下每一次获取字节数来画声频波byte audioDataBuffer[] = null;//界定所须要的部件JPanel jp1,jp2,jp3;JLabel jl1=null;JButton captureBtn;//设定画波型进程的停止的标示boolean flag = true;//界定播放视频音频时的一个计标值int cnt;//界定播放视频音频时一个缓存二维数组byte btsPlay[] = null;int gridx, gridy, gridwidth, gridheight, anchor, fill, ipadx, ipady;double weightx, weighty;Insets inset;GridBagConstraints c;public static void main(String[] args) {//造就一个案例MyRecord6 mr = new MyRecord6();}//构造方法public MyRecord6(){//部件复位jp1 = new JPanel();jp2 = new JPanel();jp3 = new JPanel();//界定jp1的字体样式Font jpFont = new Font(“华文新魏”,Font.BOLD,40);jl1 = new JLabel(“我想要你您想说的话”);jl1.setFont(jpFont);jl1.setForeground(Color.red);jp1.add(jl1);//界定按键上边的字体样式Font btFont = new Font(“华文新魏”,Font.BOLD,40);captureBtn = new JButton(“按着 讲话”);//setForeground能够设定按键上边字体样式的色调captureBtn.setForeground(Color.RED);captureBtn.setFont(btFont);//对逐渐音频按键开展电脑鼠标监视captureBtn.addMouseListener(this);this.add(jp1,BorderLayout.NORTH);this.add(jp2,BorderLayout.CENTER);this.add(jp3,BorderLayout.SOUTH);GridBagLayout gridbag = null;jp3.setLayout(gridbag = new GridBagLayout());gridx=1;gridy=2;gridwidth=1;gridheight=1;weightx=1;weighty=1;anchor=GridBagConstraints.CENTER;fill=GridBagConstraints.HORIZONTAL;inset=new Insets(1,1,1,1);ipadx=0;ipady=30;c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight,weightx, weighty, anchor, fill, inset, ipadx, ipady);gridbag.setConstraints(captureBtn, c);jp3.add(captureBtn);//设定对话框的特性this.setSize(800,500);this.setTitle(“收录机”);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设定对话框垂直居中this.setLocationRelativeTo(null);//将对话框的外框除掉this.setUndecorated(true);this.setVisible(true);//设定对话框上的标志Image img = this.getToolkit().getImage(getClass().getResource(“/image/Recorder.jpg”));this.setIconImage(img);//设定对话框在最前面表明this.setAlwaysOnTop(true);}public void mouseClicked(MouseEvent e) {}public void mousePressed(MouseEvent e) {//当逐渐音频按键被按住时就已经音频if(e.getSource().equals(captureBtn)){//更改按键上边的字的內容captureBtn.setText(“松掉 完毕”);//启用音频的方式capture();//纪录逐渐音频的時间startPlay = System.currentTimeMillis();}}public void mouseReleased(MouseEvent e) {//当松掉音频按键时终止音频并储存音频的文档if(e.getSource().equals(captureBtn)){//启用终止音频的方式stop();//当松掉按键后对表明波型的控制面板开展清除jp2.repaint();//更改按键上边的字的內容captureBtn.setText(“按着 讲话”);//启用储存音频的方式save();//将其放进特定的途径下//界定最后要储放的文件路径String destPath = “D:/Program Files/apache-tomcat-6.0.35/webapps/XWZ/tempFile/”;copyFile(“D:/” tarFile.getName(), destPath);System.exit(0);}}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}//逐渐音频public void capture(){try {//af为AudioFormat也就是音频文件格式af = getAudioFormat();DataLine.Info info = new DataLine.Info(TargetDataLine.class,af);td = (TargetDataLine)(AudioSystem.getLine(info));//开启具备特定文件格式的行,那样可让行得到全部需要的服务器资源并越来越可实际操作。td.open(af);//容许某一数据信息行实行数据信息 I/Otd.start();//运行表明波型的过程RecordWave aw = new RecordWave();Thread t2 = new Thread(aw);t2.start();//把表明波型的过程标示设成trueflag = true;Record record = new Record();Thread t1 = new Thread(record);t1.start();} catch (Exception ex) {ex.printStackTrace();return;}}//终止音频public void stop(){stopflag = true;//将画波型的过程停止flag = false;}//储存音频public void save(){af = getAudioFormat();byte audioData[] = baos.toByteArray();bais = new ByteArrayInputStream(audioData);ais = new AudioInputStream(bais,af, audioData.length / af.getFrameSize());//界定最后储存的文件夹名称File file = null;//载入文档try {//以当今的時间取名音频的名称//将音频的文档储放到F盘下视频语音文件夹名称下File filePath = new File(“D:/AudioFile”);String tarPath = “D:/”;if(!filePath.exists()){//假如文档不会有,则建立该文件目录filePath.mkdirs();}long time = System.currentTimeMillis();file = new File(filePath ”/” time ”.wav”);AudioSystem.write(ais, AudioFileFormat.Type.WAVE, file);//将音频造成的wav文件变换为容积较小的mp3文件格式//界定造成后文件夹名称tarFile = new File(tarPath time ”.mp3″);Runtime run = null;//检测当今的途径try {run = Runtime.getRuntime();//启用伺服电机来将wav文件变换为mp3文档//把编号获得的mp3文档先储放到D盘下,随后运用文档导出涵数将它放进特定的文件夹名称下与此同时将D盘下的删除文件Process p=run.exec(filePath ”/” ”lame -b 16 “ filePath ”/” file.getName() ” “ tarPath tarFile.getName()); //16为视频码率,可自主改动//释放出来过程p.getOutputStream().close();p.getInputStream().close();p.getErrorStream().close();//等候p.waitFor();// //删掉以前储存的的wav文件// if(file.exists())// {// file.delete();// }// //界定最后要储放的文件路径// String destPath = “D:/Program Files/apache-tomcat-6.0.35/webapps/XWZ/tempFile/”;// copyFile(tarPath tarFile.getName(), destPath);} catch (Exception e) {e.printStackTrace();}finally{//最终都需要实行的句子//run启用lame视频解码器最终增加内存run.freeMemory();}} catch (Exception e) {e.printStackTrace();}finally{//关掉流try {if(bais != null){bais.close();}if(ais != null){ais.close();}} catch (Exception e) {e.printStackTrace();}}}//文档复制方式public void copyFile(String srcPath , String destPath){File srcFile = new File(srcPath);//假如目地文件夹名称沒有则建立目地文件夹名称(new File(destPath)).mkdirs();//在目地文件夹名称下建立要拷贝的文档File destFile = new File(destPath ”/” srcFile.getName());if(srcFile.isFile() && srcFile.exists()){InputStream in = null;OutputStream out = null;try {in = new FileInputStream(srcFile);out = new FileOutputStream(destFile);//设定缓存二维数组byte[] buff = new byte[1024*5];int len = 0;while ((len = in.read(buff)) != -1){out.write(buff, 0, len);}// //检测该涵数是不是实行// System.out.println(“ok1”);} catch(Exception e) {e.printStackTrace();}finally{//关掉流,先开的后关掉try {if(out != null){out.close();}if(in != null){in.close();}} catch (Exception e) {e.printStackTrace();}}}//拷贝之后删掉源文件夹名称中的的文档if(srcFile.exists()){srcFile.delete();}}//设定AudioFormat的主要参数public AudioFormat getAudioFormat(){//下边注解一部分是此外一种音频文件格式,两者都能够AudioFormat.Encoding encoding = AudioFormat.Encoding.PCM_SIGNED ;float rate = 8000f;int sampleSize = 16;String signedString = “signed”;boolean bigEndian = true;int channels = 1;return new AudioFormat(encoding, rate, sampleSize, channels,(sampleSize / 8) * channels, rate, bigEndian);// //采样频率是每秒钟播放视频和视频录制的样本量// float sampleRate = 16000.0F;// // 采样频率8000,11025,16000,22050,44100// //sampleSizeInBits表明每一个具备此文件格式的响声样版中的十位数// int sampleSizeInBits = 16;// // 8,16// int channels = 1;// // 单声道为1,环绕声为2// boolean signed = true;// // true,false// boolean bigEndian = true;// // true,false// return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,bigEndian);}//音频类,由于要使用MyRecord类中的自变量,因此将其制成内部类class Record implements Runnable{//界定储放音频的字节数二维数组,做为缓冲区域byte bts[] = new byte[10000];//将字节数二维数组包裝到流里,最后存进到baos中//调用run函数public void run() {baos = new ByteArrayOutputStream();try {stopflag = false;while(stopflag != true){//当终止音频没按住时,该进程一直实行//从数据信息行的键入缓冲区域载入声频数据信息。//要载入bts.length长短的字节数,cnt 是具体载入的字节int cnt = td.read(bts, 0, bts.length);if(cnt > 0){baos.write(bts, 0, cnt);}//逐渐从声频流中载入字节byte copyBts[] = bts;bais = new ByteArrayInputStream(copyBts);ais = new AudioInputStream(bais, af, copyBts.length/af.getFrameSize());try{DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, af);sd = (SourceDataLine) AudioSystem.getLine(dataLineInfo);sd.open(af);sd.start();//从声频流中载入int Buffer_Size = 10000;audioDataBuffer = new byte[Buffer_Size];int outBytes;intBytes = ais.read(audioDataBuffer, 0,audioDataBuffer.length);// 不提到混频器中那样就不容易播放视频// if (intBytes >= 0) {// outBytes = sd.write(audioDataBuffer, 0,audioDataBuffer.length);// }}catch (Exception e) {e.printStackTrace();}}} catch (Exception e) {e.printStackTrace();}finally{try {//intBytes = -1;//关掉开启的字节数二维数组流if(baos != null){baos.close();}} catch (Exception e) {e.printStackTrace();}finally{//下边这一句td.drain()不可以要,那样如果不播放视频数据信息就堵塞再度音频会发生别的程序流程浏览不正确//td.drain();td.close();//更新表明波型的控制面板jp2.repaint();}}}}//画波型的类//由于要应用一些主函数中的数据信息,因此制成内部类class RecordWave extends JPanel implements Runnable{//用画笔画出波型public void paint(Graphics g){super.paint(g);g.fillRect(jp2.getX(),jp2.getY() , 800, 380);if( audioDataBuffer != null){g.drawLine(jp2.getWidth() / 256, 700, jp2.getWidth() / 256, 700);for(int i=0; i

评论(0条)

刀客源码 游客评论