Android : recording audio using audiorecord class play as fast forwarded

14,811

Solution 1

I got the solution.. here is my code

public class Audio_Record extends Activity {
private static final int RECORDER_SAMPLERATE = 8000;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private AudioRecord recorder = null;
private Thread recordingThread = null;
private boolean isRecording = false;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    setButtonHandlers();
    enableButtons(false);

    int bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,
            RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);

    System.out.println("BUFFER SIZE VALUE IS " + bufferSize);

}

private void setButtonHandlers() {
    ((Button) findViewById(R.id.btnStart)).setOnClickListener(btnClick);
    ((Button) findViewById(R.id.btnStop)).setOnClickListener(btnClick);
}

private void enableButton(int id, boolean isEnable) {
    ((Button) findViewById(id)).setEnabled(isEnable);
}

private void enableButtons(boolean isRecording) {
    enableButton(R.id.btnStart, !isRecording);
    enableButton(R.id.btnStop, isRecording);
}

int BufferElements2Rec = 1024; // want to play 2048 (2K) since 2 bytes we
                                // use only 1024
int BytesPerElement = 2; // 2 bytes in 16bit format

private void startRecording() {

    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
            RECORDER_SAMPLERATE, RECORDER_CHANNELS,
            RECORDER_AUDIO_ENCODING, BufferElements2Rec * BytesPerElement);

    recorder.startRecording();
    isRecording = true;

    recordingThread = new Thread(new Runnable() {

        public void run() {

            writeAudioDataToFile();

        }
    }, "AudioRecorder Thread");
    recordingThread.start();
}

private byte[] short2byte(short[] sData) {
    int shortArrsize = sData.length;
    byte[] bytes = new byte[shortArrsize * 2];

    for (int i = 0; i < shortArrsize; i++) {
        bytes[i * 2] = (byte) (sData[i] & 0x00FF);
        bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
        sData[i] = 0;
    }
    return bytes;

}

private void writeAudioDataToFile() {
    // Write the output audio in byte

    String filePath = "/sdcard/voice8K16bitmono.pcm";
    short sData[] = new short[BufferElements2Rec];

    FileOutputStream os = null;
    try {
        os = new FileOutputStream(filePath);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    while (isRecording) {
        // gets the voice output from microphone to byte format

        recorder.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();
    }
}

private void stopRecording() {
    // stops the recording activity
    if (null != recorder) {
        isRecording = false;

        recorder.stop();
        recorder.release();

        recorder = null;
        recordingThread = null;
    }
}

private View.OnClickListener btnClick = new View.OnClickListener() {
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btnStart: {
            enableButtons(true);
            startRecording();
            break;
        }
        case R.id.btnStop: {
            enableButtons(false);
            stopRecording();
            break;
        }
        }
    }
};

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_BACK) {

        finish();
    }
    return super.onKeyDown(keyCode, event);
}
}

Solution 2

I had a lot of trouble implementing this for myself. I had done many of the things everyone said above. I implemented this as it's own class called Recorder (and rolled in all of the above 'fixes' as well as a few other tweaks). I hope my code can help someone else save the many hours I laboured over this:

public class Recorder {

    //Begin private fields for this class
    private AudioRecord recorder;

    private static final int RECORDER_BPP = 16;
    private static final String AUDIO_RECORDER_FILE_EXT_WAV = "AudioRecorder.wav";
    private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder";
    private static final String AUDIO_RECORDER_TEMP_FILE = "record_temp.raw";
    private static final int RECORDER_SAMPLERATE = 8000;
    private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
    private static final int RECORDER_CHANNELS_INT = 1;

    private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

    private int bufferSize = 200000;
    short[] buffer;
    private Thread recordingThread = null;
    private boolean isRecording = false;

    //Constructor
    Recorder(String uniquename)
    {
        //Initilize our recorder object
        /*recorder = new AudioRecord(
                MediaRecorder.AudioSource.MIC, 
                44100, 
                AudioFormat.CHANNEL_IN_MONO, 
                AudioFormat.ENCODING_PCM_16BIT,
                AudioRecord.getMinBufferSize(44100,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT)
                );
                */

         int bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,
                    RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);

            System.out.println("BUFFER SIZE VALUE IS " + bufferSize);

