2011-08-19 4 views
1

Notre projet actuel nécessite que nous envoyions un fichier audio au serveur, puis que nous utilisions le fichier audio pour un calcul ultérieur. En utilisant l'API audio Java, j'ai été capable de capturer l'enregistrement et de l'enregistrer sous forme de fichier wav dans mon système. Ensuite, afin de passer le wav audio au serveur, j'utilise Apache Commons HttpClient pour envoyer une requête au serveur. (J'utilise InputstreamEntity fourni par apache et envoie les données sous la forme d'un bloc).Obtention du fichier wav à partir de ServletInputStream

Le problème apparaît lorsque j'essaie de recréer/récupérer le fichier wav sur le serveur. Je comprends que je devrais utiliser l'API AudioSystem.write pour créer le fichier wav (exactement comme ce qui a été fait sur mon système). Cependant ce que j'observe c'est que même si le fichier est créé, il ne joue pas (j'utilise vlc media player pour le tester FYI). J'ai cherché dans Google des exemples de codes et j'ai essayé de l'implémenter, mais je n'arrive pas à le lire une fois le fichier créé.

Les extraits de code exemple indique les approches que je l'ai essayé:

//****************************************************************** 

try { 
InputStream is = request.getInputStream(); 
FileOutputStream fs = new FileOutputStream("output123.wav"); 
byte[] tempbuffer = new byte[4096]; 
int bytesRead; 
while((bytesRead=is.read(tempbuffer))!=-1) 
{ 
fs.write(tempbuffer, 0,bytesRead); 
} 
is.close(); 
fs.close(); 
AudioInputStream inputStream =AudioSystem.getAudioInputStream(newFile("output123.wav")); 
int numofbytes = inputStream.available();   
byte[] buffer = new byte[numofbytes]; 
inputStream.read(buffer); 
int bytesWritten = AudioSystem.write(inputStream, AudioFileFormat.Type.WAVE,new File("outputtest.wav")); 
System.out.println("written"+bytesWritten); 

Approche 2

InputStream is = request.getInputStream(); 
System.out.println("inputStream obtained : "+is.toString()); 
ByteArrayInputStream bais = null; 
byte[] audioBuffer = IOUtils.toByteArray(is); 
System.out.println(" is audioBuffer empty? : length = ? "+audioBuffer.length); 
try { 
AudioFileFormat ai = AudioSystem.getAudioFileFormat(is); 
System.out.println("ai bytelength ? "+ai.getByteLength()); 
System.out.println("ai frame length = "+ai.getFrameLength()); 
Set<Map.Entry<String,Object>> audioProperties = ai.getFormat().properties().entrySet(); 
System.out.println("entry set is empty ? "+audioProperties.isEmpty());   
for(Map.Entry me : audioProperties){ 
System.out.println("key = "+me.getKey()); 
System.out.println("value ="+me.getValue());}  
bais = new ByteArrayInputStream(audioBuffer); 
AudioInputStream ais = new AudioInputStream(bais, new AudioFormat(8000,8,2,true,true), 2); 
AudioSystem.write(ais, AudioFileFormat.Type.WAVE,new File("testtest.wav")); 

//************************************************************************************* 

Les propriétés audioFormat tous se sont avérés être nulle. Ces valeurs nulles donnent-elles le problème? Donc, tout en créant le fichier wave sur le serveur, j'ai essayé de définir les propriétés manuellement une fois de plus. Mais même alors, le fichier wav ne jouerait pas.

J'ai aussi essayé plusieurs approches déjà mentionnées sur ce site, mais d'une manière ou d'une autre elles ne fonctionnent pas. Je suis sûr qu'il me manque quelque chose, mais je suis incapable de déterminer exactement le problème.

Serait vraiment utile, si vous les gars pouvez indiquer comment faire la conversion de ServletInputStream à obtenir un wav.

P.S (1) Je sais que le code est minable, parce que j'ai été dans une situation d'essai et d'erreur pendant un certain temps maintenant. Mais je donnerai plus de détails sur les approches si nécessaire. 2) Excusez-moi pour la maladresse, ceci se trouve être mon premier message ..)

Répondre

0

ce n'est pas comment vous copiez un flux (de l'approche 1). vous avez le bon code pour copier un flux juste au-dessus de cette .:

int numofbytes = inputStream.available();   
byte[] buffer = new byte[numofbytes]; 
inputStream.read(buffer); 
+0

Merci pour la réponse les gars, mais mon problème est, j'ai besoin de créer un fichier wav dans le serveur en utilisant ces flux d'octets. Bien que le fichier soit créé, il ne joue pas. Je suppose que pour créer le wav je devrais utiliser soit un AudioSystem.write ou un équivalent api.Puis-je simplement écrire les octets dans un fichier et le nommer avec une extension .wav .. Je ne pense pas que cela fonctionnerait. Il serait de l'aide de gr8 si vous les gars pouvez m'aider avec un pseudo code .. –

+0

@ user902423 - pourquoi pensez-vous que ma réponse n'est pas pertinente à ce que vous essayez d'accomplir? Si vous ne pouvez pas copier le flux correctement, cela ne vous servira à rien. – jtahlborn

0

Si tout serveur veut faire est d'obtenir les données et écrire dans un fichier, vous ne besoin d'utiliser l'une des l'API audio: traite simplement les données comme un flux d'octets. Par conséquent, la partie de l'approche 1 précédant toute mention de AudioInputStream devrait suffire.

0

Bien que l'approche choisie ne soit pas la solution parfaite, en raison des contraintes de temps, j'ai adopté une approche plus simple. En utilisant java.util.zip je l'ai simplement compressé et envoyé au serveur, puis j'ai écrit une couche dans laquelle le fichier est décompressé. Puis j'ai supprimé les fichiers zip. On dirait une solution immature (bcos le défi original était d'envoyer le fichier audio). Maintenant, j'engage un surcoût de compresser les fichiers, mais le transfert de fichiers serait relativement plus rapide. Merci pour votre aide les gars.

Questions connexes