Frage

ich eine Liste von Songs, dass ich Streaming-Mediaplayer verwenden. Einige der Songs konsequent arbeiten und andere konsequent nicht funktionieren. Ich kann keinen Unterschied zwischen diesen Dateien sehen, und sie scheinen gut in itunes zu spielen und so weiter.

Wenn die Songs nicht es eine Illegal auf der mediaPlayer.prepare () Linie wirft. Die Illegal die ausgelöst wird, hat keine nützlichen Informationen darin, (detailMessage ist null, stackState ist null)

Hier ist mein Code

try {
    mediaPlayer.setDataSource(media.url);
    setPlayerState(PlayerState.PREPARING);
    mediaPlayer.prepare();
} catch (Exception e) {
    e.printStackTrace();
    Log.e(TAG, "bad stream");
}

Hier ist eine URL zu der Datei, die nicht funktioniert: skdy.bryceb.dev.mediarain.com/song.m4a

Hier ist eine, die funktioniert: skdy.bryceb.dev.mediarain.com/song2.m4a

Irgendwelche Ideen, warum diese Werke auf einigen Songs und nicht auf andere?

War es hilfreich?

Lösung

Danke MisterSquonk Ich bin sicher, dass Art und Weise funktionieren würde.

In meinem speziellen Fall nach für ein meinen Kopf gegen die Wand zu schlagen, während ich, dass auf einigen Songs erkennen, wurde ich in die gepufferte Menge bekommen, bevor der Spieler Zustand gesetzt wurde immer vorbereitet. Also habe ich einen Scheck, um sicherzustellen, dass der Mediaplayer war in der „PREPARED“ Zustand versetzt und dann funktionierte es toll:

// Media prepared listener
    mediaPlayer.setOnPreparedListener(
            new MediaPlayer.OnPreparedListener() {
                public void onPrepared(MediaPlayer mp) {
                    setPlayerState(PlayerState.PREPARED);
                }
            });

    // Media buffer listener
    mediaPlayer.setOnBufferingUpdateListener(
            new MediaPlayer.OnBufferingUpdateListener() {
                public void onBufferingUpdate(MediaPlayer mp, int percent) {

                    // Sometimes the song will finish playing before the 100% loaded in has been
                    // dispatched, which result in the song playing again, so check to see if the 
                    // song has completed first
                    if(getPlayerState() == PlayerState.COMPLETED)
                        return;

                    if(getPlayerState() == PlayerState.PAUSED)
                        return;

                    // If the music isn't already playing, and the buffer has been reached
                    if(!mediaPlayer.isPlaying() && percent > PERCENT_BUFFER) {
                        if(getPlayerState() == PlayerState.PREPARED)
                        {
                            mediaPlayer.start();
                            setPlayerState(PlayerState.PLAYING);
                        }
                        //if it isn't prepared, then we'll wait till the next buffering
                        //update
                        return;
                    }
                }
            });

Andere Tipps

OK, gehackt ich zusammen eine minimale Mediaplayer Implementierung in einer ‚Sandbox‘ app / Aktivität ich zum Testen immer Ersatz halten.

Ich könnte falsch sein, aber wenn man diese Songs über das Netz ist Streaming, werden Sie müssen die URL mit http-Präfix. //

habe ich versucht, die URLs mit Winamp und Chrome wörtlich (ohne Protokoll-Präfix string) und sie hat gut funktioniert, obwohl es wahrscheinlich diese beiden Anwendungen ist irgendeine Form von Intelligenz nutzen, herauszufinden, wie / Strom zu verbinden.

Wenn ich versucht, dass in meinem Mediaplayer-Code, ich die gleiche Ausnahme wie Sie bekommen, aber wenn ich das Präfix die URLs mit http:. // die Songs spielen fein

Beispiel ...

// Activity scope
Button button;
CheckBox checkBox;
String url = "";

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //button declared in my activity
    button = (Button)findViewById(R.id.button);
    button.setOnClickListener(this);

    if (!checkBox.isChecked())
        url = getString(R.string.url_song1);
    else
        url = getString(R.string.url_song2);

    mediaPlayer = new MediaPlayer();
}

@Override
public void onClick(View arg0) {
    try {
        Log.i(TAG, "onClick() entered...");
        mediaPlayer.setDataSource(url);
        Log.i(TAG, "Preparing mediaplayer...");
        mediaPlayer.prepare();
        Log.i(TAG, "Starting mediaplayer...");
        mediaPlayer.start();
    } catch (Exception e) {
        e.printStackTrace();
        Log.e(TAG, "bad stream");
    }       
}

Wenn ich die Lieder auf meine SD-Karte kopieren spielen beide gut und so lange, wie die Internet-URL-Strings haben eine ‚http: //‘. Präfix dann sind sie auch Arbeit

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top