webentwicklung-frage-antwort-db.com.de

MediaPlayer-Fehler (1, -1004) aka MEDIA_ERROR_IO beim Versuch, Musik auf Samsung S3 zu streamen

HINWEIS: Ich arbeite nicht in der Firma, in der ich gearbeitet habe, als ich diese Frage gepostet habe, obwohl einige großartige Antworten dazu kommen könnten In, ich werde sie nicht wirklich testen, da ich keinen Grund dafür habe. (außer der Förderung der Gemeinschaft; was mich veranlassen könnte, es einen. Tag zu machen)

Wenn jedoch eine Antwort auf das Problem von vielen anderen unterstützt wird Für Community-Mitglieder kann ich die Option als korrekte Antwort für .__ auswählen. Das Problem erlebte so viele Jahre nachdem ich ursprünglich die .__ gepostet hatte. Frage.

In der Zwischenzeit hoffe ich, dass einige der Antworten auch einigen von Ihnen helfen können dieses Problem erfahren. Yay für Stack Overflow!


Unsere Anwendung muss Musik von einer Online-Quelle streamen (ich kann diese Quelle nicht offenlegen). 

Warum dauert der Streaming auf der S3 mehr als 2 Minuten?

Ich konnte herausfinden, dass das Media Player-Objekt aufgrund von MEDIA_ERROR_UNKOWN - in den Status Error wechselt. Hilft mir nicht viel. Nachdem ich dies in onError mit einem OnErrorListener behandelt habe, setze ich das Media Player-Objekt zurück und rufe dann startPlaying auf, was den Rest erledigt - das Setzen der Datenquelle usw.

Mitglieder:

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

Initialisierung des Media Players (und Visualizers - was für diese Frage nicht relevant ist)

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();
    }
}

Jetzt Spielen:

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();
    }



}

Hör auf zu spielen:

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;
}

Ein paar Protokolle:

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

Die Antwort auf diese Frage stellte sich als Problem bei der auf Samsung S III-Geräten mit Android 4.1.2 installierten Android-Firmware heraus. 

Es schien etwas mit der Quelle des Streams zu tun zu haben, weil einige Quellen auf dem Gerät gespielt wurden, aber die, die wir brauchten, nie gespielt haben. 

Wenn Sie Ihren Stream von einer anderen Quelle beziehen können, sollte er funktionieren. 

Wenn Sie also eine Anwendung für ein bestimmtes Unternehmen/einen bestimmten Zweck entwickeln und eine gewisse Kontrolle über die Quelle des Streams haben oder mit Personen kommunizieren können, die die Quelle des Streams steuern, müssen Sie die Quelle des Streams in etwas ändern das funktioniert auf einem Samsung S III mit Android 4.1.2.

Abgesehen davon lösen Sie dies nur durch ein Firmware-Upgrade.

17
marienke

Für alle, die mit diesem Problem zu kämpfen haben, ist hier die Lösung:

Android MediaPlayer benötigt lange Vorbereitungszeit und Pufferung

BEARBEITEN: Die vorherige Lösung ist nicht sehr vollständig, da es manchmal möglich ist, dass der Player stottert, wenn er angehalten und fortgesetzt wird.

Eine etwas elegantere 100% Java-Antwort beinhaltet die Verwendung einer MediaCodec-Instanz, um MP3-Dateien in PCM-Daten umzuwandeln, um sie an eine AudioTrack-Instanz weiterzuleiten.

Den vollständigen Quellcode und die Erklärung habe ich hier veröffentlicht: http://www.piterwilson.com/blog/2014/03/15/mediacodec-mediaextractor-and-audiotrack-to-the-rettung/

Ich habe dieses Problem mithilfe der Bibliothek behoben
"com.devbrackets.Android:exomedia:3.0.1" kompilieren

3
Vivek

Eine definitive Lösung für ein paar -1004 auf älteren Samsung-Handys:

In meinem Fall verwende ich ein Samsung Galaxy Pocket und hatte eine MP3-Datei auf unserem CDN, die nicht abgespielt werden konnte, d. H.

http: // domain/pfad/audiofile

Beim Herunterladen der Datei auf das Telefon wird sie jedoch im nativen Player abgespielt. Nicht in meiner App und nicht in Browsern. Der Mediaplayer-Dienst benötigte eine Dateierweiterung, um auf den Medientyp hinzuweisen und konnte anhand der Dateiköpfe nicht automatisch erkannt werden.

Ich habe es gelöst, indem ich dem Dateispeicherort eine tatsächliche Erweiterung gab.

http: //domain/path/audiofile.mp3

Lösung

  1. Geben Sie der Datei entweder eine Erweiterung, in der sie gehostet wird (wie oben) oder
  2. Laden Sie die Datei programmgesteuert manuell herunter, geben Sie ihr die korrekte Erweiterung auf der SD-Karte und spielen Sie dann von der SD-Karte als Quelle ab.
0
dyson returns