Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strange issue in Combining Audio Files and playing in different API versions

All , I am using Media Recorder for Recording Audio.

Case 1: If i use Android Version 2.2 installed devices, my recorded audio combined and playing well.

Case 2: If i use it in Android 1.6 installed devices, i am not able to play the combined audio file.

It is playing only the very first recorded audio and next recorded audio files keep empty no sound.

Also i am not getting any error in Logcat.

I used following code for recording audio :

    mRecorder = new MediaRecorder();
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
    mRecorder.setOutputFile(main_record_file);
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    mRecorder.prepare();
    mRecorder.start();

Also i tried for mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

Code for combining Audio file :

    public void createCombineRecFile(){
    combined_file_stored_path=getFilename_combined_raw(); // File path in String to store recorded audio
    byte fileContent[]=null;
    FileInputStream ins;
    FileOutputStream fos = null;
    try{
        fos = new FileOutputStream(combined_file_stored_path,true);
    }
    catch (FileNotFoundException e1){
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    for(int i=0;i<audNames.size();i++){
        try{
            File f=new File(audNames.get(i));
            Log.v("Record Message", "File Length=========>>>"+f.length());
            fileContent = new byte[(int)f.length()];
            ins=new FileInputStream(audNames.get(i));
            int r=ins.read(fileContent);// Reads the file content as byte from the list.
            Log.v("Record Message", "Number Of Bytes Readed=====>>>"+r);
            fos.write(fileContent);//Write the byte into the combine file.

            Log.v("Record Message", "File======="+i+"is Appended");

        }
        catch (FileNotFoundException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    try{
        fos.close();
        Log.v("Record Message", "===== Combine File Closed =====");
    }
    catch (IOException e){
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Let me know any details need.Thanks.

like image 910
Venky Avatar asked Nov 25 '11 11:11

Venky


1 Answers

Every audio file has its own header (includes information about length/samples etc.) - by combining the files the way you do the resulting file has multiple headers, one per source file (depending on the exact format with file offsets etc.). Thus the resulting file is NOT correct in terms of file format spec.

The newer Android version are more permissive and work/play with "multiple headers" present... the older versions do not...

To create a correctly combined audio file you must conform to the spec which among other things means creating one new header which describes all included audio...

Use for the the combination of audio files a different approach - for example via ffmpeg (see this for how to make ffmpeg for android).

like image 147
Yahia Avatar answered Nov 15 '22 20:11

Yahia