2011-08-23 96 views

回答

5

我實際上在android app that involves audio上工作。錄製音頻是一件容易的事情,你可以主要複製我的代碼。編寫音頻過濾器是一個非常艱鉅的任務,需要數字信號處理的知識和Fast Fourier Transform (FFT)

你可以通過閱讀audio processing in java here.

同時啓動,這裏是錄製音頻在Android代碼:

public String record() { 

       // please note: the emulator only supports 8 khz sampling. 
       // so in test mode, you need to change this to 
       //int frequency = 8000; 

       int frequency = 11025; 

       int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; 
       int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; 
       File file = new File(Environment.getExternalStorageDirectory() 
           .getAbsolutePath() + "/reverseme.pcm"); 

       // Delete any previous recording. 
       if (file.exists()) 
         file.delete(); 

       // Create the new file. 
       try { 
         file.createNewFile(); 
       } catch (IOException e) { 
         throw new IllegalStateException("Failed to create " 
             + file.toString()); 
       } 

       try { 
         // Create a DataOuputStream to write the audio data into the saved 
         // file. 
         OutputStream os = new FileOutputStream(file); 
         BufferedOutputStream bos = new BufferedOutputStream(os); 
         DataOutputStream dos = new DataOutputStream(bos); 

         // Create a new AudioRecord object to record the audio. 
         int bufferSize = 2 * AudioRecord.getMinBufferSize(frequency, 
             channelConfiguration, audioEncoding); 
         AudioRecord audioRecord = new AudioRecord(
             MediaRecorder.AudioSource.MIC, frequency, 
             channelConfiguration, audioEncoding, bufferSize); 

         short[] buffer = new short[bufferSize]; 
         audioRecord.startRecording(); 

         Log.e(tag, "Recording started"); 

         long start = SystemClock.elapsedRealtime(); 
         long end = start + 15000; 
         while (SystemClock.elapsedRealtime() < end) { 
           int bufferReadResult = audioRecord.read(buffer, 0, bufferSize); 
           for (int i = 0; i < bufferReadResult; i++) 

             if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) { 
               dos.writeShort(EndianUtils.swapShort(buffer[i]));             
             } else { 
               dos.writeShort(buffer[i]);                 
             } 
         } 

         Log.e(tag, "Recording stopped"); 

         audioRecord.stop(); 
         bos.flush(); 
         dos.close(); 
         isRecording = false; 
         return file.getAbsolutePath(); 

       } catch (Exception e) { 
         Log.e(tag, "Recording Failed:" + e.getMessage()); 
         throw new RuntimeException("Failed to create " + e.getMessage()); 

       } 
     } 
0

您可以使用Android SoundPool調出音頻文件的音調,查詢THIS問題的答案。

並且當有人在MIC附近說話時要錄製音頻,請檢查LINK