Audio Recording in Stereo giving same data in Left and Right channels

4.3k views Asked by At

I am trying to record and process audio data based on differences in what gets recorded in the left and right channel. For this I am using Audio Record class, with MIC as input and STEREO mode.

recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate,
                                    AudioFormat.CHANNEL_IN_STEREO,
                                    AudioFormat.ENCODING_PCM_16BIT, bufferSize);

My issue is that I get exactly the same data in both the channels. (alternate samples are separated to get individual channel inputs). Please help. I am not sure why this is happening.

3

There are 3 answers

1
Chris Stratton On

You cannot obtain a stereo input in this way on your device.

Although the Nexus 4 has two microphones, they are not intended for stereo recording, but instead are likely for background noise cancellation.

See https://groups.google.com/forum/#!topic/android-platform/SptXI964eEI where various low-level modifications of the audio system are discussed in an attempt to accomplish stereo recording.

0
Rokas On

Here is a working example for capturing audio in stereo (tested with Samsung Galaxy S3 4.4.2 SlimKat):

private void startRecording() {
    String filename = Environment.getExternalStorageDirectory().getPath()+"/SoundRecords/"+System.currentTimeMillis()+".aac";
    File record = new File(filename);
    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    recorder.setAudioEncodingBitRate(128000);
    recorder.setAudioSamplingRate(96000);
    recorder.setAudioChannels(2);
    recorder.setOutputFile(filename);
    t_filename.setText(record.getName());
    try {
        recorder.prepare();
        recorder.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

If your phone supports stereo capturing, then this should work :)

1
Yuntao Wang On

Using this configuration:

private int audioSource = MediaRecorder.AudioSource.MIC;  
private static int sampleRateInHz = 48000;  
private static int channelConfig = AudioFormat.CHANNEL_IN_STEREO;  
private static int audioFormat = AudioFormat.ENCODING_PCM_16BIT;  

The data in the audio data is as follows.

leftChannel data: [0,1],[4,5]...
rightChannel data: [2,3],[6,7]...

So you need to seperate the data.

readSize = audioRecord.read(audioShortData, 0, bufferSizeInBytes);
for(int i = 0; i < readSize/2; i = i + 2)
{
       leftChannelAudioData[i] = audiodata[2*i];
       leftChannelAudioData[i+1] = audiodata[2*i+1]; 
       rightChannelAudioData[i] =  audiodata[2*i+2];
       rightChannelAudioData[i+1] = audiodata[2*i+3];
}

Hope this helpful.