合并 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)然后将其写入文件.