5

I am writing an app that records voice from the microphone in AMR format using MediaRecorder, and then plays the data back using MediaPlayer.

That's the goal anyway.

I am fairly confident my MediaRecorder side is working, I'm producing the data file in the right place at the right data rate. Here's how I start and stop my MediaRecorder

public void OnStartRecord(View v )
{
    System.out.println( "StartRecord");

    try {
       audioFile = File.createTempFile("amrtmp", ".amr", getApplicationContext().getFilesDir());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println( "Recording to " + audioFile.getAbsolutePath());

    mRecorder = new MediaRecorder();
    mRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    mRecorder.setAudioEncodingBitRate(4750);
    mRecorder.setAudioSamplingRate(8000);      
    mRecorder.setOutputFile(audioFile.getAbsolutePath());

    try {
        mRecorder.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    mRecorder.start();
}

public void OnStopRecord(View v )
{
    System.out.println( "StopRecord");
    mRecorder.stop();
    mRecorder.release();
}

This works like a charm. Typical output is something like

StartRecord
Recording to /data/data/com.test.playback/files/amrtmp-235967797.amr

And when I start, then stop recording I can see that the file has been created and it has a certain amount of data in it that properly corresponds to the settings.

Side note: I detect an odd buzzing at my speaker while this runs. Any idea what that is?

When I try to play the file back however I have no end of trouble. I have tried the following:

public void OnPlay(View v )
{
    MediaPlayer mPlayer = new MediaPlayer();
    mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);

    FileInputStream FIS = null;
    try {
        FIS = new FileInputStream(audioFile.getAbsolutePath());
        mPlayer.setDataSource(FIS.getFD());
        mPlayer.prepare();
    }
    catch( Exception e )        
    {
        e.printStackTrace();
    }
    mPlayer.start();
}

This results in nothing being played at all with the following output from MediaPlayer:

start() mURI is null

I have also tried the same code, but setting mPlayer's data source differently:

mPlayer.setDataSource(audioFile.getAbsolutePath());

This fails when prepare is called witha java.io.IOException status 0x1.

I have to imagine there is something else I need to do with MediaPlayer to set it up properly. Any suggestions?

djc6535
  • 1,944
  • 4
  • 18
  • 26

0 Answers0