【问题标题】:Merging 2 audio files sequentially in android?在android中顺序合并2个音频文件?
【发布时间】:2026-02-10 14:05:01
【问题描述】:

如何在android平台中将两个音频文件合并为一个文件。 也就是说,如果我有两个音频文件,即 A 和 B。请给我代码来创建一个新的音频文件 C,该文件由 B 在 A 之后附加。 是否需要将音频文件转换为字节/短数组??...

我喜欢这个,但它只播放第一个文件。

            File firstFile=new File("/mnt/sdcard/Android/data/Dictation/Audio/Dict136.3gp");

            File secondFile=new File("/mnt/sdcard/Android/data/Dictation/Audio/Dict139.3gp");

            System.out.println("1 file:::::"+firstFile+"\n 2nd file::"+secondFile);


           FileInputStream fistream1;
        try {
            fistream1 = new FileInputStream(firstFile);
            FileInputStream fistream2 = new FileInputStream(secondFile);//second source file



            SequenceInputStream sistream = new SequenceInputStream(fistream1, fistream2);
            FileOutputStream fostream = new FileOutputStream("/mnt/sdcard/Android/data/Dictation/Audio/merged.3gp");//destinationfile

            int temp;

            while( ( temp = sistream.read() ) != -1)
            {
                System.out.print( (char) temp ); // to print at DOS prompt
                fostream.write(temp);   // to write to file
            }



            filePath="/mnt/sdcard/Android/data/Dictation/Audio/merged.3gp";
            playAudio(filePath);


            fostream.close();
            fistream1.close();
            fistream2.close();

提前致谢。

【问题讨论】:

    标签: java android


    【解决方案1】:

    要合并 3gp 或 mp4 容器中的音频文件,您应该能够使用 https://github.com/sannies/mp4parser 查看样本: https://github.com/sannies/mp4parser/blob/master/examples/src/main/java/com/googlecode/mp4parser/AppendExample.java

    获取 mp4parser jar(通过 maventral)并执行以下操作:

            File firstFile=new File("/mnt/sdcard/Android/data/Dictation/Audio/Dict136.3gp");
            File secondFile=new File("/mnt/sdcard/Android/data/Dictation/Audio/Dict139.3gp");
    
            Movie movieA = MovieCreator.build(firstFile);
            Movie movieB = MovieCreator.build(secondFile);
            final Movie finalMovie = new Movie();
    
            List<Track> audioTracks = new ArrayList<>();
            for (Movie movie : new Movie[] { movieA, movieB}) {
                for (Track track : movie.getTracks()) {
                    if (track.getHandler().equals("soun")) {
                        audioTracks.add(track);
                    }
                }
            }
            finalMovie.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
    
            final Container container = new DefaultMp4Builder().build(finalMovie);
            File mergedFile = new File("/mnt/sdcard/Android/data/Dictation/Audio/merged.3gp");
            final FileOutputStream fos = new FileOutputStream(mergedFile);
            FileChannel fc = new RandomAccessFile(mergedFile, "rw").getChannel();
            container.writeContainer(fc);
            fc.close();
    

    【讨论】:

    • 您发布的代码示例遇到了一些问题,但是按照库中的示例(上面的链接)可以立即工作。
    【解决方案2】:

    您可以尝试为此使用File Input/output Stream。要读取字节数组中的任何文件,请使用

    byte[] buffer = new byte[FILE_SIZE_HERE];
    FileInputStream fs = new FileInputStream(file);
    int bytesRead = 0;
    bytesRead = fs.read(buffer, 0, FILE_SIZE_HERE);
    

    这里的buffer 包含你文件的字节数组。这样就可以得到两个文件的字节数组。现在在第二步中,当您获取 bot 文件的字节数组时,您需要将两个字节数组复制到一个数组中,然后您可以使用此将这个(第三个新数组)写入一个新文件

    FileOutputStream fout = new FileOutputStream(tempFile, true);
    fout.write(data);
    fout.close();
    

    data 是合并两个数组后得到的新的第三个数组

    编辑: See this how to combine two arrays

    希望这会对你有所帮助。

    【讨论】:

    • 您不能只是合并音频文件并让它们正确播放。上述解决方案不起作用。