合并 android 中的音频文件无效
Merging audio file in android not working
我正在尝试 merge/join 两个音频 files.But 合并后的文件只包含第一个文件音频不知道是什么 issue.I 认为 [=33= 有问题]不知道怎么解决
例如
f1=4kb
f2=3kb
最终文件=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();
}
}
}
如果可以的话,请帮助我。
提前致谢。
解决方案:
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();
}
}
关于 header 问题,你是对的。您的新音频文件仅被识别为第一个音频文件的原因是因为您直接连接了两个音频文件。当 MediaPlayer 读取您的合并音频 header(比特率、音频数据的长度等)时,它只会识别您的第一个音频文件,因为这是它首先找到的。要正确加入 2 个音频文件,您需要读取它们的 header 并解码它们的音频数据,重新计算合并音频数据的新长度并连接两个未压缩的音频数据,重新压缩(例如 MP3)然后将其写入文件.
我正在尝试 merge/join 两个音频 files.But 合并后的文件只包含第一个文件音频不知道是什么 issue.I 认为 [=33= 有问题]不知道怎么解决
例如
f1=4kb
f2=3kb
最终文件=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();
}
}
}
如果可以的话,请帮助我。
提前致谢。
解决方案:
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();
}
}
关于 header 问题,你是对的。您的新音频文件仅被识别为第一个音频文件的原因是因为您直接连接了两个音频文件。当 MediaPlayer 读取您的合并音频 header(比特率、音频数据的长度等)时,它只会识别您的第一个音频文件,因为这是它首先找到的。要正确加入 2 个音频文件,您需要读取它们的 header 并解码它们的音频数据,重新计算合并音频数据的新长度并连接两个未压缩的音频数据,重新压缩(例如 MP3)然后将其写入文件.