Android Audio Recording and Playback Damaged

I am trying to record a pcm sound file and play it. When I play it, it sounds slow and takes longer than it was for recording. I am not sure if there is an error in the recording or playback code. Any ideas what the problem is?

I pretty much copied the code from this example: http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html

Here is the recording code (the isRecording flag is set by the stop button in the gui thread).

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

This is the play code.

  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); 
+7
java android
source share
2 answers

the problem was to change the sampling rate from 11025 in the example to 8000.

0
source share

You can try (recording? And) playback in stereo; if the output takes twice as much as the input, it would make me think that this is the first problem. Maybe, despite the capture in mono, you write a stereo wav file?

If it is not twice the playback time than is necessary for recording, what is the ratio?

0
source share

All Articles