          int buffercount = 4088 / bufferSize;
            if (buffercount < 1)
                buffercount = 1;
        recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                RECORDER_SAMPLERATE, RECORDER_CHANNELS,
                RECORDER_AUDIO_ENCODING, 44100);

        //recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        //recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        //recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);


    }

    public void start() throws IllegalStateException, IOException
    {

            buffer = new short[4088];

            recorder.startRecording();

            isRecording = true;

            recordingThread = new Thread(new Runnable() 
            {
                @Override
                public void run() {
                    writeAudioDataToFile();
                }
            }, "AudioRecorder Thread");

            recordingThread.start();
    }

    public void stop()
    {
        System.out.println("Told to stop"); 
         stopRecording();
    }

    public boolean isRecording()
    {
        if(recorder.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING)
            return true;
        else
            return false;
    }


    private void stopRecording() {
        // stops the recording activity

        if (null != recorder) {
            isRecording = false;

            recorder.stop();


            recorder.release();

                recorder = null;
                recordingThread = null;}
            // copy the recorded file to original copy & delete the recorded copy
            copyWaveFile(getTempFilename(), getFilename());
            deleteTempFile();
    } // stores the file into the SDCARD
        private String getFilename() {
            System.out.println("---3---");
            String filepath = Environment.getExternalStorageDirectory().getPath();
            File file = new File(filepath, AUDIO_RECORDER_FOLDER);

            if (!file.exists()) {
                file.mkdirs();
            }

            return (file.getAbsolutePath() + "/" + AUDIO_RECORDER_FILE_EXT_WAV);
        }


    private void deleteTempFile() {
        File file = new File(getTempFilename());

        file.delete();
    }


    private void copyWaveFile(String inFilename, String outFilename) {
    System.out.println("---8---");
    FileInputStream in = null;
    FileOutputStream out = null;
    long totalAudioLen = 0;
    long totalDataLen = totalAudioLen + 36;
    long longSampleRate = RECORDER_SAMPLERATE;
    int channels = RECORDER_CHANNELS_INT;
    long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels / 8;

    byte[] data = new byte[bufferSize];

    try {
        in = new FileInputStream(inFilename);
        out = new FileOutputStream(outFilename);
        totalAudioLen = in.getChannel().size();
        totalDataLen = totalAudioLen + 36;

        Controller.doDoc("File size: " + totalDataLen, 4);

        WriteWaveFileHeader(out, totalAudioLen, totalDataLen,
                longSampleRate, channels, byteRate);
        byte[] bytes2 = new byte[buffer.length * 2];
        ByteBuffer.wrap(bytes2).order(ByteOrder.LITTLE_ENDIAN)
                .asShortBuffer().put(buffer);
        while (in.read(bytes2) != -1) {
            out.write(bytes2);
        }

        in.close();
        out.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

    // stores the file into the SDCARD
    private String getTempFilename() {
        // Creates the temp file to store buffer
        System.out.println("---4-1--");
        String filepath = Environment.getExternalStorageDirectory().getPath();
        System.out.println("---4-2--");
        File file = new File(filepath, AUDIO_RECORDER_FOLDER);
        System.out.println("---4-3--");

        if (!file.exists()) {
            file.mkdirs();
        }

        File tempFile = new File(filepath, AUDIO_RECORDER_TEMP_FILE);
        System.out.println("---4-4--");

        if (tempFile.exists())
            tempFile.delete();
        System.out.println("---4-5--");
        return (file.getAbsolutePath() + "/" + AUDIO_RECORDER_TEMP_FILE);
    }
    private void writeAudioDataToFile() {

        // Write the output audio in byte
        byte data[] = new byte[bufferSize];

        String filename = getTempFilename();
        //
        FileOutputStream os = null;
        //
        try {
            //
            os = new FileOutputStream(filename);
            //
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        int read = 0;


        // if (null != os) {
        while (isRecording) {
            // gets the voice output from microphone to byte format
            recorder.read(buffer, 0, buffer.length);            
            // read = recorder.read(data, 0, 6144);

            if (AudioRecord.ERROR_INVALID_OPERATION != read) {
                try {
                    // // writes the data to file from buffer
                    // // stores the voice buffer

                    // short[] shorts = new short[bytes.length/2];
                    // to turn bytes to shorts as either big endian or little
                    // endian.
                    // ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);

                    // to turn shorts back to bytes.
                    byte[] bytes2 = new byte[buffer.length * 2];
                    ByteBuffer.wrap(bytes2).order(ByteOrder.LITTLE_ENDIAN)
                            .asShortBuffer().put(buffer);

                    os.write(bytes2);
                 //  ServerInteractor.SendAudio(buffer);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        try {
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void WriteWaveFileHeader(FileOutputStream out, long totalAudioLen,
            long totalDataLen, long longSampleRate, int channels, long byteRate)
            throws IOException {
        System.out.println("---9---");
        byte[] header = new byte[4088];

        header[0] = 'R'; // RIFF/WAVE header
        header[1] = 'I';
        header[2] = 'F';
        header[3] = 'F';
        header[4] = (byte) (totalDataLen & 0xff);
        header[5] = (byte) ((totalDataLen >> 8) & 0xff);
        header[6] = (byte) ((totalDataLen >> 16) & 0xff);
        header[7] = (byte) ((totalDataLen >> 24) & 0xff);
        header[8] = 'W';
        header[9] = 'A';
        header[10] = 'V';
        header[11] = 'E';
        header[12] = 'f'; // 'fmt ' chunk
        header[13] = 'm';
        header[14] = 't';
        header[15] = ' ';
        header[16] = 16; // 4 bytes: size of 'fmt ' chunk
        header[17] = 0;
        header[18] = 0;
        header[19] = 0;
        header[20] = 1; // format = 1
        header[21] = 0;
        header[22] = (byte) RECORDER_CHANNELS_INT;
        header[23] = 0;
        header[24] = (byte) (longSampleRate & 0xff);
        header[25] = (byte) ((longSampleRate >> 8) & 0xff);
        header[26] = (byte) ((longSampleRate >> 16) & 0xff);
        header[27] = (byte) ((longSampleRate >> 24) & 0xff);
        header[28] = (byte) (byteRate & 0xff);
        header[29] = (byte) ((byteRate >> 8) & 0xff);
        header[30] = (byte) ((byteRate >> 16) & 0xff);
        header[31] = (byte) ((byteRate >> 24) & 0xff);
        header[32] = (byte) (RECORDER_CHANNELS_INT * RECORDER_BPP / 8); // block align
        header[33] = 0;
        header[34] = RECORDER_BPP; // bits per sample
        header[35] = 0;
        header[36] = 'd';
        header[37] = 'a';
        header[38] = 't';
        header[39] = 'a';
        header[40] = (byte) (totalAudioLen & 0xff);
        header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
        header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
        header[43] = (byte) ((totalAudioLen >> 24) & 0xff);

        out.write(header, 0, 4088);
    }
}

Solution 3

int channels = 1 instead of int channels = 2 for CHANNELS = AudioFormat.CHANNEL_IN_MONO!

Share:
14,811
Rahul Baradia
Author by

Rahul Baradia

Working as a Android developer.. For more informations, You can contact me on LinkedIn. Personal profile link: Rahul Baradia (http://rahulbaradia.com).

Updated on June 07, 2022

Comments

  • Rahul Baradia
    Rahul Baradia almost 2 years

    I am trying to record a audio & stores into a sdcard as well as send to server. When I am trying to play recorded voice its playing,but not as I have recorded. If I record voice for 10mins it ll play for 4min i.e someone has pressed fast forward button with some noisy sound. I am not getting where I am going wrong. Can anybody say me how to solve this problem (should play how much i have recorded i.e 10min recorded then should play only 10mins).

    Here is the code.. sorry for posting bulk code..

    public class Audio_Call extends Activity {
    private static final int RECORDER_BPP = 16;
    private static final String AUDIO_RECORDER_FILE_EXT_WAV = "AudioRecorder.wav";
    private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder";
    private static final String AUDIO_RECORDER_TEMP_FILE = "record_temp.raw";
    private static final int RECORDER_SAMPLERATE = 8000;
    private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
    private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
    
    private AudioRecord recorder = null;
    // private int bufferSize = 200000;
    private int bufferSize = 0;
    short[] buffer;
    private Thread recordingThread = null;
    private boolean isRecording = false;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.audio_call);
    
        setButtonHandlers();
        enableButtons(false);
    
        bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,
                RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);
    
    }
    
    private void setButtonHandlers() {
        ((Button) findViewById(R.id.btnStart)).setOnClickListener(btnClick);
        ((Button) findViewById(R.id.btnStop)).setOnClickListener(btnClick);
    }
    
    private void enableButton(int id, boolean isEnable) {
        ((Button) findViewById(id)).setEnabled(isEnable);
    }
    
    private void enableButtons(boolean isRecording) {
        enableButton(R.id.btnStart, !isRecording);
        enableButton(R.id.btnStop, isRecording);
    }
    
    // stores the file into the SDCARD
    private String getFilename() {
        System.out.println("---3---");
        String filepath = Environment.getExternalStorageDirectory().getPath();
        File file = new File(filepath, AUDIO_RECORDER_FOLDER);
    
        if (!file.exists()) {
            file.mkdirs();
        }
    
        return (file.getAbsolutePath() + "/" + AUDIO_RECORDER_FILE_EXT_WAV);
    }
    
    // stores the file into the SDCARD
    private String getTempFilename() {
        // Creates the temp file to store buffer
        System.out.println("---4-1--");
        String filepath = Environment.getExternalStorageDirectory().getPath();
        System.out.println("---4-2--");
        File file = new File(filepath, AUDIO_RECORDER_FOLDER);
        System.out.println("---4-3--");
    
        if (!file.exists()) {
            file.mkdirs();
        }
    
        File tempFile = new File(filepath, AUDIO_RECORDER_TEMP_FILE);
        System.out.println("---4-4--");
    
        if (tempFile.exists())
            tempFile.delete();
        System.out.println("---4-5--");
        return (file.getAbsolutePath() + "/" + AUDIO_RECORDER_TEMP_FILE);
    
    }
    
    private void startRecording() {
    
        int buffercount = 4088 / bufferSize;
        if (buffercount < 1)
            buffercount = 1;
    
        recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                RECORDER_SAMPLERATE, RECORDER_CHANNELS,
                RECORDER_AUDIO_ENCODING, bufferSize * buffercount);
    
        buffer = new short[4088];
    
        recorder.startRecording();
    
        isRecording = true;
    
        recordingThread = new Thread(new Runnable() {
    
            @Override
            public void run() {
    
                writeAudioDataToFile();
    
            }
        }, "AudioRecorder Thread");
    
        recordingThread.start();
    
    }
    
    private void writeAudioDataToFile() {
    
        // Write the output audio in byte
        byte data[] = new byte[bufferSize];
    
        String filename = getTempFilename();
        //
        FileOutputStream os = null;
        //
        try {
            //
            os = new FileOutputStream(filename);
            //
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    
        int read = 0;
    
    
        // if (null != os) {
        while (isRecording) {
            // gets the voice output from microphone to byte format
            recorder.read(buffer, 0, buffer.length);
            // read = recorder.read(data, 0, 6144);
    
            if (AudioRecord.ERROR_INVALID_OPERATION != read) {
                try {
                    // // writes the data to file from buffer
                    // // stores the voice buffer
    
                    // short[] shorts = new short[bytes.length/2];
                    // to turn bytes to shorts as either big endian or little
                    // endian.
                    // ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);
    
                    // to turn shorts back to bytes.
                    byte[] bytes2 = new byte[buffer.length * 2];
                    ByteBuffer.wrap(bytes2).order(ByteOrder.LITTLE_ENDIAN)
                            .asShortBuffer().put(buffer);
    
                    os.write(bytes2);
                    SendAudio(buffer);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        try {
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    // }
    
    private void stopRecording() {
        // stops the recording activity
    
        if (null != recorder) {
            isRecording = false;
    
            recorder.stop();
            recorder.release();
    
            recorder = null;
            recordingThread = null;
        }
    
        // copy the recorded file to original copy & delete the recorded copy
        copyWaveFile(getTempFilename(), getFilename());
        deleteTempFile();
    
    }
    
    private void deleteTempFile() {
        File file = new File(getTempFilename());
    
        file.delete();
    }
    
    private void copyWaveFile(String inFilename, String outFilename) {
        System.out.println("---8---");
        FileInputStream in = null;
        FileOutputStream out = null;
        long totalAudioLen = 0;
        long totalDataLen = totalAudioLen + 36;
        long longSampleRate = RECORDER_SAMPLERATE;
        int channels = 2;
        long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels / 8;
    
        byte[] data = new byte[bufferSize];
    
        try {
            in = new FileInputStream(inFilename);
            out = new FileOutputStream(outFilename);
            totalAudioLen = in.getChannel().size();
            totalDataLen = totalAudioLen + 36;
    
            AppLog.logString("File size: " + totalDataLen);
    
            WriteWaveFileHeader(out, totalAudioLen, totalDataLen,
                    longSampleRate, channels, byteRate);
            byte[] bytes2 = new byte[buffer.length * 2];
            ByteBuffer.wrap(bytes2).order(ByteOrder.LITTLE_ENDIAN)
                    .asShortBuffer().put(buffer);
            while (in.read(bytes2) != -1) {
                out.write(bytes2);
            }
    
            in.close();
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private void WriteWaveFileHeader(FileOutputStream out, long totalAudioLen,
            long totalDataLen, long longSampleRate, int channels, long byteRate)
            throws IOException {
        System.out.println("---9---");
        byte[] header = new byte[4088];
    
        header[0] = 'R'; // RIFF/WAVE header
        header[1] = 'I';
        header[2] = 'F';
        header[3] = 'F';
        header[4] = (byte) (totalDataLen & 0xff);
        header[5] = (byte) ((totalDataLen >> 8) & 0xff);
        header[6] = (byte) ((totalDataLen >> 16) & 0xff);
        header[7] = (byte) ((totalDataLen >> 24) & 0xff);
        header[8] = 'W';
        header[9] = 'A';
        header[10] = 'V';
        header[11] = 'E';
        header[12] = 'f'; // 'fmt ' chunk
        header[13] = 'm';
        header[14] = 't';
        header[15] = ' ';
        header[16] = 16; // 4 bytes: size of 'fmt ' chunk
        header[17] = 0;
        header[18] = 0;
        header[19] = 0;
        header[20] = 1; // format = 1
        header[21] = 0;
        header[22] = (byte) channels;
        header[23] = 0;
        header[24] = (byte) (longSampleRate & 0xff);
        header[25] = (byte) ((longSampleRate >> 8) & 0xff);
        header[26] = (byte) ((longSampleRate >> 16) & 0xff);
        header[27] = (byte) ((longSampleRate >> 24) & 0xff);
        header[28] = (byte) (byteRate & 0xff);
        header[29] = (byte) ((byteRate >> 8) & 0xff);
        header[30] = (byte) ((byteRate >> 16) & 0xff);
        header[31] = (byte) ((byteRate >> 24) & 0xff);
        header[32] = (byte) (2 * 16 / 8); // block align
        header[33] = 0;
        header[34] = RECORDER_BPP; // bits per sample
        header[35] = 0;
        header[36] = 'd';
        header[37] = 'a';
        header[38] = 't';
        header[39] = 'a';
        header[40] = (byte) (totalAudioLen & 0xff);
        header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
        header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
        header[43] = (byte) ((totalAudioLen >> 24) & 0xff);
    
        out.write(header, 0, 4088);
    }
    
    private View.OnClickListener btnClick = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.btnStart: {
                AppLog.logString("Start Recording");
    
                enableButtons(true);
                startRecording();
    
                break;
            }
            case R.id.btnStop: {
                AppLog.logString("Stop Recording");
    
                enableButtons(false);
                stopRecording();
    
                break;
            }
            }
        }
    };
    
    public void SendAudio(final short data[]) {
        Thread thrd = new Thread(new Runnable() {
            String LOG_TAG = null;
            long SAMPLE_INTERVAL = 10;
    
            @Override
            public void run() {
                Log.e(LOG_TAG, "start send thread, thread id: ");
    
                long file_size = 0;
                int bytes_read = 0;
                int bytes_count = 0;
    
                // byte[] buf = new byte[bufferSize];
                // buf = data;
    
                try {
                    // byte [] b = "192.168.1.40".getBytes();
                    byte[] b = new byte[] { (byte) 192, (byte) 168, (byte) 1,
                            (byte) 39 };
    
                    InetAddress addr = InetAddress.getLocalHost();
                    InetAddress addr1 = InetAddress.getByAddress(b);
    
                    HttpClient httpclient = new DefaultHttpClient();
    
                    ServerUrl url = new ServerUrl();
    
                    String url_page = ServerUrl.url_audio;
                    // String value = new String(buf);
    
                    // System.out.println("mmdata--------- " + value);
    
                    HttpPost httppost = new HttpPost(url_page);
    
                    // Unix time stamp
                    long unixTime = System.currentTimeMillis() / 1000L;
                    String timestamp = String.valueOf(unixTime);
    
                    // Json Format
                    JSONObject holder = new JSONObject();
                    JSONArray jArray = new JSONArray();
                    try {
                        holder.put("UserId", "1");
    
                        holder.put("Timestamp", timestamp);
                        // holder.put("length", value.length());
                        for (int i = 0; i < buffer.length; i++) {
                            jArray.put(i, buffer[i]);
                        }
    
                        holder.put("MMData", jArray);
                        System.out.println("ARRAYYYY" + jArray);
    
    
    
                    } catch (JSONException e1) {
                        e1.printStackTrace();
                    }
    
                    try {
    
                        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
                                2);
    
                        nameValuePairs.add(new BasicNameValuePair("MMData",
                                jArray.toString()));
    
                        httppost.setEntity(new UrlEncodedFormEntity(
                                nameValuePairs));
    
                        StringEntity se = new StringEntity(jArray.toString());
    
                        se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,
                                "application/json"));
    
                        httppost.setEntity(se);
    
                        HttpResponse response = httpclient.execute(httppost);
    
                    } catch (ClientProtocolException e) {
                        System.out.println("-------13");
                        e.printStackTrace();
                    } catch (IOException e) {
                        System.out.println("-------14");
                        e.printStackTrace();
                    } catch (Exception e) {
                        System.out.println("-------15");
                        System.out.println("Exception");
                        e.printStackTrace();
                    }
                    bytes_count += bytes_read;
                    Log.d(LOG_TAG, "bytes_count : " + bytes_count);
                    Thread.sleep(SAMPLE_INTERVAL, 0);
    
                } catch (InterruptedException ie) {
                    Log.e(LOG_TAG, "InterruptedException");
                } catch (UnknownHostException uhe) {
                    Log.e(LOG_TAG, "UnknownHostException");
                } catch (IOException ie) {
                    Log.e(LOG_TAG, "IOException");
                }
            } // end run
        });
        thrd.start();
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    
        if (keyCode == KeyEvent.KEYCODE_BACK) {
    
            finish();
        }
        return super.onKeyDown(keyCode, event);
    }
    }
    

    help will be appreciated.. I have done search on this,but dint get proper solutions.. I am trying all other possibilities but not succeeded.

    Many Thanks

    • Michael
      Michael almost 12 years
      Could you show how you call WriteWaveFileHeader? I.e. what are the values of the arguments you're passing to it?
    • Rahul Baradia
      Rahul Baradia almost 12 years
      @Michael I have updated the code..
    • Michael
      Michael almost 12 years
      Is the resulting file the size you expect it to be? If you open the raw data in an audio editor (like Audacity) you should be able to find out what the samplerate / #channels really is by trying different import settings until you get it to play correctly.
    • Rahul Baradia
      Rahul Baradia almost 12 years
      @Michael .. ya resulting size should be aorund 4k.. ok i ll try n let u knw
    • Rahul Baradia
      Rahul Baradia almost 12 years
      I got where I was going wrong.. I was using wrong channel number.. and in header i was using 4088 size.. which is wrong I should use 44 size.. thanks guys..
    • Vipul J
      Vipul J over 11 years
      @TechEnd : I am trying above code, it is working fine on stereo channel but recording is distorted in mono channel. I tried changing channel also (1 for mono), but its not working. Can you tell me where am I wrong.
    • Rahul Baradia
      Rahul Baradia over 11 years
      check on real device.. coz on emulator we cant judge it. emulator supports only sample rate-8000 ,channel- mono or stereo, encoding-16 or 8 bit.
    • Vipul J
      Vipul J over 11 years
      @TechEnd : I am checking on real device only, its not working. Kindly help.
    • Rahul Baradia
      Rahul Baradia over 11 years
      have u tried changing sampling rates n channels keeping encoding 16bit.. for example sample rate -44100 n channel- stereo or mon
  • Rahul Baradia
    Rahul Baradia over 11 years
    working fine without using wav header. recording audio file in pcm format & playing.