我试图合并/加入两个音频文件。但是合并后的文件只包含第一个文件音频,不知道是什么问题。我认为标题有问题。但是不要知道如何解决它。
e.g
F1 = 4KB
F2 = 3KB
finalFile = 7 kb
尺寸显示合并完成但不知道为什么音频错过了第二个文件。
这是我的代码。
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();
}
}
}
如果可以,请帮助我。
提前致谢。
答案 0 :(得分:2)
你对头问题是正确的。您的新音频文件仅被识别为第一个音频文件的原因,因为您直接连接两个音频文件。当MediaPlayer读取合并的音频标题(比特率,音频数据等多长时间)时,它仅识别您的第一个音频文件,因为这是它首先发现的。要正确连接2个音频文件,您需要读取其标题并解码其音频数据,重新计算合并音频数据的新长度并连接两个未压缩的音频数据,重新压缩它(例如MP3)然后将其写入文件。
答案 1 :(得分:1)
解决方案:
mp4parser可以用来附加音频文件
https://github.com/sannies/mp4parser/issues/155
使用:
aspectjrt-1.7.3.jar
我的工作代码:
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();
}
}