микширование двух аудиофайлов с помощью микшера - PullRequest
3 голосов
/ 10 февраля 2012

как я могу смешать два аудиофайла в один файл, чтобы результирующий файл мог воспроизводить два файла одновременно?пожалуйста помогите .. вот что я делаю, это то, что я беру два файла и объединяю их в другой файл ... но я хочу, чтобы файл воспроизводился одновременно ..

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

Ответы [ 4 ]

1 голос
/ 10 февраля 2012

Я только что нашел ссылку http://www.jsresources.org/examples/AudioConcat.html

Похоже, он это делает .. Исходный код можно найти на странице! Надеюсь, это поможет вам.

0 голосов
/ 17 июля 2017

Вот класс, который я сделал:

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

Надеюсьпомогает.

0 голосов
/ 11 июня 2013

То, что сказал @Восси, правда.Используйте jresources.org, чтобы помочь использовать.Вы можете использовать их пример: http://www.jsresources.org/examples/MixingAudioInputStream.java.html. Для пакета org.tritonus.share.sampled.TConversionTool, если у вас возникли проблемы с использованием их библиотеки, загрузите их исходный код: это открытый код и попробуйте его использовать.Я попробовал это, и это сработало для меня: D http://sourceforge.net/projects/tritonus/files/ Я благодарен за этих парней!

0 голосов
/ 10 февраля 2012

Вам необходимо прочитать образец за образцом из обоих потоков, выполнить добавление этих образцов (будьте осторожны с переполнением) и затем сохранить новый добавленный образец в новый AudioInputStream.Отметьте здесь , чтобы узнать, как преобразовать OutputStream в InputStream, когда вы сможете сделать еще один AudioInputStream и сохранить свой аудиофайл.

...