Search code examples
androidaudiomp3wav

Merging audio file in android not working


I'm trying to merge/join two audio files.But the merged file contain only first file audio don't know what is the issue.I think the problem with headers.But don't know how to fix it.

e.g

f1=4kb

f2=3kb

finalFile=7 kb

Size shows merging done but don't know why audio is missed of second file.

Here is my code.

public static void meargeAudio(List<File> filesToMearge)
{


    while (filesToMearge.size()!=1){

        try {



            FileInputStream fistream1 = new FileInputStream(filesToMearge.get(0).getPath());  //(/storage/emulated/0/Audio Notes/1455194356500.mp3) first source file
            FileInputStream fistream2 = new FileInputStream(filesToMearge.get(1).getPath());//second source file

            SequenceInputStream sistream = new SequenceInputStream(fistream1, fistream2);
            FileOutputStream fostream = new FileOutputStream(AppConstrants.APP_FOLDER_PATH+"sss.mp3",true);
            int temp;

            while ((temp = sistream.read()) != -1) {
                // System.out.print( (char) temp ); // to print at DOS prompt
                fostream.write(temp);   // to write to file
            }


            fostream.close();
            sistream.close();
            fistream1.close();
            fistream2.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

Help me if you can.

Thanks in advance.


Solution

  • Solution:

    mp4parser can use to append audio files

    https://github.com/sannies/mp4parser/issues/155

    use:

    aspectjrt-1.7.3.jar

    My Working Code:

    public static void mergAudio(List<File> filesToMearge){
    
    
        try {
            while (filesToMearge.size()!=1) {
    
                String audio1 = filesToMearge.get(0).getPath();
                String audio2 = filesToMearge.get(1).getPath();
    
    
                // FileOutputStream fostream = new FileOutputStream(filesToMearge.get(0).getPath(),true);//destinationfile
                String outputVideo = filesToMearge.get(0).getPath();
    
                Movie[] inMovies = new Movie[]{
                        MovieCreator.build(audio1),
                        MovieCreator.build(audio2),
                };
    
                List<Track> audioTracks = new LinkedList<Track>();
    
                for (Movie m : inMovies) {
                    for (Track t : m.getTracks()) {
                        if (t.getHandler().equals("soun")) {
                            audioTracks.add(t);
                        }
                    }
                }
    
    
                File file1 = new File(filesToMearge.get(0).getPath());
                boolean deleted = file1.delete();
                File file2 = new File(filesToMearge.get(1).getPath());
                boolean deleted1 = file2.delete();
    
    
                Movie result = new Movie();
    
                if (audioTracks.size() > 0) {
                    result.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
                }
    
                Container out = new DefaultMp4Builder().build(result);
                out.writeContainer(new FileOutputStream(outputVideo).getChannel());
    
    
                filesToMearge.add(0, new File(filesToMearge.get(0).getPath()));
                filesToMearge.remove(1);
                filesToMearge.remove(1);
    
            }
    
        } catch (IOException e) {
            e.printStackTrace();
        }
    
    }