2013-07-29 4 views
0

J'essaie de créer une application de communication en temps réel (comme SIP, Skype, etc.) qui utilise l'implémentation d'OpenSL ES d'Android. La chose est, j'ai besoin de jouer un fichier audio WAV sur la communication (je le fais avec MediaPlayer en Java).Android OpenSL ES + MediaPlayer: Comportement très incohérent entre les appareils lors de l'utilisation du flux VOICE

Bien sûr, mediaplayer fonctionne correctement lorsque OpenSL ES n'est pas en cours d'exécution. Mais quand c'est le cas, tout l'enfer se déchaîne: le résultat est fortement incohérent entre les appareils.

  • Le Nexus 7 (4.2.2): Le wav joue comme il devrait
  • Le Nexus 4 (4.2.2) & Galaxy S3 (4.1.2): Le wav joue très bas (même au jeux de volume à son maximum)
  • Galaxy S4 (4.2.2): Le wav joue très fort et saturé (même les jeux de volumes à son minimum)

J'ai créé un example project pour démontrer cette question , si vous jouez le son (bouton pweeet) avant de démarrer le moteur, cela fonctionne. Si vous le lisez après, cela dépend de l'appareil.

Voici mes observations:

  • Dans OpenSL ES, si seul le lecteur fonctionne ou de l'enregistreur, tout fonctionne comme prévu. C'est la combinaison du lecteur & qui fait le bogue (dans MainActivity.java, commentez simplement StartPlayer() [l.47] ou StartRecorder() [l.48] pour voir ça).
  • Si je désactive le lecteur en file d'attente (dans Audio.cpp, commentez (* playerBufferQueue) -> Enqueue [l.78-80]) tout fonctionne comme prévu.
  • Si je ne mets pas OpenSL ES en lecture sur le flux vocal (Dans Audio.cpp, comment (* playerConfig) -> SetConfiguration [l.146-187]) tout fonctionne comme prévu.

Bien sûr, rien est au-dessus d'une solution que je dois ...

  • enregistrement de OpenSL ES comme une communication vocale
  • de jeu de OpenSL ES dans le flux vocal
  • play de MediaPlayer dans les médias Stream

... tous en même temps. Finalement, je dois préciser que, dans le Galaxy S4, quand je met en file d'attente que j'ai reçu du réseau, OpenSL ES le joue tellement fort et saturé que l'application est inutilisable. Donc, je ne pense pas que le problème est du côté de MediaPlayer Java.

+0

Juste quelques précisions: L'audio WAV est destiné à être joué localement (c'est-à-dire pas envoyé à l'autre partie)? Quel mode audio utilisez-vous (NORMAL, IN_CALL, IN_COMMUNICATION)? Avez-vous activé le mode haut-parleur, et si oui, le comportement change-t-il si vous avez un casque filaire connecté? – Michael

+0

Oui, l'audio WAV est destiné à être joué localement. Je n'ai activé aucun mode audio. Je vais tester avec un casque et vous tenir au courant. –

+0

OK, j'ai mis le mode audio IN_COMMUNICATION, et ... Il l'a résolu :) Merci beaucoup! –

Répondre

0

Grâce au commentaire de Michael, j'ai résolu mon problème en réglant le mode audio IN_COMMUNICATION.

Questions connexes