上一篇中讲了音轨合成 Android多媒体(一) 音轨合成 我用双手成就你的梦想,今天要实现的是将多个Mp4文件合并。
两者相同点在于都是将多个音频合并成一个,不同点在于前者是同时播放多个音频,后者是按合成的顺序播放。
这里使用的是mp4parser来实现的
官网地址:https://code.google.com/p/mp4parser/
GitHub: https://github.com/sannies/mp4parser
也可以在本篇最下面的Demo链接中直接下载本Demo
需要用到的jar:
本次Demo是在上篇的基础上进行的修改,效果图及流程还是一样的,这里不再进行复述,可参考上一篇Android多媒体(一) 音轨合成 我用双手成就你的梦想
因为都是第三方的东西,这里就直接贴代码了:
/**
* 拼接多段Mp4
*
* @param num
*/
private void append(int num) {
// 把选中的item的path存到一个List里
List<String> phthList = new ArrayList<String>();
for (int i = 0; i < list.size(); i++) {
if (1 == list.get(i).getState()) {
phthList.add(list.get(i).getPath());
}
}
try {
List<Movie> inMovies = new ArrayList<Movie>();
for (String videoUri : phthList) {
inMovies.add(MovieCreator.build(videoUri));
}
List<Track> audioTracks = new LinkedList<Track>();
for (Movie m : inMovies) {
for (Track t : m.getTracks()) {
if (t.getHandler().equals("soun")) {
audioTracks.add(t);
}
}
}
Movie result = new Movie();
if (!audioTracks.isEmpty()) {
result.addTrack(new AppendTrack(audioTracks
.toArray(new Track[audioTracks.size()])));
}
Container con = new DefaultMp4Builder().build(result);
@SuppressWarnings("resource")
FileChannel fc = new RandomAccessFile(appendFile.getAbsolutePath()
+ "/appendAudio.mp4", "rw").getChannel();
con.writeContainer(fc);
fc.close();
} catch (IOException e) {
e.printStackTrace();
}
// 将所有item点击状态设置为未点击并刷新adapter
for (int i = 0; i < list.size(); i++) {
list.get(i).setState(0);
}
adapter.setList(list);
Toast.makeText(
getApplicationContext(),
"拼接完成,并存储在" + appendFile.getAbsolutePath() + "/appendAudio.mp4",
Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
最后拼接的Mp4存储在/sdcard/merge/append下面的appendAudio.mp4,可以打开文件夹找到播放试听一下。
以上是Mp4的拼接,Mp3的拼接这里暂不支持,楼主也没有找到好的资料可以实现,如有可实现的办法请在下面留言
Demo: http://download.csdn.net/detail/qq_18612815/9531963