2010-08-30 6 views
7

J'essaie d'enregistrer un fichier son pcm et de le lire. Quand je le rejoue, cela semble lent et prend plus de temps que pour enregistrer. Je ne suis pas sûr si l'erreur est dans l'enregistrement ou le code de jeu. Des idées quel est le problème?Android L'enregistrement audio et la lecture sont corrompus

I Code largement copié de cet exemple: http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html

Voici le code d'enregistrement (drapeau isRecording est réglé par le bouton d'arrêt en fil de IUG).

 android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 
     int sampleRateInHz = 8000;//8000 44100, 22050 and 11025 
     int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO; 
     int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 

     File sd = Environment.getExternalStorageDirectory(); 
     File file = new File(sd, "msg.wav"); 

     if (file.exists()) 
      file.delete(); 

     try { 
      file.createNewFile(); 
     } catch (IOException e) { 
      Log.e("create file:", e.toString()); 
     } 

     try { 

      OutputStream os = new FileOutputStream(file); 
      BufferedOutputStream bos = new BufferedOutputStream(os); 
      DataOutputStream dos = new DataOutputStream(bos); 

      int bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz,channelConfig, audioFormat); 
      short[] buffer = new short[bufferSize]; 
      audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        sampleRateInHz,channelConfig, audioFormat,bufferSize); 

      audioRecord.startRecording(); 

      isRecording = true; 
      while (isRecording) { 
       int bufferReadResult = audioRecord.read(buffer, 0, bufferSize); 
       for (int i = 0; i < bufferReadResult; i++) 
       { 
        dos.writeShort(buffer[i]); 
       } 
      } 
      dos.close(); 

Ceci est le code de lecture.

  File file = new File(SendAlert.voiceFile); 
      // Get the length of the audio stored in the file (16 bit so 2 bytes per short) 
      // and create a short array to store the recorded audio. 
      int musicLength = (int)(file.length()/2); 
      short[] music = new short[musicLength]; 


      try { 
      // Create a DataInputStream to read the audio data back from the saved file. 
      InputStream is = new FileInputStream(file); 
      BufferedInputStream bis = new BufferedInputStream(is); 
      DataInputStream dis = new DataInputStream(bis); 

      // Read the file into the music array. 
      int i = 0; 
      while (dis.available() > 0) { 
       music[i] = dis.readShort(); 
       i++; 
      } 


      // Close the input streams. 
      dis.close();  


      // Create a new AudioTrack object using the same parameters as the AudioRecord 
      // object used to create the file. 
      AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
                8000, 
                AudioFormat.CHANNEL_CONFIGURATION_MONO, 
                AudioFormat.ENCODING_PCM_16BIT, 
                musicLength, 
                AudioTrack.MODE_STREAM); 
      // Start playback 
      audioTrack.play(); 

      // Write the music buffer to the AudioTrack object 
      audioTrack.write(music, 0, musicLength); 

Répondre

0

le problème changeait le taux d'échantillonnage de 11025 dans l'exemple de 8000.

0

Vous pouvez essayer (enregistrement? Et) la lecture en stéréo; Si la sortie prend deux fois plus de temps que l'entrée, cela me ferait penser que c'est le premier problème. Peut-être que malgré la capture en mono, vous écrivez un fichier wav stéréo?

Si la lecture n'est pas deux fois plus longue que l'enregistrement, quel est le rapport?

+0

Fait intéressant, il est deux fois plus longtemps qu'il devrait être ... mais en changeant la lecture stéréo ne fonctionne pas. ça avait l'air vraiment étrange. –

+0

Si vous essayez de l'enregistrer en stéréo, cela change-t-il quelque chose? –

Questions connexes