How to merge two or more mp3 audio file in android?
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.
![Nisar Ahmad](https://i.stack.imgur.com/NDfJg.jpg?s=256&g=1)
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, 2022Comments
-
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