Le streaming d'Android MediaPlayer s'arrête lors du changement de réseau

Je diffuse de l'audio en utilisant MediaPlayer sur Android.

Lorsque le périphérique passe de Wi-Fi au réseau cellulaire ou vice versa, MediaPlayer arrête la lecture.

  • Obtenir une liste de sonneries disponibles dans Android
  • Cordova vidéo / audio ne jouera pas à partir du fichier cdv: // urls après la mise à jour vers 3.3.0
  • Comment obtenir uniquement la fréquence audio et les décapsules du projet FFTBasedSpectrumAnalyzer?
  • Enregistrez-vous en tant que lecteur de musique et écoutez une chanson
  • Android: plusieurs pistes audio dans un VideoView?
  • MediaPlayer bégaie au début de la lecture mp3
  • En règle générale, il y a quelques secondes d'audio dans le tampon, de sorte que la lecture ne cesse pas immédiatement.

    Idéalement, je voudrais ramasser le flux pour une lecture ininterrompue, mais je ne vois pas comment le faire.

    Je travaille avec les deux fichiers mp3 hébergés sur le serveur et un flux de diffusion en direct.

  • Reproduction de vidéo cryptée à l'aide d'ExoPlayer
  • La lecture vidéo donne un écran noir mais avec un son
  • Pourquoi cela prend-il si longtemps que MediaPlayer d'Android prépare certains flux en direct pour la lecture?
  • Retard dans l'audio en continu
  • Android Socket Issue sur Samsung Galaxy S4 (SGS4)
  • L'erreur de MediaPlayer (1, -1004) aka MEDIA_ERROR_IO essayant de diffuser de la musique sur Samsung S3
  • 4 Solutions collect form web for “Le streaming d'Android MediaPlayer s'arrête lors du changement de réseau”

    Du point de vue des serveurs, la modification du mode réseau de WiFi vers 3G (visa versa) ressemblera à une toute nouvelle connexion à partir d'une IP séparée (client).

    Si le serveur que vous téléchargez ne prend pas en charge le suivi du flux (par exemple, le nombre de secondes, la séquence, l'octet) (contrairement aux serveurs multimédia), il faudra recommencer à servir votre mp3 à partir de 0 octet.

    Si votre URL pointe sur un fichier MP3 situé sur un serveur HTTP standard, votre situation sera à prévoir. Vous devriez envisager d'utiliser un serveur de diffusion multimédia, afin que vous puissiez reprendre le téléchargement / diffusion à votre choix. Lorsque vous recevez l'intention de perdre / reprendre la connexion, vous pouvez indiquer votre lecteur multimédia à la nouvelle URL avec la position du fichier dans l'URL (p. Ex. Secondes = 19, octets = 57365).

    Je ne sais pas si cela vous aide, mais cela explique un peu ce qui se passe «derrière les coulisses».

    Essayez de définir votre setOnCompletionListener et setOnErrorListener . En prepareAsync() avec un flux en direct, vous pouvez simplement appeler prepareAsync() nouveau et cela va redémarrer le flux. Il n'y a aucun moyen gracieux de faire cela vraiment, sauf si vous écrivez votre propre cadre médiatique.

    Vous pouvez également écouter en vous onError() pour MEDIA_ERROR_SERVER_DIED vous pouvez ensuite désactiver la prepareAsync() nouveau.

    Vous constaterez que MediaPlayer sera soit Erreur, soit Terminé. Si vous gérez ces deux rappels, vous pouvez tout recommencer à redéfinir le flux lors d'un changement de réseau, comme pour une lecture fluide … Cela requiert une image média personnalisée, car l'Android est plutôt pénible.

    Je ne sais pas pourquoi votre lecteur multimédia s'arrête, mais peut-être que vous pouvez ajouter une méthode onReceive et mettre "mp.start ()" dans la méthode pour le redémarrer.
    Android, Comment gérer le changement de réseau (de GPRS à Wi-fi et vice-versa) lors du sondage sur les données

    Vous devrez peut-être créer une classe distincte, mais cela devrait expliquer comment créer une méthode appelée lorsque vous changez de réseau, auquel cas vous pouvez appeler "mp.start ()" pour reprendre la lecture (en supposant que mp est votre MediaPlayer).
    Cela suppose, bien sûr, que votre MediaPlayer ne soit mis en pause que lorsque vous commutez des réseaux, pas arrêté.

    Comme le dit Vidar, le rétablissement de la connexion sera traité par le serveur en tant que nouvelle connexion.

    Il semble que je dois doubler la lecture audio, ce qui signifie la construction d'un lecteur multimédia personnalisé. Cela peut fournir de l'audio continu, mais il saute quand vous écoutez un flux en direct.

    Le fichier MP3 est un peu plus facile car je peux connaître la position de lecture. Pas tellement avec le flux en direct.

    Comme le dit Gmaster, j'aurai besoin d'un récepteur de diffusion pour établir une nouvelle connexion lorsque le réseau change. Le tampon audio de la connexion réseau précédente devrait continuer à lire alors qu'un nouveau tampon audio est rempli via la nouvelle connexion.

    Lorsque le nouveau tampon est suffisant pour démarrer la lecture, je peux lui transférer la lecture. Si je transmet un fichier, avec un support serveur et un peu de travail, je peux m'assurer que les données de position de lecture actuelles se trouvent dans les deux tampons et basculer de façon transparente.

    Étant donné que les tampons de flux en direct ne peuvent pas être synchronisés, il y aura inévitablement un problème lors de leur commutation.

    Un tampon plus grand évite le décrochage audio si la connexion prend un certain temps pour établir, mais retarde le premier démarrage de la lecture. Un fichier MP3 peut être téléchargé et remplissez le tampon plus rapidement que le temps réel, mais le flux en direct sera tampon en temps réel.

    Chris.Jenkins mentionne certaines méthodes MediaPlayer qui peuvent aider à souligner que cela semble avoir besoin d'un cadre personnalisé. Il devra gérer les conditions qu'il mentionne et les autres.

    Si je peux faire paraître joli, je le publierai ici. Je vais laisser la question ouverte.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.