MediaPlayer.prepare wirft eine Illegal wenn m4a Datei spielen
-
10-10-2019 - |
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?
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