2012-02-17 74 views

回答

15

嘗試在你的應用程序的代碼...

private int RECORDER_CHANNELS = AudioFormat.CHANNEL_CONFIGURATION_MONO; 
private int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT; 
private int RECORDER_SAMPLERATE = 44100; 
private byte RECORDER_BPP = (byte) 16; 

private AudioRecord audioRecorder; 

public void arm() { 
    // Get the minimum buffer size required for the successful creation of an AudioRecord object. 
    int bufferSizeInBytes = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, RECORDER_CHANNELS, 
      RECORDER_AUDIO_ENCODING); 

    // Initialize Audio Recorder. 
    audioRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, RECORDER_SAMPLERATE, 
      RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, bufferSizeInBytes); 

    // Start Recording. 
    audioRecorder.startRecording(); 

    int numberOfReadBytes = 0; 
    byte audioBuffer[] = new byte[bufferSizeInBytes]; 
    boolean recording = false; 
    float tempFloatBuffer[] = new float[3]; 
    int tempIndex = 0; 
    int totalReadBytes = 0; 
    byte totalByteBuffer[] = new byte[60 * 44100 * 2]; 

    // While data come from microphone. 
    while (true) { 
     float totalAbsValue = 0.0f; 
     short sample = 0; 

     numberOfReadBytes = audioRecorder.read(audioBuffer, 0, bufferSizeInBytes); 

     // Analyze Sound. 
     for (int i = 0; i < bufferSizeInBytes; i += 2) { 
      sample = (short) ((audioBuffer[i]) | audioBuffer[i + 1] << 8); 
      totalAbsValue += Math.abs(sample)/(numberOfReadBytes/2); 
     } 

     // Analyze temp buffer. 
     tempFloatBuffer[tempIndex % 3] = totalAbsValue; 
     float temp = 0.0f; 
     for (int i = 0; i < 3; ++i) 
      temp += tempFloatBuffer[i]; 

     if ((temp >= 0 && temp <= 350) && recording == false) { 
      Log.i("TAG", "1"); 
      tempIndex++; 
      continue; 
     } 

     if (temp > 350 && recording == false) { 
      Log.i("TAG", "2"); 
      recording = true; 
     } 

     if ((temp >= 0 && temp <= 350) && recording == true) { 
      Log.i("TAG", "Save audio to file."); 

      // Save audio to file. 
      String filepath = Environment.getExternalStorageDirectory().getPath(); 
      File file = new File(filepath, "AudioRecorder"); 
      if (!file.exists()) 
       file.mkdirs(); 

      String fn = file.getAbsolutePath() + "/" + System.currentTimeMillis() + ".wav"; 

      long totalAudioLen = 0; 
      long totalDataLen = totalAudioLen + 36; 
      long longSampleRate = RECORDER_SAMPLERATE; 
      int channels = 1; 
      long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels/8; 
      totalAudioLen = totalReadBytes; 
      totalDataLen = totalAudioLen + 36; 
      byte finalBuffer[] = new byte[totalReadBytes + 44]; 

      finalBuffer[0] = 'R'; // RIFF/WAVE header 
      finalBuffer[1] = 'I'; 
      finalBuffer[2] = 'F'; 
      finalBuffer[3] = 'F'; 
      finalBuffer[4] = (byte) (totalDataLen & 0xff); 
      finalBuffer[5] = (byte) ((totalDataLen >> 8) & 0xff); 
      finalBuffer[6] = (byte) ((totalDataLen >> 16) & 0xff); 
      finalBuffer[7] = (byte) ((totalDataLen >> 24) & 0xff); 
      finalBuffer[8] = 'W'; 
      finalBuffer[9] = 'A'; 
      finalBuffer[10] = 'V'; 
      finalBuffer[11] = 'E'; 
      finalBuffer[12] = 'f'; // 'fmt ' chunk 
      finalBuffer[13] = 'm'; 
      finalBuffer[14] = 't'; 
      finalBuffer[15] = ' '; 
      finalBuffer[16] = 16; // 4 bytes: size of 'fmt ' chunk 
      finalBuffer[17] = 0; 
      finalBuffer[18] = 0; 
      finalBuffer[19] = 0; 
      finalBuffer[20] = 1; // format = 1 
      finalBuffer[21] = 0; 
      finalBuffer[22] = (byte) channels; 
      finalBuffer[23] = 0; 
      finalBuffer[24] = (byte) (longSampleRate & 0xff); 
      finalBuffer[25] = (byte) ((longSampleRate >> 8) & 0xff); 
      finalBuffer[26] = (byte) ((longSampleRate >> 16) & 0xff); 
      finalBuffer[27] = (byte) ((longSampleRate >> 24) & 0xff); 
      finalBuffer[28] = (byte) (byteRate & 0xff); 
      finalBuffer[29] = (byte) ((byteRate >> 8) & 0xff); 
      finalBuffer[30] = (byte) ((byteRate >> 16) & 0xff); 
      finalBuffer[31] = (byte) ((byteRate >> 24) & 0xff); 
      finalBuffer[32] = (byte) (2 * 16/8); // block align 
      finalBuffer[33] = 0; 
      finalBuffer[34] = RECORDER_BPP; // bits per sample 
      finalBuffer[35] = 0; 
      finalBuffer[36] = 'd'; 
      finalBuffer[37] = 'a'; 
      finalBuffer[38] = 't'; 
      finalBuffer[39] = 'a'; 
      finalBuffer[40] = (byte) (totalAudioLen & 0xff); 
      finalBuffer[41] = (byte) ((totalAudioLen >> 8) & 0xff); 
      finalBuffer[42] = (byte) ((totalAudioLen >> 16) & 0xff); 
      finalBuffer[43] = (byte) ((totalAudioLen >> 24) & 0xff); 

      for (int i = 0; i < totalReadBytes; ++i) 
       finalBuffer[44 + i] = totalByteBuffer[i]; 

      FileOutputStream out; 
      try { 
       out = new FileOutputStream(fn); 
       try { 
        out.write(finalBuffer); 
        out.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } catch (FileNotFoundException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 

      // */ 
      tempIndex++; 
      break; 
     } 

     // -> Recording sound here. 
     Log.i("TAG", "Recording Sound."); 
     for (int i = 0; i < numberOfReadBytes; i++) 
      totalByteBuffer[totalReadBytes + i] = audioBuffer[i]; 
     totalReadBytes += numberOfReadBytes; 
     // */ 

     tempIndex++; 
    } 
} 

欲瞭解更多詳情,您還可以看看這個演示...

http://musicg.googlecode.com/files/musicg_android_demo.zip

+0

真的很好的例子。但它只能檢測到哨子。你知道在這種情況下如何檢測正常的聲音嗎? – 2012-07-27 04:02:35

+3

值得更多的選票非常有幫助。感謝您花時間創建這個例子。 – Akyl 2013-02-26 20:26:10

+0

@iDroidExplorer&其他人感興趣 - 我修改了代碼以包含缺少的變量。它適用於我,但會喜歡別人也驗證它是否適用於他們(如果需要,請修改您的更改) – kape123 2013-04-20 21:36:21

3

請訪問Android開發者頁面關於Audio Capture

它有一個演示如何捕捉和播放聲音的示例代碼。

+0

請仔細閱讀標題。我曾經說過,我想要聽取聲音的演示,如果有任何聲音,那麼它會錄製該聲音。 – 2012-02-17 06:03:51

+0

你有沒有看到第一個鏈接? – Raman 2012-02-17 06:05:31

+0

是的,我看過那個鏈接。我不想實現按鈕點擊記錄開始。我想要的是,如果有任何聲音,它應該記錄autometicaly。 – 2012-02-17 06:17:35

1

我正在嘗試類似的東西。從我看到你必須開始錄製才能讀取音頻電平。因此,我試圖測量振幅,然後增加錄製的長度,並在MaxAmplitude達到可聽點時將文件保存到其他位置。

這就是說我很新的編程,並會真正感謝任何額外的提示或技巧。