web-dev-qa-db-fra.com

Erreur MediaPlayer (1, -1004) aka MEDIA_ERROR_IO essayant de diffuser de la musique sur Samsung S3

NOTE: Je n'ai pas travaillé pour la société dans laquelle je travaillais quand j'ai posté cette question, donc, même si de bonnes réponses pourraient venir dans, je ne vais pas les tester car je n'ai pas de raison de (autre que la promotion de la communauté; ce qui pourrait me faire faire un jour )

Si toutefois, certaines réponses au problème sont promues par beaucoup d'autres membres de la communauté, je pourrais choisir de le sélectionner comme bonne réponse pour le problème a connu tant d'années après que j'ai posté le question.

En attendant, j'espère que certaines des réponses aideront également certains d'entre vous l'expérience de ce problème. Yay pour Stack Overflow!


Notre application doit diffuser de la musique à partir d'une source en ligne (je ne suis pas libre de divulguer cette source). 

Pourquoi faut-il plus de 2 minutes pour commencer à diffuser sur le S3?

J'ai été en mesure de comprendre que l'objet Media Player passe à l'état Etat d'erreur en raison de MEDIA_ERROR_UNKOWN - excellent. Ne m'aide pas beaucoup Donc, lors du traitement de cela dans onError avec un OnErrorListener, je réinitialise l’objet Media Player, puis appelle startPlaying qui se charge du reste - définissant la source de données, etc.

Membres:

private ProgressBar playSeekBar;
private ImageView ivPlay;
private ImageView ivPause;
private ImageView ivBuffer;
private MediaPlayer mPlayer;
private ImageView ivInfo;
private AudioManager audio;

Initialisation du lecteur multimédia (et du visualiseur - ce qui n’est pas le problème aux fins de cette question)

