【问题标题】:mixing two audio file using mixer使用混音器混合两个音频文件
【发布时间】:2012-03-02 20:48:02
【问题描述】:

如何将两个音频文件混合到一个文件中,以便生成的文件可以同时播放两个文件?请帮助..这里我正在做的是我正在获取两个文件并将它们连接到另一个文件中..但我希望同时播放该文件..

    private void saveAudio1() {
    try {                                      

        AudioInputStream clip1 = AudioSystem.getAudioInputStream(file1);
        AudioInputStream clip2 = AudioSystem.getAudioInputStream(file2);
        Collection list=new ArrayList();

        AudioInputStream appendedFiles =
                new AudioInputStream(
                new SequenceInputStream(clip1, clip2),
                clip1.getFormat(),
                clip1.getFrameLength() + clip2.getFrameLength());
        if (dlgOpenFile == null) {
            dlgOpenFile = new FileDialog(this, "Save As...", FileDialog.SAVE);
        }
        if (cfgJMApps != null) {
            nameFile = cfgJMApps.getLastOpenFile();
        }
        if (nameFile != null) {
            dlgOpenFile.setFile(nameFile);
        }

        dlgOpenFile.show();
        nameFile = dlgOpenFile.getFile();
        if (nameFile == null) {
            return;
        }

        nameFile = dlgOpenFile.getDirectory() + nameFile;
        if (cfgJMApps != null) {
            cfgJMApps.setLastOpenFile(nameFile);
        }


        AudioSystem.write(appendedFiles,
                AudioFileFormat.Type.WAVE,
                new File(nameFile));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

【问题讨论】:

标签: java audio javasound mixer


【解决方案1】:

我刚刚找到了一个链接 http://www.jsresources.org/examples/AudioConcat.html

好像是他做的。。源码可以在网页上找到!希望对您有所帮助。

【讨论】:

  • 他正在使用 netbeans 中不存在的包。所以我需要另一个来源.. import org.tritonus.share.sampled.TConversionTool;这是包裹
【解决方案2】:

您需要从两个流中逐个读取样本,执行这些样本的添加(小心溢出),然后将新添加的样本存储到新的AudioInputStream。查看here 了解如何将OutputStream 转换为InputStream,届时您将能够制作另一个AudioInputStream 并保存您的音频文件。

【讨论】:

  • 我应该同时播放这两个文件...我可以这样做吗?我不确定..请帮助我..谢谢
  • 很抱歉回答迟了。这是声音的本质。采样是将物理声音转换为数字的方法。当你同时听到两个声音时,物理学和数学说你实际上将第一个声音的数字与第二个声音的数字相加。现在,耳朵本身就是一个垫子,所以加起来之后它实际上降低了总和的音量。您可能会也可能不会执行“降低”。
  • 或者,更简单的是,您可以使用Threads,例如herehere
  • 您可以对所需数量的频道进行交错,并将其全部播放到一个 SourceDataLine
【解决方案3】:

@Vossi 说的是真的。使用 jresources.org 来帮助使用。您可以使用他们的示例:http://www.jsresources.org/examples/MixingAudioInputStream.java.html。对于 org.tritonus.share.sampled.TConversionTool 包,如果您在使用他们的库时遇到问题,请下载他们的源代码:它是开源的,并尝试使用它。我试过了,它对我有用 :D http://sourceforge.net/projects/tritonus/files/ 我很感激这些人!

【讨论】:

    【解决方案4】:

    这是我做的一个类:

    class MixedSound extends Thread {
        protected AudioFormat format; //Both streams must have same format
        protected AudioInputStream sound1;
        protected AudioInputStream sound2;
        protected static SourceDataLine ausgabe;
        protected DataLine.Info data;
    
        public MixedSound(String path1, String path2) {
            try {
            sound1 = AudioSystem.getAudioInputStream(new File(path1));
            sound2 = AudioSystem.getAudioInputStream(new File(path2));
            format=sound1.getFormat(); //I assume both streams have same format
            data=new DataLine.Info(SourceDataLine.class,format);
            ausgabe=(SourceDataLine) AudioSystem.getLine(data);
            } catch (UnsupportedAudioFileException | IOException | LineUnavailableException bug) {
                System.err.println(bug);
            }
        }
        public synchronized void play() throws IOException, LineUnavailableException {
            ausgabe.open(format,1024);
            ausgabe.start();
            byte[] buffer1=new byte[1024];
            byte[] buffer2=new byte[1024];
            byte[] mixed=new byte[1024];
            int bytes_sound1=sound1.read(buffer1,0,buffer1.length);
            int bytes_sound2=sound2.read(buffer2,0,buffer2.length);
            while (bytes_sound1 != -1 || bytes_sound2 != -1) {
                for (int i=0; i < mixed.length; i++) {
                    mixed[i]=(byte)Math.min(0.999f,((float)buffer1[i]+(float)buffer2[i])); //Mix them
                }
                ausgabe.write(mixed, 0, Math.max(bytes_sound1, bytes_sound2));
                buffer1=new byte[1024]; //Clean buffer
                buffer2=new byte[1024]; //Clean buffer
                bytes_sound1=sound1.read(buffer1,0,buffer1.length);
                bytes_sound2=sound2.read(buffer2,0,buffer2.length);
            }
            ausgabe.drain();
            ausgabe.close();
        }
        @Override
        public synchronized void run() {
            try {
                play();
            } catch (IOException | LineUnavailableException ex) {
                System.err.println(ex);
            }
        }
    }
    

    它通过增加音量来混合两种声音。

    这样使用它:

    MixedSound sound=new Sound("sound1.wav","sound2.wav");
    sound.start(); //Play it
    System.out.println("Started playing sound"); //Do stuff at same time
    

    希望对你有帮助。

    【讨论】:

    • 从哪里获取 AudioSystem.getAudioInputStream ?
    • 很抱歉无法告诉您确切的图书馆名称 ATM。你可以用谷歌搜索它,但我建议使用 IDE,比如 NetBeans,它会帮助你进行适当的导入;)
    • @AhmadArslan 你需要做import javax.sound.sampled.AudioSystem;(搜索“java AudioSystem”,see the docs)。
    猜你喜欢
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    相关资源
    最近更新 更多