合并Android中的音频文件无法正常工作

时间:2016-02-14 20:06:39

标签: android audio mp3 wav

我试图合并/加入两个音频文件。但是合并后的文件只包含第一个文件音频,不知道是什么问题。我认为标题有问题。但是不要知道如何解决它。

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();
        }
    }

}

如果可以,请帮助我。

提前致谢。

2 个答案:

答案 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();
    }

}