zoukankan      html  css  js  c++  java
  • Java Sound Capture from Microphone working code

    转载自:http://ganeshtiwaridotcomdotnp.blogspot.com/2011/12/java-sound-capture-from-microphone.html

    Sound  Capture / Record from Microphone and Save : working java source code example

    import java.io.ByteArrayInputStream;  
     import java.io.ByteArrayOutputStream;  
     import java.io.IOException;  
     import javax.sound.sampled.AudioFormat;  
     import javax.sound.sampled.AudioInputStream;  
     import javax.sound.sampled.AudioSystem;  
     import javax.sound.sampled.DataLine;  
     import javax.sound.sampled.TargetDataLine;  
     /**  
      * Reads data from the input channel and writes to the output stream  
      */  
     public class MicrophoneRecorder implements Runnable {  
       // record microphone && generate stream/byte array  
       private AudioInputStream audioInputStream;  
       private AudioFormat format;  
       public TargetDataLine line;  
       public Thread thread;  
       private double duration;  
       public MicrophoneRecorder(AudioFormat format) {  
         super();  
         this.format = format;  
       }  
       public void start() {  
         thread = new Thread(this);  
         thread.setName("Capture");  
         thread.start();  
       }  
       public void stop() {  
         thread = null;  
       }  
       @Override  
       public void run() {  
         duration = 0;  
         line = getTargetDataLineForRecord();  
         final ByteArrayOutputStream out = new ByteArrayOutputStream();  
         final int frameSizeInBytes = format.getFrameSize();  
         final int bufferLengthInFrames = line.getBufferSize() / 8;  
         final int bufferLengthInBytes = bufferLengthInFrames * frameSizeInBytes;  
         final byte[] data = new byte[bufferLengthInBytes];  
         int numBytesRead;  
         line.start();  
         while (thread != null) {  
           if ((numBytesRead = line.read(data, 0, bufferLengthInBytes)) == -1) {  
             break;  
           }  
           out.write(data, 0, numBytesRead);  
         }  
         // we reached the end of the stream. stop and close the line.  
         line.stop();  
         line.close();  
         line = null;  
         // stop and close the output stream  
         try {  
           out.flush();  
           out.close();  
         } catch (final IOException ex) {  
           ex.printStackTrace();  
         }  
         // load bytes into the audio input stream for playback  
         final byte audioBytes[] = out.toByteArray();  
         final ByteArrayInputStream bais = new ByteArrayInputStream(audioBytes);  
         audioInputStream = new AudioInputStream(bais, format, 
                    audioBytes.length / frameSizeInBytes);  
         final long milliseconds = (long) ((audioInputStream.getFrameLength()  
                         * 1000) / format.getFrameRate());  
         duration = milliseconds / 1000.0;  
         System.out.println(duration);  
         try {  
           audioInputStream.reset();  
           System.out.println("resetting...");  
         } catch (final Exception ex) {  
           ex.printStackTrace();  
           return;  
         }  
       }  
       private TargetDataLine getTargetDataLineForRecord() {  
         TargetDataLine line;  
         final DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);  
         if (!AudioSystem.isLineSupported(info)) {  
           return null;  
         }  
         // get and open the target data line for capture.  
         try {  
           line = (TargetDataLine) AudioSystem.getLine(info);  
           line.open(format, line.getBufferSize());  
         } catch (final Exception ex) {  
           return null;  
         }  
         return line;  
       }  
       public AudioInputStream getAudioInputStream() {  
         return audioInputStream;  
       }  
       public AudioFormat getFormat() {  
         return format;  
       }  
       public void setFormat(AudioFormat format) {  
         this.format = format;  
       }  
       public Thread getThread() {  
         return thread;  
       }  
       public double getDuration() {  
         return duration;  
       }  
     }  

    Testing Code :
    Its better to use gui rather than console to record sound (due to thread start/stop problem)
    Here is my console test application for sound record and save:

     public class Testss {  
       public static void main(String[] args) throws Exception {  
         //MicrophoneRecorder mr = new MicrophoneRecorder(AudioFormatUtil.getDefaultFormat());  
         MicrophoneRecorder mr = new MicrophoneRecorder( YOU NEED TO PASS OBJECT OF AudioFormat here); 
         mr.start();  
         Thread.sleep(2000);  
         mr.stop();  
         //save  
         WaveData wd = new WaveData();  
         Thread.sleep(3000);  
         wd.saveToFile("~tmp", Type.WAVE, mr.getAudioInputStream());  
       }  
     }  

    Code for saving AudioInputStream in WaveData Class : (Full Code Next Time)

       public boolean saveToFile(String name, AudioFileFormat.Type fileType,  
                    AudioInputStream audioInputStream) {  
         System.out.println("Saving...");  
         if (null == name || null == fileType || audioInputStream == null) {  
           return false;  
         }  
         File myFile = new File( name+"." + fileType.getExtension());  
         // reset to the beginnning of the captured data  
         try {  
           audioInputStream.reset();  
         } catch (Exception e) {  
           return false;  
         }  
         int i = 0;  
         while (myFile.exists()) {  
           String temp = "" + i + myFile.getName();  
           myFile = new File(temp);  
         }  
         try {  
           AudioSystem.write(audioInputStream, fileType, myFile);  
         } catch (Exception ex) {  
           return false;  
         }  
         System.out.println("Saved " + myFile.getAbsolutePath());  
         return true;  
       }  

    问:hi am using above provided code but am getting the fallowing exception
    java.lang.Error: Unresolved compilation problem:
    The method getDefaultFormat() is undefined for the type AudioFormatUtil

    答:

    you need to remove

    AudioFormatUtil.getDefaultFormat()

    and pass an object of AudioFormat in place of "AudioFormatUtil.getDefaultFormat()" from the line below

    MicrophoneRecorder mr = new MicrophoneRecorder(AudioFormatUtil.getDefaultFormat());


    Please refer to this for detail about AudioFormat :
    http://docs.oracle.com/javase/1.4.2/docs/api/javax/sound/sampled/AudioFormat.html

  • 相关阅读:
    系统管理指南:基本管理 第12 章• x86: 引导系统(任务)
    系统管理指南:基本管理 第16 章• 管理软件(概述)
    排序 从小到大。
    系统管理指南:基本管理 第10 章• SPARC: 引导系统(任务)
    系统管理指南:基本管理 第11 章• x86: 基于GRUB 的引导(任务)
    系统管理指南:基本管理 第13 章• 引导过程(参考)
    排序 自己选择是从小到小还是从小到大排序。
    系统管理指南:基本管理 第15 章• 管理服务(任务)
    .NET反射的简单理解
    SQL分页存储过程
  • 原文地址:https://www.cnblogs.com/passedbylove/p/11888763.html
Copyright © 2011-2022 走看看