2010-05-01 7 views
16

Pour mon application, j'ai besoin d'enregistrer de l'audio à partir de MIC sur un téléphone Android, et l'envoyer sur TCP à l'autre téléphone android, où il doit être joué. J'utilise la classe AudioRecord et AudioTrack. Cela fonctionne très bien avec un fichier - écrivez de l'audio dans le fichier en utilisant DataOutputStream, et lisez en utilisant DataInputStream. Toutefois, si j'obtiens le même flux à partir d'une socket à la place d'un fichier et que j'essaie d'écrire dessus, j'obtiens une exception. Je n'arrive pas à comprendre ce qui pourrait mal se passer. Toute aide serait grandement appréciée.Android: Streaming audio sur Sockets TCP

EDIT: Le problème est le même même si j'essaie avec des tailles de tampon plus grandes (65535 octets, 160000 octets).

Voici le code:

Enregistreur:

int bufferSize = AudioRecord.getMinBufferSize(11025, , AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); 

AudioRecord recordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize); 

byte[] tempBuffer = new byte[bufferSize]; 

recordInstance.startRecording(); 

while (/*isRecording*/) { 
     bufferRead = recordInstance.read(tempBuffer, 0, bufferSize); 
     dataOutputStreamInstance.write(tempBuffer); 
} 

Le DataOutputStream est obtenue ci-dessus:

BufferedOutputStream buff = new BufferedOutputStream(out1); //out1 is the socket's outputStream 
DataOutputStream dataOutputStreamInstance = new DataOutputStream (buff); 

Pourriez-vous s'il vous plaît jeter un oeil, et laissez-moi savoir quel est-il que je pourrais faire mal ici?

Merci,

+0

Avez-vous réussi à envoyer le fichier audio à d'autres appareils? – B770

Répondre

8

J'ai obtenu ce travail, avec un peu d'aide, et seulement partiellement.

J'ai commencé avec le code à http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html, changé les flux de fichiers en flux de Socket, et changé le isAvailable() en if (inputStream.read (byteArray)! = -1).

La diffusion en direct de l'audio sur TCP est en cours.

Cependant,

Tout ce que j'entends à l'autre bout est le bruit, et je suis maintenant la chasse pour voir correct de paramètres pour AudioRecorder et AudioTrack - la fréquence, configuration de canal et l'encodage, la source audio, etc.

Si vous avez une idée à ce sujet, s'il vous plaît faites le moi savoir.

Merci,

EDIT: Ce fut une erreur stupide de ma part. En plus de tout ce que j'ai dit ci-dessus, utilisez inputStream du côté du lecteur et outputStream du côté de l'enregistreur, et des tableaux d'octets au lieu de shorts et cela fonctionnera.:)

+0

Bien que je creuse un vieux fil .. Pouvez-vous s'il vous plaît mettre votre code (changements que vous avez fait) ?? –

+0

Bonjour Chaitanya, Comment avez-vous fait avec le même code? Je ne suis pas capable de faire du streaming live de l'audio sur TCP. Pouvez-vous me guider? – iMOBDEV

1

sans connaître l'exception spécifique que vous obtenez, il est difficile de savoir exactement ce qui ne va pas. Il serait également utile de voir le code que vous utilisez pour créer out1 (c'est-à-dire votre code de socket).

Quelque chose que vous pourriez faire attention à est la quantité de données lues de recordInstance.read(); Il se peut que vous n'obteniez pas un bloc entier de données de taille bufferSize, vous devez donc prendre soin d'écrire uniquement les octets 0 à bufferRead-1 sur votre socket de sortie.

+0

Merci beaucoup pour la réponse. – Chaitanya