2016-09-18 100 views
1

我正在使用AudioRecordMediaRecorder錄音機應用程序。 我寫這篇文章的代碼記錄:的Android AudioRecord - 錄音與文件尺寸較小

private void startRecord(){ 

     File file = new File(Environment.getExternalStorageDirectory(), "test.pcm"); 

     try { 
      file.createNewFile(); 

      OutputStream outputStream = new FileOutputStream(file); 
      BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream); 
      DataOutputStream dataOutputStream = new DataOutputStream(bufferedOutputStream); 

      int minBufferSize = AudioRecord.getMinBufferSize(8000, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT); 

      short[] audioData = new short[minBufferSize]; 

      AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        8000, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, 
        minBufferSize); 

      audioRecord.startRecording(); 

      while(recording){ 
       int numberOfShort = audioRecord.read(audioData, 0, minBufferSize); 
       for(int i = 0; i < numberOfShort; i++){ 
        dataOutputStream.writeShort(audioData[i]); 
       } 
      } 

      audioRecord.stop(); 
      dataOutputStream.close(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

它的正常工作。但是,我有一個很大的文件大小。我記錄了大約1分鐘,我的文件大小約爲1.2M。

我嘗試使用此代碼使用MediaRecorder

mMediaRecorder = new MediaRecorder(); 

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 

mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 

mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

mMediaRecorder.setOutputFile(fileName); 

mMediaRecorder.prepare(); 

mMediaRecorder.start(); 

這是偉大的,並記錄5分鐘文件大小500K左右或更低。但是,我必須使用AudioRecord,因爲我需要逐字節地在音頻上應用一些任務。

我可以在MediaRecorder相同的文件大小,當我使用AudioRecord

非常感謝。

回答

1

實際上AudioRecord類你從聲源的原始數據沒有經過任何壓縮到和你一起工作和MediaRecorder類記錄從任何可用的源媒體不直接訪問數據緩衝區只提供基本功能字節的緩衝區。

我認爲你應該使用AudioRecord用於捕獲音頻,您的字節適用於字節的任務在AudioRecord緩衝區中的數據,然後使用壓縮到一個文件從緩存寫入修改後的數據。我記得,在android API中沒有已經實現的音頻壓縮功能,所以你應該使用第三方庫(例如lame)或者自己編寫壓縮。您可以檢查此源錄音的MP3與跛腳:https://github.com/yhirano/Mp3VoiceRecorderSampleForAndroid

+0

完美,感謝您的回答它幫助我非常多,以確定真正的問題。我會嘗試蹩腳的圖書館。如果你有一個手動壓縮的例子,我將不勝感激。再次感謝 –

+0

如果你將與錄製的聲音只能在你的應用程序時,您可以簡單地使用Java中([拉鍊]已實施任何壓縮算法(http://www.oracle.com/technetwork/articles/java/compress-1565076 .html))或第三方庫。我真的不能建議良好的解決方案的原始聲音,請檢查此頁面:[在Java中快速壓縮](http://stackoverflow.com/questions/3918189/fast-compression-in-java) – akaish