e ai galera, blz?
Eu preciso juntar 2 arquivos audio wav em um só, utilizando java sound ou jmf.
um dos arquivos possui voz e o outro possui música, e eu preciso inserir o conteúdo do arquivo de música como fundo do arquivo de voz, fazendo uma espécie de mixagem.
muito obrigado.
E a mixagem precisa mesmo ser no seu software? Esse tipo de trabalho é mais fácil fazer em um software externo. Até porque, logo surgirão outros pedidos como baixar o volume de um dos arquivos, atrasar sua execução, etc.
Há outras opções para isso, como reproduzir os dois arquivos ao mesmo tempo, em threads separadas, em canais de áudio diferentes. O usuário ouvirá como se fossem dois arquivos mixados.
É possível misturar os dois arquivos. Mas não é uma tarefa muito trivial, principalmente se estiverem em formatos de áudio e taxas de amostragem diferentes.
[quote=ViniGodoy]E a mixagem precisa mesmo ser no seu software? Esse tipo de trabalho é mais fácil fazer em um software externo. Até porque, logo surgirão outros pedidos como baixar o volume de um dos arquivos, atrasar sua execução, etc.
Há outras opções para isso, como reproduzir os dois arquivos ao mesmo tempo, em threads separadas, em canais de áudio diferentes. O usuário ouvirá como se fossem dois arquivos mixados.
É possível misturar os dois arquivos. Mas não é uma tarefa muito trivial, principalmente se estiverem em formatos de áudio e taxas de amostragem diferentes.[/quote]
ViniGodoy muito obrigado pela resposta.
Eu já utilizei o audacity é uma ferramente muito boa.
Mas realmente eu preciso que seja gerado através da aplicação, os formatos de audio são os mesmos e as taxas também.
Se puder ajudar muito obrigado.
Se seus samples estão exatamente no mesmo formato, aí fica fácil.
Basta somar os dois samples do canal de áudio, truncando sempre no valor máximo da sua amostragem. Esses dados (o valor máximo e a quantidade de samples) você obtém da própria classe AudioFormat, do Java.
Se quiser diminuir/aumentar a altura do volume de um dos sons, basta multiplicar pelo pelo fator desejado (0 para sem som, 1 para igual ao som, 2 para o dobro da altura).
Procure por algoritmos de processamento de sinais digitais, que é exatamente o que você precisa. Provavelmente também deve haver APIs prontas para isso, mas confesso que nunca usei.
Abaixo, um exemplo de como fazer eco (no caso, faz-se o mixing do som com ele mesmo. Guardando para isso parte do som disparado num buffer):
http://www.java2s.com/Code/Java/Development-Class/Anexampleofplayingasoundwithanechofilter.htm
Muito obrigado pela orientação.
Encontrei na net a classe MixingAudioInputStream.java que me ajudou a realizar este trabalho, localizada no endereço http://www.jsresources.org/examples/MixingAudioInputStream.java.html
Utilizando esta classe ficou facil:
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;
public class testeMixingAudioInputStream {
/**
* @param args
*/
public static void main(String[] args) {
try
{
List audioInputStreamList = new ArrayList();
File soundFileUm = new File("c:\\somDeVoz.wav");
AudioInputStream audioInputStreamEntradaUm = AudioSystem.getAudioInputStream(soundFileUm);
AudioFormat audioFormat = audioInputStreamEntradaUm.getFormat();
audioInputStreamList.add(audioInputStreamEntradaUm);
File soundFileDois = new File("c:\\somDeFundo.wav");
AudioInputStream audioInputStreamEntradaDois = AudioSystem.getAudioInputStream(soundFileDois);
audioInputStreamList.add(audioInputStreamEntradaDois);
AudioInputStream audioInputStreamSaida = new MixingAudioInputStream(audioFormat, audioInputStreamList);
File outputFile = new File("c:\\somDeVozComSomDeFundo.wav");
AudioSystem.write(audioInputStreamSaida , AudioFileFormat.Type.WAVE, outputFile);
} catch (UnsupportedAudioFileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}