2016-09-18 11 views
1

私はAudioRecordではないMediaRecorderを使用しているオーディオレコーダーアプリで作業しています。 私はレコードにこのコードを書いている: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(); 

それは素晴らしいことだと500K程度以下のファイルサイズが5分を記録しました。しかし、AudioRecordを使用する必要があります。なぜなら、オーディオごとにいくつかのタスクをバイトごとに適用する必要があるからです。

AudioRecordを使用すると、同じファイルサイズをMediaRecorderにできますか?

ありがとうございました。

答えて

1

実際にAudioRecordクラスを使用すると、音源から元のデータを圧縮せずにバイトバッファに渡すことができ、MediaRecorderクラスはデータバッファに直接アクセスせずに使用可能なソースからの記録メディアの基本機能のみを提供します。

オーディオをキャプチャするためにAudioRecordを使用し、AudioRecordバッファ内のデータに対してバイトからバイトへの作業を適用し、圧縮を使用してバッファからファイルに変更されたデータを書き込むことを前提とします。私が覚えているように、オーディオ圧縮のためのアンドロイドAPIにはまだ実装されていない機能があるので、サードパーティのライブラリ(たとえばlame)を使用するか、圧縮を自分で書き込む必要があります。あなたは、ラメのMP3でオーディオレコーディングのためのこのソースを確認することができます:https://github.com/yhirano/Mp3VoiceRecorderSampleForAndroid

+0

完璧、本当に本当の問題を特定するために私を助けてくれてありがとう。私はラメのライブラリを試してみます。手動圧縮の例があれば、私は感謝します。もう一度おねがいします –

+0

アプリケーション内でのみ録音されたサウンドを扱う場合は、すでにJavaで実装されている圧縮アルゴリズムを使用できます([zip](http://www.oracle.com/technetwork/articles/java/compress-1565076) .html))またはサードパーティのライブラリ。私は本当に生のサウンドのための良い解決策を助言することはできません、このページを確認してください:[Javaの高速圧縮](http://stackoverflow.com/questions/3918189/fast-compression-in-java) – akaish

関連する問題