private void initialMediaPlayerAndVisualizer() {
      Log.d(TAG, "Initial Media Player and Visualizer");

      playSeekBar = (ProgressBar) findViewById(R.id.progressBar1);
      playSeekBar.setMax(100);
      playSeekBar.setVisibility(View.GONE);

      mPlayer = new MediaPlayer();   

      Log.d(TAG, "Create onErrorListener");
      MediaPlayer.OnErrorListener errorListener = new MediaPlayer.OnErrorListener() {

        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            Log.d(TAG, "OnError - Error code: "+what+" Extra code: "+extra);

            switch(what){
            case -1004:
                Log.d("Streaming Media", "MEDIA_ERROR_IO");
                break;
            case -1007:
                Log.d("Streaming Media", "MEDIA_ERROR_MALFORMED");
                break;
            case 200:
                Log.d("Streaming Media", "MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK");
                break;
            case 100:
                Log.d("Streaming Media", "MEDIA_ERROR_SERVER_DIED");
                break;
            case -110:
                Log.d("Streaming Media", "MEDIA_ERROR_TIMED_OUT");
                break;
            case 1:
                Log.d("Streaming Media", "MEDIA_ERROR_UNKNOWN");
                break;
            case -1010:
                Log.d("Streaming Media", "MEDIA_ERROR_UNSUPPORTED");
                break;

            }

            switch(extra){
            case 800:
                Log.d("Streaming Media", "MEDIA_INFO_BAD_INTERLEAVING");
                break;
            case 702:
                Log.d("Streaming Media", "MEDIA_INFO_BUFFERING_END");
                break;
            case 701:
                Log.d("Streaming Media", "MEDIA_INFO_METADATA_UPDATE");
                break;
            case 802:
                Log.d("Streaming Media", "MEDIA_INFO_METADATA_UPDATE");
                break;
            case 801:
                Log.d("Streaming Media", "MEDIA_INFO_NOT_SEEKABLE");
                break;
            case 1:
                Log.d("Streaming Media", "MEDIA_INFO_UNKNOWN");
                break;
            case 3:
                Log.d("Streaming Media", "MEDIA_INFO_VIDEO_RENDERING_START");
                break;
            case 700 :
                Log.d("Streaming Media", "MEDIA_INFO_VIDEO_TRACK_LAGGING");
                break;

            }

            Log.d("Streaming Media", "Reset media player");
            mPlayer.reset();
            // We need to link the visualizer view to the media player so that it displays something
              mVisualizerManager = new VisualizerManager(context); //(VisualizerView) findViewById(R.id.visualizerView);

              //Send the visualizerContainer to the Renderer
              visualizerRenderer = new VisualizerRenderer(arrayVisualizer);
              mVisualizerManager.addRenderer(visualizerRenderer);

              try {
                startPlaying();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return true;
        }
    };

    Log.d(TAG, "Set error listener on Media Player object");          
     mPlayer.setOnErrorListener(errorListener);

      // We need to link the visualizer view to the media player so that it displays something
      mVisualizerManager = new VisualizerManager(context); //(VisualizerView) findViewById(R.id.visualizerView);

      //Send the visualizerContainer to the Renderer
      visualizerRenderer = new VisualizerRenderer(arrayVisualizer);
      mVisualizerManager.addRenderer(visualizerRenderer);

      try {
        startPlaying();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Commencer à jouer:

private void startPlaying () throws IllegalStateException, IOException, UnsupportedOperationException
  {

    if(mPlayer != null){

          ivPause.setVisibility(View.INVISIBLE);
          ivPlay.setVisibility(View.INVISIBLE);
          ivBuffer.setVisibility(View.VISIBLE);

        mVisualizerManager.link(mPlayer);

        mPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {

            public void onBufferingUpdate(MediaPlayer mp, int percent) {
                playSeekBar.setSecondaryProgress(percent);
                Log.i("Buffering", "" + percent);
            }
        });

        try {
            mPlayer.setDataSource(theSource);
        } catch (IllegalArgumentException e) {
            Log.d(TAG, "Illegal Argument Exception: "+e);
            e.printStackTrace();
        } catch (IllegalStateException e) {
            Log.d(TAG, "Illegal State Exception: "+e);
            e.printStackTrace();
        } catch (IOException e) {
            Log.d(TAG, "IO Exception: "+e);
            e.printStackTrace();
        }

      mPlayer.prepareAsync();

      mPlayer.setOnPreparedListener(new OnPreparedListener() {
          public void onPrepared(MediaPlayer mp) {
              ivBuffer.setVisibility(View.INVISIBLE);

              bars.setVisibility(View.INVISIBLE);
              visualizerContainer.setVisibility(View.VISIBLE);
              ivInfo.setImageResource(R.drawable.img_radio_info_online);
              ivPause.setVisibility(View.VISIBLE);
              ivPlay.setVisibility(View.INVISIBLE);

              //Mute the video if the phone is muted.
              if ((audio.getRingerMode() == AudioManager.RINGER_MODE_SILENT) ||  (audio.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE)) {
                  mp.setVolume(0, 0);

                  Toast toast = Toast.makeText(context, R.string.device_muted, Toast.LENGTH_LONG);
                  toast.show();
              }

              mPlayer.start();
          }
      });

    }else{
        Log.d(TAG, "Media player is null.");
        initialMediaPlayerAndVisualizer();
    }



}

Arrête de jouer:

private void stopPlaying()
      {
      bars.setVisibility(View.VISIBLE);
      visualizerContainer.setVisibility(View.INVISIBLE);

      ivInfo.setImageResource(R.drawable.img_radio_info_offline);

      ivPlay.setVisibility(View.VISIBLE);
      ivPause.setVisibility(View.INVISIBLE);

      mPlayer.stop();

      mVisualizerManager.release();
      mPlayer.release();

      mPlayer = null;
}

Un peu de bûches:

05-21 16:26:23.600: I/Buffering(3921): 0

05-21 16:26:23.600: I/MediaPlayer(3921): Info (703,156)
05-21 16:26:23.600: I/MediaPlayer(3921): Info (701,0)
05-21 16:26:23.610: D/VisualizerRenderer(3921): Render columns
05-21 16:26:23.715: V/MediaPlayer(3921): message received msg=100, ext1=1, ext2=-110
05-21 16:26:23.715: E/MediaPlayer(3921): error (1, -110)
05-21 16:26:23.715: V/MediaPlayer(3921): callback application
05-21 16:26:23.715: V/MediaPlayer(3921): back from callback
05-21 16:26:23.725: D/VisualizerRenderer(3921): Render columns
05-21 16:26:23.725: E/MediaPlayer(3921): Error (1,-110)
05-21 16:26:23.725: D/MAIN(3921): OnError - Error code: 1 Extra code: -110
05-21 16:26:23.725: D/Streaming Media(3921): MEDIA_ERROR_UNKNOWN
05-21 16:26:23.725: D/Streaming Media(3921): Reset media player
05-21 16:26:23.725: V/MediaPlayer-JNI(3921): reset
05-21 16:26:23.725: V/MediaPlayer(3921): reset
05-21 16:26:23.730: D/VisualizerRenderer(3921): Divisions: 9
05-21 16:26:23.730: D/VisualizerManager(3921): Added te renderer
05-21 16:26:23.730: V/MediaPlayer-JNI(3921): get_session_id()
05-21 16:26:23.735: D/VisualizerManager(3921): Media player and visualizer linked
05-21 16:26:23.735: D/VisualizerManager(3921): Set capture listener
05-21 16:26:23.735: D/VisualizerManager(3921): Set on visualizer complete listener
05-21 16:26:23.740: V/MediaPlayer(3921): setVideoSurfaceTexture
05-21 16:26:23.740: V/MediaPlayer(3921): prepareAsync
05-21 16:26:25.285: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:25.285: V/MediaPlayer(3921): buffering 0
05-21 16:26:25.285: V/MediaPlayer(3921): callback application
05-21 16:26:25.285: V/MediaPlayer(3921): back from callback
05-21 16:26:25.330: I/Buffering(3921): 0
05-21 16:26:25.390: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:25.390: V/MediaPlayer(3921): buffering 0
05-21 16:26:25.390: V/MediaPlayer(3921): callback application
05-21 16:26:25.390: V/MediaPlayer(3921): back from callback
05-21 16:26:25.425: I/Buffering(3921): 0
05-21 16:26:25.490: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:25.490: V/MediaPlayer(3921): buffering 0
05-21 16:26:25.490: V/MediaPlayer(3921): callback application
05-21 16:26:25.490: V/MediaPlayer(3921): back from callback
...

05-21 16:26:52.585: I/Buffering(3921): 0
05-21 16:26:53.570: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:53.570: V/MediaPlayer(3921): buffering 0
05-21 16:26:53.570: V/MediaPlayer(3921): callback application
05-21 16:26:53.570: V/MediaPlayer(3921): back from callback
05-21 16:26:53.585: I/Buffering(3921): 0
05-21 16:26:54.570: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:54.570: V/MediaPlayer(3921): buffering 0
05-21 16:26:54.570: V/MediaPlayer(3921): callback application
05-21 16:26:54.570: V/MediaPlayer(3921): back from callback
05-21 16:26:54.570: V/MediaPlayer(3921): message received msg=200, ext1=702, ext2=0
05-21 16:26:54.570: W/MediaPlayer(3921): info/warning (702, 0)
05-21 16:26:54.570: V/MediaPlayer(3921): callback application
05-21 16:26:54.570: V/MediaPlayer(3921): back from callback
05-21 16:26:54.590: I/Buffering(3921): 0
05-21 16:26:54.590: I/MediaPlayer(3921): Info (702,0)
05-21 16:26:55.575: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:55.575: V/MediaPlayer(3921): buffering 0
05-21 16:26:55.575: V/MediaPlayer(3921): callback application
05-21 16:26:55.575: V/MediaPlayer(3921): back from callback
05-21 16:26:55.575: I/Buffering(3921): 0
05-21 16:26:56.575: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:56.575: V/MediaPlayer(3921): buffering 0
05-21 16:26:56.575: V/MediaPlayer(3921): callback application
05-21 16:26:56.575: V/MediaPlayer(3921): back from callback
05-21 16:26:56.585: I/Buffering(3921): 0
05-21 16:26:57.575: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:57.575: V/MediaPlayer(3921): buffering 0
05-21 16:26:57.575: V/MediaPlayer(3921): callback application
05-21 16:26:57.575: V/MediaPlayer(3921): back from callback
05-21 16:26:57.600: I/Buffering(3921): 0
05-21 16:26:57.930: V/MediaPlayer-JNI(3921): stop
05-21 16:26:57.930: V/MediaPlayer(3921): stop
05-21 16:26:57.930: D/VisualizerManager(3921): Released the visualizer
05-21 16:26:57.930: V/MediaPlayer-JNI(3921): release
05-21 16:26:57.930: V/MediaPlayer(3921): setListener
05-21 16:26:57.930: V/MediaPlayer(3921): disconnect
05-21 16:26:57.935: V/MediaPlayer(3921): destructor
05-21 16:26:57.935: V/MediaPlayer(3921): disconnect
16
marienke

La réponse à cette question s'est avérée être un problème pour le micrologiciel Android installé sur les appareils Samsung S III exécutant Android 4.1.2. 

Cela semblait avoir quelque chose à voir avec la source du flux, parce que certaines sources ont fini par jouer sur le périphérique, mais celle dont nous avions besoin ne l’a jamais été. 

Si vous pouvez obtenir votre flux d'une autre source, cela devrait fonctionner. 

Donc, si vous développez une application pour une entreprise/un but spécifique et avez un certain contrôle sur la source du flux, ou pouvez communiquer avec des personnes ayant le contrôle de la source du flux, demandez-leur de changer la source du flux en quelque chose cela fonctionnera sur un Samsung S III sous Android 4.1.2.

Autre que cela tout ce qui va résoudre ceci est une mise à jour du firmware.

17
marienke

Pour toutes les personnes aux prises avec ce problème, voici la solution:

Android MediaPlayer prend beaucoup de temps pour préparer et mettre en mémoire tampon

EDIT: La solution précédente n’est pas très complète car il est parfois possible d’entendre le bégaiement du lecteur lorsqu’il se met en pause et reprend.

Une réponse 100% Java légèrement plus élégante consiste à utiliser une instance MediaCodec pour transformer le mp3 en données PCM pour alimenter une instance AudioTrack.

J'ai posté le code source complet et l'explication ici: http://www.piterwilson.com/blog/2014/03/15/mediacodec-mediaextractor-and-audiotrack-to-the-rescue/

J'ai résolu ce problème en utilisant la bibliothèque
compiler 'com.devbrackets.Android:exomedia:3.0.1'

3
Vivek

Une solution définitive pour certains obtenant -1004 sur les anciens téléphones Samsung:

Dans mon cas, j'utilise un Samsung Galaxy Pocket et j'ai un fichier MP3 sur notre CDN, qui ne pourrait pas être lu, c.-à-d.

http: // domaine/chemin/audiofile

Lors du téléchargement du fichier sur le téléphone, il est lu dans le lecteur natif. Pas dans mon application et pas dans les navigateurs, cependant. Il s'avère que le service de lecteur multimédia avait besoin d'une extension de fichier pour indiquer le type de support et ne pouvait pas détecter automatiquement en fonction des en-têtes de fichier.

Je l'ai résolu en donnant à l'emplacement du fichier une extension réelle.

http: //domain/path/audiofile.mp3

Solution

  1. Donnez au fichier une extension où il est hébergé (comme ci-dessus) ou
  2. Par programme, téléchargez le fichier manuellement, attribuez-lui l’extension appropriée sur la carte SD, puis lisez-la à partir de la carte comme source.
0
dyson returns