2013-06-28 4 views
1

J'utilise le android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI intention de charger des fichiers musicaux à partir de la carte SD.Comment convertir l'audio de la stéréo en mono dans Android?

Intent tmpIntent1 = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); 
startActivityForResult(tmpIntent1, 0); 

et onActivityResult

Uri mediaPath = Uri.parse(data.getData().toString()); 
MediaPlayer mp = MediaPlayer.create(this, mediaPath); 
mp.start(); 

Maintenant MediaPlayer joue l'audio en stéréo. Existe-t-il un moyen de convertir le fichier musical/audio sélectionné ou la sortie stéréo en mono dans l'application elle-même?

J'ai recherché l'API pour SoundPool et AudioTrack, mais je n'ai pas trouvé comment convertir les fichiers audio en mono. Des applications comme PowerAMP ont ces stéréo < -> Commutateurs mono qui, lorsqu'ils sont pressés, convertissent immédiatement l'audio de sortie en signal mono et inversement, comment font-ils?

+0

Avez-vous le chiffre de chance sur une solution à ce encore? J'ai le même problème ... – dg123

+0

@ dg123 non, je n'ai rien trouvé! –

Répondre

2

Chargez-vous des fichiers .wav ou des données PCM? Si oui, vous pouvez facilement lire chaque échantillon de chaque canal, les superposer et les diviser par la quantité de canaux pour obtenir un signal mono.

Si vous stockez votre signal stéréo sous forme de courts métrages signés intercalées, le code pour calculer le signal mono résultant pourrait ressembler à ceci:

short[] stereoSamples;//get them from somewhere 

    //output array, which will contain the mono signal 
    short[] monoSamples= new short[stereoSamples.length/2]; 
    //length of the .wav-file header-> 44 bytes 
    final int HEADER_LENGTH=22; 

    //additional counter 
    int k=0; 


    for(int i=0; i< monoSamples.length;i++){ 
     //skip the header andsuperpose the samples of the left and right channel 
     if(k>HEADER_LENGTH){ 
     monoSamples[i]= (short) ((stereoSamples[i*2]+ stereoSamples[(i*2)+1])/2); 
     } 
     k++; 
    } 

je l'espère, je suis en mesure de vous aider.

Meilleures salutations, G_J

+0

Les fichiers peuvent être ** n'importe quel fichier audio sur l'appareil de l'utilisateur, mp3 aussi. Une fois que l'utilisateur sélectionne le fichier, j'obtiens le chemin absolu vers le fichier mp3 sur la carte SD. Comment puis-je traiter le fichier maintenant? J'utilise MediaPlayer API pour lire le fichier. Ce que je construis est un peu un lecteur de musique, donc toutes les suggestions pour utiliser une autre API autre que MediaPlayer sont les bienvenues. –

+0

Pour autant que je sache, MediaPlayer, SoundPool et AudioTrack ne proposent pas de méthode pour changer la lecture de stéréo en mono. Je suppose donc que ma réponse ci-dessus est le seul moyen d'y parvenir. Corrige moi si je me trompe. Si les fichiers audio peuvent également être mp3, vous devez les transformer en données PCM, calculer le signal mono et lire via AudioTrack. –

Questions connexes