2012-02-10 4 views
3

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

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

См. Также http://stackoverflow.com/questions/26265575/playing-multiple-byte-arrays-simultaneous-in-java/ –

ответ

1

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

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

+1

он использует пакет, который отсутствует в netbeans. Так что мне нужен другой источник. import org.tritonus.share.sampled.TConversionTool; это пакет –

0

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

+0

Я должен играть оба файла одновременно ... могу ли я сделать это таким образом? я не уверен .. PLZ помочь мне .. thx –

+0

Извините за поздний ответ. Это характер звука. Сэмплинг - это среднее значение для преобразования физического звука в числа. Когда вы слышите два звука одновременно, физика и математика говорят, что вы фактически добавляете номера первого звука с номерами второго звука. Теперь ухо само по себе работает как подушка, поэтому после добавления он фактически снижает объем суммы. Вы можете или не можете выполнить это «опускание». – RockyMM

+0

Или, проще, вы можете использовать 'Thread', например [здесь] (http://www.anyexample.com/programming/java/java_play_wav_sound_file.xml) и [здесь] (http://stackoverflow.com/вопросы/3093687/игра-WAV-файлы-один-после--другой-в-Java). – RockyMM

0

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

0

Вот это класс я сделал:

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 

Надеется, что это помогает.

Смежные вопросы