tags:

views:

55

answers:

2

I am trying to record a pcm sound file and play it back. When I play it back, it sounds slow and takes longer than it did to record. I'm not sure if the error is in the record or play code. Any ideas what the problem is?

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

Here is the record code (isRecording flag is set by stop button in 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);
A: 

You could try (recording? and) playing back in stereo; if the output takes twice as long as the input it would make me think that this is the first problem. Maybe despite capturing in mono you're writing a stereo wav file?

If it's not exactly twice as long a playback as it is to record, what is the ratio?

dash-tom-bang
interestingly it is twice as long as it should be... but changing to stereo playback did not work. it sounded really strange.
Andrew Thomas
If you try recording it in stereo does it change anything?
dash-tom-bang
A: 

the problem was changing the sample rate from 11025 in the example to 8000.

Andrew Thomas