Jouer plusieurs chansons avec MediaPlayer en même temps: un seul est vraiment jouer
J'ai besoin d'aide avec la lecture de plusieurs pistes audio en même temps dans Android
.
Je suis censé jouer trois pistes audio à exactement le même temps à l'aide de Android.Media.MediaPlayer
.
Hier, j'ai réussi à faire fonctionner le faire :
MediaPlayer track1 = MediaPlayer.create(this, R.raw.track1);
MediaPlayer track2 = MediaPlayer.create(this, R.raw.track2);
MediaPlayer track3 = MediaPlayer.create(this, R.raw.track3);
Comme vous pouvez le voir, j'ai trois distincts instances de MediaPlaye
r ici.
Parce que je me demande, j'ai besoin d'avoir ces MediaPlayer
joué dans un thread d'arrière-plan.
Ici est la partie où je commence le MediaPlayers
:
//let's suppose this code snippet is in a run() method inside a Thread (which is the case)
track1.start();
track2.start();
track3.start();
Si je dis hier, c'est parce que le lendemain, il n'a pas fonctionné comme prévu.
En effet, de départ d'un lecteur multimédia semble à l'arrêt précédent de jouer MediaPlayer.
J'ai testé en mode débogage : clairement, track2.start()
s'arrête track1 du MediaPlayer et suivant le même schéma, track3.start()
s'arrête tack2 du MediaPlayer.
Donc, à la fin, seulement la piste 3 est en cours de lecture, je ne peux pas entendre l'une des pistes précédentes, quels que soient les réglages de volume sont alors que je pouvais clairement entendre avant de : il est censé créer une sorte une ambiance.
Bien sûr, de changer l'ordre dans lequel les pistes sont lancées ne change rien : seul le dernier morceau sera entendu.
Si je dis "entendu" c'est parce que en mode débogage, la vérification de la propriété MediaPlayer.isPlaying
est de retour true
: tous les trois joueurs disent qu'ils jouent, mais un seul peut être entendu... !
Pourquoi le changer ?
Pourquoi avait-il travailler une fois à arrêter de travailler après ?
REMARQUE:
- les fichiers audio ont toutes la même durée d'environ 15 minutes
- les fichiers audio ont été
.mp3
fichiers compressés en.acc
fichiers (à partir de320kbps
à144kbps
) - Je travaille sous
Xamarin Studio
dansC#
mais pour clarety purpouse je m'en tiendrai à petitJava
des extraits de code.
EDIT 1
Selon cette Jouer deux mp3 de la chanson en même temps ma solution devrait fonctionner, non ?
OriginalL'auteur Mackovich | 2014-10-15
Vous devez vous connecter pour publier un commentaire.
J'ai obtenu ce que vous cherchez à l'aide d'un CyclicBarrier instance et un intérieur implémentation de la classe.
Exemple:
Vous auriez du l'utiliser comme ceci:
Si vous avez eu la condition qu'il soit utilisable pour n'importe quel nombre de joueurs de médias, vous pouvez facilement le mettre en œuvre - mes besoins il suffit d'appeler pour deux.
Je me rends compte que cette question est ancienne, mais cette page est là que j'ai trouvé moi-même en quête d'une solution, donc j'espère que cela aide quelqu'un coincé sur ce problème dans l'avenir.
Je ne suis pas sûr de ce que tu veux dire; pouvez-vous développer? La réponse elle-même montre comment instancier les
SyncedCommandService
praticable.Je veux dire quand je l'instance de la SyncedCommandService objet. Mon problème est que je ne pouvais pas le faire dans la classique d'instance de classe manière: SyncedCommandService syncedCommandService = new SyncedCommandService(); becasuse il n'a pas défini un constructeur vide, donc, pour le faire fonctionner, j'ai dû l'ajouter dans votre code de classe ce: public SyncedCommandService(){}
À droite, il n'y a pas de constructeur par défaut dans mon exemple parce que c'est spécifique à mon cas d'utilisation et n'a pas été nécessaire :]
OriginalL'auteur Carter Hudson
Bien, je crois que j'ai trouvé ce que je pourrais appeler une "solution temporaire".
Le problème avec ceci est que la
create()
méthode crée un écart notable quand les chansons sont en train d'être joué.Donc ce n'est pas ça.
Après un certain temps, j'ai essayé le suivant :
Que whay, les chansons sont plus synchrones. Je peux encore entendre un très faible écart, mais c'est bien mieux.
J'ai trouvé cette solution assez étrange, ainsi que laid.
Sauf si quelqu'un a une autre idée, je m'en tiendrai à cette solution.
play()
méthode - voulez-vous direstart()
?C'est exact, en effet. Je vais mettre à jour ma réponse immédiatement.
Même cette solution ne fonctionne pas pour moi - je peux encore entendre seulement l'une des pistes. Fait intéressant, il n'est pas toujours le même - cela semble aléatoire.
eh bien récemment, je travaillais sur un autre projet pour tester le Bluetooth audio streaming via le protocole A2DP avec jusqu'à cinq pistes à la fois. Curieusement, je n'ai pas de tomber sur ce problème! Je voudrais également ajouter que ma question initiale a eu lieu dans un C# Xamarin.Projet Android alors que mon projet actuel est de la pure Java Android 😉
ces problèmes dépend de l'appareil. j'ai fait face sur certains appareils, tandis que d'autres travaillent bien.
OriginalL'auteur Mackovich
Comme Andrey Nikishaev déjà écrit dans un commentaire, il semble que certains appareils ont des problèmes à l'aide de plusieurs MediaPlayers en même temps. Pendant que l'un était en train de jouer sur mon Nexus 5, il a travaillé sur ma Moto G4 (mais toujours à avoir de courtes pauses pendant la lecture). Deux fonctionnant avec Android 6.0.1.
Je vous suggérons d'utiliser le ExoPlayer pour ce cas d'utilisation à la place. Il a bien fonctionné pour moi, au moins sur mes deux appareils.
OriginalL'auteur Alex
J'ai converti mon mp3 en ogg fichier audio (à l'aide d'Audacity) et je suis en mesure d'utiliser 2 Mediaplayer istances et d'écouter l'audio mixte.
Je n'ai pas essayé, il est possible pour les plus de 3.
OriginalL'auteur Boris Karloff
hi essayer ci-dessous de code, il va travailler c'est la chanson wont stop vous suffit de sélectionner la chanson de spinner et cliquez sur le bouton démarrer, puis sélectionnez suivant chanson de spinner et cliquez sur démarrer il va travailler.
OriginalL'auteur Akash Manubansh