当前位置: 首页 > 知识库问答 >
问题:

如何合并两个音频文件到一个单一的音频文件在Android?

宇文和同
2023-03-14

我想得到两个音频文件作为输入,然后按字节合并它们,并将其保存为单个文件。
在这个代码中,我试图在Java中做到这一点,它工作正常,但我不知道如何在android中做到这一点。

如何在Android系统中做到这一点?

import java.io.File;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.Path;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;

public class FileMixer {
    public static void main(String[] args)
    {
        try
        {
    Path path1 = Paths.get("C:\\Srini\\Wav\\welcome.wav");
    Path path2 = Paths.get("C:\\Srini\\Wav\\goodbye.wav"); 
    String path3 ="C:\\Srini\\Wav\\srini12.wav";
    File Newfilepath=new File(path3);

    byte[] byte1 = Files.readAllBytes(path1);
    byte[] byte2 = Files.readAllBytes(path2);
    byte[] out = new byte[byte1.length];
    for (int i=0; i<byte1.length; i++)
    {
        out[i] = (byte) ((byte1[i] + byte2[i]) >> 1);
    }

    InputStream byteArray = new ByteArrayInputStream(out);
    AudioInputStream ais = AudioSystem.getAudioInputStream(byteArray);
    AudioSystem.write(ais, AudioFileFormat.Type.WAVE,Newfilepath);
    }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        }
}

共有3个答案

马凡
2023-03-14

太迟了。但是,有人可能需要一个合适的解决方案。这就是为什么我建议使用AudioMixer-android库。你也可以执行很多音频处理的事情。

邬友樵
2023-03-14

要组合两个wav文件,请使用以下代码:,

import java.io.File;
import java.io.IOException;
import java.io.SequenceInputStream;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;

public class WavAppender {
    public static void main(String[] args) {
        String wavFile1 = "D:\\wavOne.wav";
        String wavFile2 = "D:\\wavTwo.wav";

        try {
            AudioInputStream clip1 = AudioSystem.getAudioInputStream(new File(wavFile1));
            AudioInputStream clip2 = AudioSystem.getAudioInputStream(new File(wavFile2));

            AudioInputStream appendedFiles = 
                            new AudioInputStream(
                                new SequenceInputStream(clip1, clip2),     
                                clip1.getFormat(), 
                                clip1.getFrameLength() + clip2.getFrameLength());

            AudioSystem.write(appendedFiles, 
                            AudioFileFormat.Type.WAVE, 
                            new File("D:\\wavAppended.wav"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
邵城
2023-03-14
private void mergeSongs(File mergedFile,File...mp3Files){
        FileInputStream fisToFinal = null;
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(mergedFile);
            fisToFinal = new FileInputStream(mergedFile);
            for(File mp3File:mp3Files){
                if(!mp3File.exists())
                    continue;
                FileInputStream fisSong = new FileInputStream(mp3File);
                SequenceInputStream sis = new SequenceInputStream(fisToFinal, fisSong);
                byte[] buf = new byte[1024];
                try {
                    for (int readNum; (readNum = fisSong.read(buf)) != -1;)
                        fos.write(buf, 0, readNum);
                } finally {
                    if(fisSong!=null){
                        fisSong.close();
                    }
                    if(sis!=null){
                        sis.close();
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                if(fos!=null){
                    fos.flush();
                    fos.close();
                }
                if(fisToFinal!=null){
                    fisToFinal.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    } 
 类似资料:
  • 问题内容: 我有2个音频文件。第一个是背景音乐,第二个是演讲。(每个大约四分钟长) 现在,我想将它们混合并接收4分钟的语音和背景音乐。 问题答案: 您不需要FFMPEG,可以使用android中提供的标准编解码器。 上面的代码处理1个文件的读取。“处理”例程(尚未定义)接收交错的样本数组(左/右/左/右/左/右)。您现在要做的就是将这些通道添加到目标缓冲区。例如 生成的目标数组将包含您覆盖的样本。

  • 我正在尝试使用FFMPEG合并2个mp4文件。其中一个文件同时具有视频和音频(),而另一个只有音频()。这些文件的名称以以下方式列在名为的文本文件中: 然后执行下面的ffmpeg命令来合并它们。 但是,生成的连接文件只包含。也就是说,如果

  • 问题内容: 我想使用Xuggler 将无音频的视频文件与音频文件合并。此刻,我已经采取了两个流,并将这些流的视频和音频部分分别合并为画中画。现在,我想将音频和视频文件相互组合。任何建议或提示将不胜感激。我正在使用red5服务器。谢谢。 问题答案: 使用MediaConcatenator。请参见示例代码“连接音频和视频”

  • 我想把两个音频文件合并成一个新文件。我尝试使用MP4parser库,它会导致一些问题,使用SquenceInputStream组合两个音频文件,它会增加音频文件的大小,但只播放初始歌曲。 参考:https://stackoverflow.com/a/43650758/8775993 与StackOverflow答案核对无任何效果。 请提出解决方案。提前谢谢。

  • 我知道这个片段。stop()方法,但是当我把它放在key_events中时,它似乎在里面不起作用。它只会导致错误。我知道为什么它会导致错误。因为我要求它基本上停止一个直到几行之后才存在的剪辑。但是,如果可能的话,使用相同的逻辑或接近它,我怎么能重新编码,这样它就知道选择从上一个key_event播放的上一个剪辑。我想要的功能是:按下F1键时,会播放wav。按下F2时,当前波形停止,新波形开始。按下

  • 我有一个ffmpeg,它可以合并3个mp4视频,然后另一个命令可以将音频从第一个命令添加到输出文件中。命令如下: vid-1。mp4(没有音频流) 有没有在一个命令中执行此操作?我还想将音频添加到在第一个命令中创建的视频中。这可能吗? “ffmpeg-i vid-1.mp4-i vid-2.mp4-i vid-3.mp4-i audio.mp3”的控制台输出