web-dev-qa-db-fra.com

Streaming audio depuis une URL dans Android en utilisant MediaPlayer?

J'ai essayé de diffuser des fichiers MP3 via http en utilisant la classe MediaPlayer d'Android. La documentation me suggèrerait que cela devrait être aussi simple que:

MediaPlayer mp = new MediaPlayer();
mp.setDataSource(URL_OF_FILE);
mp.prepare();
mp.start();

Cependant, je reçois ce qui suit à plusieurs reprises. J'ai aussi essayé différentes URL. S'il vous plaît ne me dites pas que le streaming ne fonctionne pas sur les mp3.

E/PlayerDriver(   31): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported
W/PlayerDriver(   31): PVMFInfoErrorHandlingComplete
E/MediaPlayer(  198): error (1, -4)
E/MediaPlayer(  198): start called in state 0
E/MediaPlayer(  198): error (-38, 0)
E/MediaPlayer(  198): Error (1,-4)
E/MediaPlayer(  198): Error (-38,0)

Toute aide très appréciée, merci S

85
Pandalover

lecteur multimédia simple avec exemple de diffusion. Pour la partie xml, vous avez besoin d’un bouton avec l’identifiant button1 et de deux images dans votre dossier pouvant être dessiné, portant les noms button_pause et button_play. N'oubliez pas d’ajouter l’autorisation Internet dans votre manifeste.

public class MainActivity extends Activity {
private Button btn;
/**
 * help to toggle between play and pause.
 */
private boolean playPause;
private MediaPlayer mediaPlayer;
/**
 * remain false till media is not completed, inside OnCompletionListener make it true.
 */
private boolean intialStage = true;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn = (Button) findViewById(R.id.button1);
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    btn.setOnClickListener(pausePlay);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

private OnClickListener pausePlay = new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        // TODO Auto-generated method stub

        if (!playPause) {
            btn.setBackgroundResource(R.drawable.button_pause);
            if (intialStage)
                new Player()
                        .execute("http://www.virginmegastore.me/Library/Music/CD_001214/Tracks/Track1.mp3");
            else {
                if (!mediaPlayer.isPlaying())
                    mediaPlayer.start();
            }
            playPause = true;
        } else {
            btn.setBackgroundResource(R.drawable.button_play);
            if (mediaPlayer.isPlaying())
                mediaPlayer.pause();
            playPause = false;
        }
    }
};
/**
 * preparing mediaplayer will take sometime to buffer the content so prepare it inside the background thread and starting it on UI thread.
 * @author piyush
 *
 */

class Player extends AsyncTask<String, Void, Boolean> {
    private ProgressDialog progress;

    @Override
    protected Boolean doInBackground(String... params) {
        // TODO Auto-generated method stub
        Boolean prepared;
        try {

            mediaPlayer.setDataSource(params[0]);

            mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {
                    // TODO Auto-generated method stub
                    intialStage = true;
                    playPause=false;
                    btn.setBackgroundResource(R.drawable.button_play);
                    mediaPlayer.stop();
                    mediaPlayer.reset();
                }
            });
            mediaPlayer.prepare();
            prepared = true;
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            Log.d("IllegarArgument", e.getMessage());
            prepared = false;
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            prepared = false;
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            prepared = false;
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            prepared = false;
            e.printStackTrace();
        }
        return prepared;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        if (progress.isShowing()) {
            progress.cancel();
        }
        Log.d("Prepared", "//" + result);
        mediaPlayer.start();

        intialStage = false;
    }

    public Player() {
        progress = new ProgressDialog(MainActivity.this);
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        this.progress.setMessage("Buffering...");
        this.progress.show();

    }
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    if (mediaPlayer != null) {
        mediaPlayer.reset();
        mediaPlayer.release();
        mediaPlayer = null;
    }
}
75
PiyushMishra

Android MediaPlayer ne prend pas en charge la lecture en continu de fichiers MP3 jusqu'à la version 2.2. Dans les anciennes versions du système d'exploitation, il semble que seul le 3GP soit diffusé en mode natif. Vous pouvez essayer le code pocketjourney, bien qu'il soit vieux (il y a une nouvelle version ici ) et que j'ai eu du mal à le rendre collant - il bégayerait dès qu'il remplirait le tampon.

L'application NPR News pour Android est une source ouverte. Elle utilise un serveur proxy local pour gérer la lecture en continu de fichiers MP3 dans les versions du système d'exploitation antérieures à 2.2. Vous pouvez voir le code correspondant aux lignes 199-216 (r94) ici: http://code.google.com/p/npr-Android-app/source/browse/Npr/src/org/npr/Android/news/PlaybackService.java?r=7cf2352b5c3f0cbcdc18c8c8cdc18a5a8a7a

Et voici la classe StreamProxy: http://code.google.com/p/npr-Android-app/source/browse/Npr/src/org/npr/Android/news/StreamProxy. java? r = e4984187f45c39a54ea6c88f71197762dbe10e72

L'application NPR reçoit également toujours "l'erreur (-38, 0)" parfois lors de la diffusion. Cela peut être un problème de threading ou un problème de changement de réseau. Vérifiez le suivi des problèmes pour les mises à jour .

35
jwadsack

Je suppose que vous essayez de jouer un fichier .pls directement ou quelque chose de similaire.

essayez ceci:

1: le code

mediaPlayer = MediaPlayer.create(this, Uri.parse("http://vprbbc.streamguys.net:80/vprbbc24.mp3"));
mediaPlayer.start();

2: le fichier .pls

Cet URL provient de la BBC à titre d'exemple. C’était un fichier .pls que, sur Linux, j’ai téléchargé avec

wget http://foo.bar/file.pls

et puis j'ai ouvert avec vim (utilisez votre éditeur favori;) et j'ai vu les vraies URL à l'intérieur de ce fichier. Malheureusement, tous les fichiers .pl ne sont pas en clair.

J'ai lu que la 1.6 ne prendrait pas en charge le streaming mp3 sur http, mais je viens de tester le code obove avec Android 1.6 et 2.2 et je n'ai aucun problème.

bonne chance!

9
Pabluez

Utilisation

 mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
 mediaplayer.prepareAsync();
 mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
      @Override
      public void onPrepared(MediaPlayer mp) {
          mediaplayer.start();
      }
 });
3
Shshank Bhong

J'ai eu la même erreur que vous et il s'est avéré qu'il n'y avait aucun problème avec le code. Le problème était que le serveur Web envoyait le mauvais en-tête Content-Type.

Essayez Wireshark ou quelque chose de similaire pour voir quel type de contenu le serveur Web envoie.

2
doep

Regarder mes projets:

  1. https://github.com/master255/ImmortalPlayer support http/FTP, Un seul thread pour lire, envoyer et sauvegarder dans les données en cache. Le plus simple et le plus rapide des travaux. Logique complexe - meilleur moyen!
  2. https://github.com/master255/VideoViewCache Simple vidéo avec cache. Deux threads pour jouer et sauvegarder des données. Mauvaise logique, mais si vous en avez besoin, utilisez ceci.
1
Master

Aucun appel mp.start avec un OnPreparedListener pour éviter l'état zéro dans le journal.

1
Fred Grott