2016-09-18 2 views
1

Ich arbeite an Audio Recorder App mit AudioRecord nicht MediaRecorder. Ich schreibe diesen Code zu notieren:Android AudioRecord - Record Audio mit kleiner Dateigröße

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(); 
     } 

    } 

Es funktioniert gut. aber ich habe eine große Dateigröße. Ich nahm ungefähr 1 Minute auf und ich hatte Datei mit Größe ungefähr 1.2M.

Ich versuchte MediaRecorder mit diesem Code zu verwenden:

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(); 

Es ist toll und aufgezeichnet 5 Minuten mit der Dateigröße etwa 500 K oder weniger. Aber ich muss AudioRecord verwenden, weil ich eine Aufgabe auf Audio byteweise anwenden muss.

Kann ich die gleiche Dateigröße in MediaRecorder haben, wenn ich AudioRecord verwende?

Vielen Dank.

Antwort

1

Eigentlich mit AudioRecord-Klasse erhalten Sie Rohdaten von Sound-Quelle ohne Komprimierung zu Byte-Puffer, mit denen Sie arbeiten und MediaRecorder-Klasse bietet nur grundlegende Funktionen zum Aufzeichnen von Medien aus allen verfügbaren Quellen ohne direkten Zugriff auf Datenpuffer.

Ich nehme an, Sie sollten AudioRecord für die Aufnahme von Audio verwenden, Ihre Byte zu Byte Aufgabe für Daten in AudioRecord Puffer anwenden und dann modifizierte Daten aus dem Puffer mit Kompression in eine Datei schreiben. Wie ich mich erinnere, gibt es keine bereits implementierte Funktionalität in Android-API für die Audiokomprimierung, also sollten Sie eine Drittanbieter-Bibliothek verwenden (zum Beispiel lame) oder die Komprimierung selbst schreiben. Sie können diese Quellen für Audio-Aufnahme in MP3 mit lame überprüfen: https://github.com/yhirano/Mp3VoiceRecorderSampleForAndroid

+0

Perfekt, danke für Ihre Antwort hilft es mir sehr, das eigentliche Problem zu bestimmen. Ich werde Lahme Bibliothek versuchen. Wenn Sie ein Beispiel für manuelle Komprimierung haben, werde ich Ihnen dankbar sein. Nochmals vielen Dank –

+0

Wenn Sie nur innerhalb Ihrer Anwendung mit aufgenommenem Sound arbeiten würden, können Sie einfach einen beliebigen Komprimierungsalgorithmus verwenden, der bereits in Java implementiert wurde ([zip] (http://www.oracle.com/technetwork/articles/java/compress-1565076) .html)) oder Bibliotheken von Drittanbietern. Ich kann nicht wirklich gute Lösung für rohen Sound empfehlen, überprüfen Sie diese Seite: [Schnelle Komprimierung in Java] (http://stackoverflow.com/questions/3918189/fast-compression-in-java) – akaish