title: Android Audio Record to wav
body: <p>I recorded an audio using the audio recorder on Android and it produces a raw PCM file. I'm trying to convert it to a format I can listen to (wav or mp3 for example. </p>
  
  <p>I've started with this example but don't know where to go from here: <a href="https://stackoverflow.com/questions/8499042/android-audiorecord-example">Android AudioRecord example</a></p>
  
  <p>tried following these:
  <a href="http://computermusicblog.com/blog/2008/08/29/reading-and-writing-wav-files-in-java" rel="nofollow noreferrer">http://computermusicblog.com/blog/2008/08/29/reading-and-writing-wav-files-in-java</a></p>
  
  <p><a href="https://stackoverflow.com/questions/17192256/recording-wav-with-android-audiorecorder?lq=1">Recording .Wav with Android AudioRecorder</a></p>
  
  <p>Here is my code to record (note I am using Countdown Timer to tell it when to start and stop recording.</p>
  
  <pre><code>public class AudioRecordService extends Service {
      Toast toast;
      private static final int RECORDER_SAMPLERATE = 44100;
      private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
      private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
      private AudioRecord record = null;
      int BufferElements2Rec = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024
      int BytesPerElement = 2; // 2 bytes in 16bit format
      private Thread recordingThread = null;
      private boolean isRecording = false;
      int buffsize = 0;
  
      public AudioRecordService() {
      }
  
      @Override
      public IBinder onBind(Intent intent) {
          // TODO: Return the communication channel to the service.
          throw new UnsupportedOperationException("Not yet implemented");
      }
  
      public int onStartCommand(Intent intent, int flags, int startId)
      {
          try {
              buffsize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
  
              record = new AudioRecord(MediaRecorder.AudioSource.MIC,
                  RECORDER_SAMPLERATE, RECORDER_CHANNELS,
                  RECORDER_AUDIO_ENCODING, buffsize);
  
              record.startRecording();
  
              CountDownTimer countDowntimer = new CountDownTimer(15000, 1000) {
                  public void onTick(long millisUntilFinished) {
                      toast = Toast.makeText(AudioRecordService.this, "Recording", Toast.LENGTH_SHORT);
                      toast.show();
                      isRecording = true;
                      recordingThread = new Thread(new Runnable() {
                          public void run() {
                              writeAudioDataToFile();
                          }
                      }, "AudioRecorder Thread");
                      recordingThread.start();
                  }
  
                  public void onFinish() {
                      try {
                          toast.cancel();
                          Toast.makeText(AudioRecordService.this, "Done Recording ", Toast.LENGTH_SHORT).show();
                          isRecording = false;
                          record.stop();
                          record.release();
                          record = null;
                          recordingThread = null;
                      } catch (Exception e) {
                          // TODO Auto-generated catch block
                          e.printStackTrace();
                      }
  
  
              }};
              countDowntimer.start();
          }
          catch (Exception ex)
          {
              ex.printStackTrace();
          }
          return Service.START_STICKY;
      }
  
      private byte[] short2byte(short[] sData) {
          int shortArrsize = sData.length;
          byte[] bytes = new byte[shortArrsize * 2];
          for (int i = 0; i &lt; shortArrsize; i++) {
              bytes[i * 2] = (byte) (sData[i] &amp; 0x00FF);
              bytes[(i * 2) + 1] = (byte) (sData[i] &gt;&gt; 8);
              sData[i] = 0;
          }
          return bytes;
  
      }
  
      private void writeAudioDataToFile() {
          try {
              //String filePath = "/sdcard/voice8K16bitmono.pcm";
              String extState = Environment.getExternalStorageState();
              // Path to write files to
              String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC + "/test").getAbsolutePath();
  
              String fileName = "audio.pcm";
              String externalStorage = Environment.getExternalStorageDirectory().getAbsolutePath();
              File file = new File(externalStorage + File.separator + fileName);
  
              // if file doesnt exists, then create it
              if (!file.exists()) {
                  file.createNewFile();
              }
              short sData[] = new short[BufferElements2Rec];
  
              FileOutputStream os = null;
              try {
                  os = new FileOutputStream(file);
              } catch (FileNotFoundException e) {
                  e.printStackTrace();
              }
  
              while (isRecording) {
                  // gets the voice output from microphone to byte format
  
                  record.read(sData, 0, BufferElements2Rec);
                  System.out.println("Short wirting to file" + sData.toString());
                  try {
                      // // writes the data to file from buffer
                      // // stores the voice buffer
                      byte bData[] = short2byte(sData);
                      os.write(bData, 0, BufferElements2Rec * BytesPerElement);
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
              try {
                  os.close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
          catch (Exception ex) {
              ex.printStackTrace();
          }
      }
  }
  </code></pre>
  
  <p>My audio.pcm is created. However I don't know how to play it. I'm assuming bDate[] is the byte array being written. The links I created said they used the files, but showed no examples of how it was done.</p>
  
  <p>If it matters, I've used GoldWave to open the file. It opens but the audio is messed up.</p>
  
  <p>I also noticed my files were 2 seconds and I think it's because of the BytesPerElement and BufferElements2Rec. If you can help me out so it's going to be 15 seconds that would be great.</p>
  
  <p>Thanks in advance!</p>