How to merge two or more mp3 audio file in android?

13,187

Solution 1

I also struggled with that and solved it using mp4parser

import com.googlecode.mp4parser.authoring.Movie;
import com.googlecode.mp4parser.authoring.Track;
import com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder;
import com.googlecode.mp4parser.authoring.container.mp4.MovieCreator;
import com.googlecode.mp4parser.authoring.tracks.AppendTrack;

For your case, I believe something like this should work:

public static void mergeAudio(List<File> filesToMerge) {

    String output = Environment.getExternalStorageDirectory().getAbsolutePath() + "output.mp3";

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

        try {

            String[] videoUris = new String[]{
                filesToMerge.get(0).getPath(),
                filesToMerge.get(0).getPath()
            };

            List<Track> videoTracks = new LinkedList<Track>();
            List<Track> audioTracks = new LinkedList<Track>();

            for (Movie m : inMovies) {
                for (Track t : m.getTracks()) {
                    if (t.getHandler().equals("soun")) {
                        audioTracks.add(t);
                    }
                    if (t.getHandler().equals("vide")) {
                        videoTracks.add(t);
                    }
                }
            }

            Movie result = new Movie();

            if (!audioTracks.isEmpty()) {
                result.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
            }
            if (!videoTracks.isEmpty()) {
                result.addTrack(new AppendTrack(videoTracks.toArray(new Track[videoTracks.size()])));
            }

            Container out = new DefaultMp4Builder().build(result);

            FileChannel fc = new RandomAccessFile(output, "rw").getChannel();
            out.writeContainer(fc);
            fc.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

There are a few answers suggesting that, such as:

Solution 2

It is too late. But still, someone might need a proper solution. That is why I am suggesting to use AudioMixer-android library.

Share:
13,187
Nisar Ahmad
Author by

Nisar Ahmad

A graduate from University of Arid Agriculture, in Computer Sciences degree, I have undertaken an internship and worked within leading organizations such as Telenor Ibex Earthfactor, Event technologies and pearl core technologies. These placements have enabled me to develop not only specific software industry experience, but also a valuable and transferable skill set in this fast-paced sector. 5 years of experience in mobile app development. Professional Skills: ● Android (Eclipse, Android Studio) ● IOS (Xcode objective C) ● Xamarin Cross Platform development for IOS, Android, Windows, and Shared code. ● SQLite/SQL ● ionic ● JSON/SOAP ● (Android) XMPP protocol Message, Friends addition, presence with openfire server. ● Libraries integration like ACRA, BassBox, amazon s3, Facebook, Twitter, Flurry, Mapnik, AFNetworking ● Google Maps/Offline maps like OpenStreetMaps ● Sip protocol for call using PJSUA, LinePhone, zoiper ● Android Annotation. ● Material Design ● Java Programming ● OOP ● SVN/Github ● Ionic ● Ionic Custom Plugin ● Java Spark API's ● Postgresql

Updated on June 04, 2022

Comments

  • Nisar Ahmad
    Nisar Ahmad about 2 years

    I'm trying to merge mp3 audio files But not successful.

    Here is my code.

    public static void meargeAudio(List<File> filesToMearge)
    {
    
    
        while (filesToMearge.size()!=1){
    
            try {
                FileInputStream fistream1 = new FileInputStream(new File(filesToMearge.get(0).getPath()));  //(/storage/emulated/0/Audio Notes/1455194356500.mp3) first source file
                FileInputStream fistream2 = new FileInputStream(new File(filesToMearge.get(1).getPath()));//second source file
    
                File file1 = new File(filesToMearge.get(0).getPath());
                boolean deleted = file1.delete();
                File file2 = new File(filesToMearge.get(1).getPath());
                boolean deleted1 = file2.delete();
    
                SequenceInputStream sistream = new SequenceInputStream(fistream1, fistream2);
                FileOutputStream fostream = new FileOutputStream(new File(filesToMearge.get(0).getPath()),true);//destinationfile
    
                int temp;
    
                while ((temp = sistream.read()) != -1) {
                    // System.out.print( (char) temp ); // to print at DOS prompt
                    fostream.write(temp);   // to write to file
                }
    
                filesToMearge.add(0,new File(filesToMearge.get(0).getPath()));
                filesToMearge.remove(1);
                filesToMearge.remove(1);
    
    
                fostream.close();
                sistream.close();
                fistream1.close();
                fistream2.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    

    e.g

    firstFileSize =12kb

    secondFileSize =10kb

    finalfileSize=22kb

    Size is accurate But sound is missing

    No error but in result i found finalfile contains only first file audio second file audio is missing.

    Don't know what is the issue.if any one know the solution help me.

    Thanks