AudioRecord and bufferSize

All your problems with Audio, Video and Images.

AudioRecord and bufferSize

Postby r0yalty » Fri Apr 09, 2010 9:49 pm

I'm trying to record to a DataOutputStream using AudioRecord. When looping through the recieved buffer from auidioRecord.read, everything works just fine if I add each buffer value ( buffer[i] ) to the DataOutputStream. But if I'm checking each value in the buffer and only writing some of them to the DataOutputStream, I usually end up with a "Invalid audio buffer size" when playing the file...

So, The following code works perfectly:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2. int frequency = 11025;
  3.  
  4.                                 int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
  5.  
  6.                                 int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
  7.  
  8.                                 try {
  9.  
  10.                                         OutputStream os = new FileOutputStream(file);
  11.  
  12.                                         BufferedOutputStream bos = new BufferedOutputStream(os);
  13.  
  14.                                         DataOutputStream dos = new DataOutputStream(bos);
  15.  
  16.                                        
  17.  
  18.                                         int bufferSize = AudioRecord.getMinBufferSize(frequency,
  19.  
  20.                                                         channelConfiguration, audioEncoding);
  21.  
  22.                                         AudioRecord audioRecord = new AudioRecord(
  23.  
  24.                                                         MediaRecorder.AudioSource.MIC, frequency,
  25.  
  26.                                                         channelConfiguration, audioEncoding, bufferSize);
  27.  
  28.  
  29.  
  30.                                         short[] buffer = new short[bufferSize];
  31.  
  32.                                         boolean shouldWriteToFile = false;
  33.  
  34.                                         audioRecord.startRecording();
  35.  
  36.                                         while (isRecording()) {
  37.  
  38.                                                 int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
  39.  
  40.                                                 for (int i = 0; i < bufferReadResult; i++){
  41.  
  42.                                                                 dos.writeShort(buffer[i]);
  43.  
  44.                                                 }
  45.  
  46.                                         }
  47.  
  48.                                         audioRecord.stop();
  49.  
  50.                                         dos.close();
  51.  
  52.                                 } catch (Throwable t) {
  53.  
  54.                                         Log.e("AudioRecord", "Recording Failed");
  55.  
  56.                                 }
  57.  
  58.  
Parsed in 0.035 seconds, using GeSHi 1.0.8.4


but the following (where i'm not necesarry writing the entire buffer)will generate files that usually end up with "invalid audio buffer size" when trying to play them using AudioTrack;

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2. int frequency = 11025;
  3.  
  4.                                 int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
  5.  
  6.                                 int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
  7.  
  8.                                 try {
  9.  
  10.                                         OutputStream os = new FileOutputStream(file);
  11.  
  12.                                         BufferedOutputStream bos = new BufferedOutputStream(os);
  13.  
  14.                                         DataOutputStream dos = new DataOutputStream(bos);
  15.  
  16.                                        
  17.  
  18.                                         int bufferSize = AudioRecord.getMinBufferSize(frequency,
  19.  
  20.                                                         channelConfiguration, audioEncoding);
  21.  
  22.                                         AudioRecord audioRecord = new AudioRecord(
  23.  
  24.                                                         MediaRecorder.AudioSource.MIC, frequency,
  25.  
  26.                                                         channelConfiguration, audioEncoding, bufferSize);
  27.  
  28.  
  29.  
  30.                                         short[] buffer = new short[bufferSize];
  31.  
  32.                                         boolean shouldWriteToFile = false;
  33.  
  34.                                         audioRecord.startRecording();
  35.  
  36.                                         while (isRecording()) {
  37.  
  38.                                                 int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
  39.  
  40.                                                 for (int i = 0; i < bufferReadResult; i++){
  41.  
  42.                                                         if (Math.abs(buffer[i]) > (MIN_AMPLITUDE)){
  43.  
  44.                                                                 shouldWriteToFile = true;
  45.  
  46.                                                         }
  47.  
  48.                                                         if (shouldWriteToFile)
  49.  
  50.                                                                 dos.writeShort(buffer[i]);
  51.  
  52.                                                 }
  53.  
  54.                                         }
  55.  
  56.                                         audioRecord.stop();
  57.  
  58.                                         dos.close();
  59.  
  60.                                 } catch (Throwable t) {
  61.  
  62.                                         Log.e("AudioRecord", "Recording Failed");
  63.  
  64.                                 }
  65.  
  66.  
Parsed in 0.035 seconds, using GeSHi 1.0.8.4
r0yalty
Freshman
Freshman
 
Posts: 5
Joined: Sun Apr 04, 2010 7:26 am

Top

Postby r0yalty » Fri Apr 09, 2010 10:01 pm

I think I solved it..

Instead of writing incomplete buffers, I just first analyzed the buffer, and if it should be written I then loop through the entire buffer again writing EVERY short of it. Guess the buffers have to be complete.
r0yalty
Freshman
Freshman
 
Posts: 5
Joined: Sun Apr 04, 2010 7:26 am

Top

Return to Multimedia Problems

Who is online

Users browsing this forum: Exabot [Bot], Majestic-12 [Bot] and 14 guests