之前在网上找了很多音频合并的技术文章,发现合并后的音频是只能播放前一段,后一段无法播放
就在打算修改技术实现方式的的时候发现google的 isoparsr可以实现aac的音频合并和音视频合并,下面贴出代码
implementation 'com.googlecode.mp4parser:isoparser:1.1.21' 引用地址
private String joinAudio(List<String> fileList) {
Log.e("HandDrawActivity", "准备合成中");
boolean result = false;
try {
List<Movie> movieList = new ArrayList<>();
for (String file : fileList) {
movieList.add(MovieCreator.build(file));
}
List<Track> videoTracks = new LinkedList<>();
List<Track> audioTracks = new LinkedList<>();
for (Movie m : movieList) {
for (Track t : m.getTracks()) {
if (t.getHandler().equals("soun")) {
audioTracks.add(t);
}
if (t.getHandler().equals("vide")) {
videoTracks.add(t);
}
}
}
Movie outMovie = new Movie();
if (audioTracks.size() > 0) {
outMovie.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
}
if (videoTracks.size() > 0) {
outMovie.addTrack(new AppendTrack(videoTracks.toArray(new Track[videoTracks.size()])));
}
Container mp4file = new DefaultMp4Builder().build(outMovie);
// 将文件输出
File resultFile = new File(FileUtils.getSystemDir(FileUtils.VIDEO), DateUtils.getDate(new Date(), DateUtils.DATE_FORMAT_11) + ".aac");
if (resultFile.exists() && resultFile.isFile()) {
resultFile.delete();
}
// FileChannel fc = new RandomAccessFile(resultFile, "rw").getChannel();
FileOutputStream os = new FileOutputStream(resultFile);
mp4file.writeContainer(os.getChannel());
os.close();
Log.e("HandDrawActivity", "合成完毕");
// 合成完成后把原片段文件删除
for (String filePath : fileList) {
File file = new File(filePath);
file.delete();
}
movieList.clear();
fileList.clear();
return resultFile.getPath();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}