2013-04-17 2 views
1

J'ai un flux PCM que je voudrais visualiser avec "Visualizer" d'Android mais sans le jouer à haute voix.Android Visualizer sur AudioTrack/MediaPlayer en sourdine

J'ai donc implémenté android-visualizer.

La visualisation est réussie, si j'utilise

audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, 
      AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, 
      fileContent.length, AudioTrack.MODE_STREAM); 
audioTrack.play(); 
mVisualizerView.link(audioTrack); 
.. 
audioTrack.write(fileContent, 0, bytes); 

Mais mon problème est que je ne veux pas vraiment « jouer » mon PCM, je voudrais juste le visualiser. Mes utilisateurs écoutent peut-être de la musique avec leur lecteur multimédia et je ne veux pas les déranger.

Je pensais ok, je peux couper mon AudioTrack ':

audioTrack.setStereoVolume(0.0f, 0.0f); 

mais, malheureusement, il y a aussi plus de visualisation. Je pensais que le Visializer doit ignorer le volume du AudioTrack en raison de SCALING_MODE_NORMALIZED:

définit un mode de capture où l'amplification est appliquée en fonction du contenu des données capturées. C'est le mode Visualiseur par défaut, et est adapté à la visualisation musicale.

La prochaine j'ai essayé n'a pas écrit le PCM dans la piste audio, mais fournissant directement au tiroir:

mVisualizerView.updateVisualizer(fileContent); 

Cela crée une courbe, mais il avait l'air vraiment fou et n'a rien à faire avec ce que je m'attendais (peut-être parce que je fournis stéréo au lieu de mono?).

J'ai également eu aucun succès avec la création de la "forme d'onde" ou les "fft" -data du flux PCM - je viens de me découvrir.

Quelqu'un a une idée?

Répondre

0

Essayez AudioManager.setStreamMute (streamType, état)

+0

Je ne vois pas comment cela aiderait, car cela fait basculer le volume du flux entre 0 et une autre valeur. Le 'AudioFlinger' prend en compte le volume de la piste, le volume du flux et le volume principal lors du calcul du volume final. Donc, cette méthode n'atteindrait pas ce que l'OP veut (obtenir des données non nulles dans le 'Visualizer', mais sans que l'audio soit entendu). – Michael

0

donc je pensais que «ok, je peux couper mon AudioTrack. mais malheureusement, il n'y a plus de visualisation.

C'est exactement comme ça que ça fonctionne. Le AudioFlinger effectue un mixage (où le volume est appliqué) avant d'appliquer des effets (le Visualizer est un effet).

Mais vous n'avez pas vraiment besoin de l'API Visualizer pour ce que vous voulez faire, comme vous l'avez déjà compris. Vous pouvez créer une toile ou une texture OpenGL ES, dessiner des données basées sur vos données PCM à chaque image (60 fps) et les afficher dans l'une des vues de votre application.

Si vous voulez simplement tracer la forme d'onde, ce serait trivial. Disons que vous avez un bitmap de 100 pixels de large que vous voulez dessiner: A l'image N vous prendriez les 735 (44100/60) échantillons commençant à N * 735 et générer 100 points sur ceux-ci (par exemple par linéairement interpolation sur ces 735 échantillons, et mise à l'échelle en fonction de la résolution verticale de votre bitmap). Si vos données PCM sont stéréo, vous pouvez prendre chaque paire d'échantillons aux points d'interpolation et les calculer en moyenne.

Si vous voulez dessiner un spectrogram les choses vont devenir un peu plus compliquées, puisque vous devez d'abord transformer vos données audio du domaine temporel en the frequency domain.

+0

Pour le downvoter: attention à expliquer en quoi cette réponse n'a pas été utile? – Michael