wake-up-neo.com

Android MediaPlayer wirft auf 2.1 "Prepare failed .: status = 0x1", funktioniert auf 2.2

Ich habe wirklich mit dem Kopf gegen den Tisch geklopft und versucht, die MediaPlayer-Klasse dazu zu bringen, h.264-kodierte Videos auf Android 2.1 abzuspielen. Mein Code ist ziemlich einfach:

  AssetFileDescriptor fileDescriptor = getResources().openRawResourceFd(R.raw.my_movie);
  introMoviePlayer = new MediaPlayer();
  introMoviePlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getDeclaredLength());
  introMoviePlayer.prepare();

Dies löst immer eine Ausnahme bei prepare() aus, mit dem Text Java.io.IOException: Prepare failed.: status=0x1. Ich habe ein paar weitere Informationen erhalten, indem ich MediaPlayer.create() mit einer URI verwende, die auch prepare() auslöst, die tatsächlich von MediaPlayer.create() aufgerufen wird, mit der Nachricht Command PLAYER_PREPARE completed with an error or info PVMFErrResourceConfiguration.

Derselbe Code funktioniert perfekt in Froyo (2.2). Die Videos selbst werden in der Video-Player-App einwandfrei abgespielt. Hat jemand vielleicht einen hilfreichen Hinweis, der helfen könnte, dieses Problem zu lösen?

Edit : Immer noch keine Lösung - in der Tat ein sehr frustrierendes Problem. Ich habe jedoch herausgefunden, dass ich eine VideoView erstellt und den URI für das Rohvideo eingestellt habe. Dies ist sehr rätselhaft, da der gleiche URI durch eine MediaPlayer-Klasse gesendet wird.

27
Nik Reiman

Ich weiß nicht, ob dies Ihr Problem ist, aber ich habe gerade eine Lösung für das von Tuszy beschriebene Problem gefunden. Ich konnte die erstellte Datei von einem externen Speicher aus lesen, jedoch nicht vom Cache. 

Die Lösung besteht darin, dass die Leseberechtigungen beim Schreiben der Datei unterschiedlich sind. 

Bitte lesen Sie diese hervorragende Erklärung in diesem Blog, das ich gefunden habe.

http://blog.weston-fl.com/Android-mediaplayer-prepare-throws-status0x1-error1-2147483648/

 enter image description here

 enter image description here

15
Ryan Heitner

Das ist meine Lösung: 

MediaPlayer mediaPlayer = new MediaPlayer();
FileInputStream fis = null;
try {
    fis = new FileInputStream(mp3File);
    mediaPlayer.setDataSource(fis.getFD());
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.prepare();
}   finally {
    if (fis != null) {
        try {
            fis.close();
        } catch (IOException ignore) {
        }
    }

}
26
MadMurdok

Ich weiß, dass ich zu spät hier bin, aber hoffentlich hilft das jemand anderen. Ich habe dieses Problem gelöst, indem ich einen setOnCompletionListener-Rückruf eingerichtet habe, der das MediaPlayer-Objekt explizit freigibt, nachdem die Wiedergabe der Medien abgeschlossen ist.

Ich kann diese Lösung nicht anerkennen, da sie ursprünglich von Ronny hier veröffentlicht wurde: Wie erkennen Sie, wann eine Sounddatei fertig ist?

Aber da dies die erste Antwort ist, wenn ich nach Android + Failed Status 0x1 suche, ist hier mein Code, der dieses Problem für mich gelöst hat:

 public void playSound(String soundPath){
    MediaPlayer m = new MediaPlayer();

    m.setOnCompletionListener(new OnCompletionListener() {

        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.release();
        }

    });

    try {

        AssetFileDescriptor descriptor = mContext.getAssets().openFd(soundPath);
        m.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(),
                        descriptor.getLength());            

        descriptor.close();

        m.prepare();
        m.setVolume(100f, 100f);
        m.setLooping(false);
        m.start();

    } catch (Exception e) {
        //Your catch code here.
    }
 }   
7
Anthony Roe

Wenn Sie mehrere Instanzen von MediaPlayer verwenden, stellen Sie sicher, dass Sie release() für eine Ressource ausgeführt haben, bevor Sie versuchen, sie in einer anderen Instanz zu verwenden.

5
Paul Lammertsma

initialisieren Sie den Dateinamen, die Media Player-Instanz:

private MediaPlayer mp;
private final static String fileName = "ring";

zum Abspielen/Starten einer Audiodatei aus dem res/raw-Verzeichnis:

        try 
        {   
            mp = new MediaPlayer();
            mp.setAudioStreamType(AudioManager.STREAM_RING); //set streaming according to ur needs
            mp.setDataSource(Context, Uri.parse("Android.resource://yourAppPackageName/raw/"+fileName));
            mp.setLooping(true);
            mp.prepare();
            mp.start();

        } catch (Exception e) 
        {
            System.out.println("Unable to TunePlay: startRingtone(): "+e.toString());
        }

endlich die Audiodatei stoppen: 

    try
    {
        if (!(mp == null) && mp.isPlaying())
        {
            mp.stop();
            mp.release(); //its a very good practice
        }       
    }
    catch (Exception e)
    {
        System.out.println("Unable to  TunePlay: stopRingtone():"+e.toString());
    }
2
ani0904071

Ich weiß, dass dies zu spät sein kann. Ich habe es geschafft, Videos aus Ressourcen wie folgt zu verwenden:

MediaPlayer mp = ...;
Uri uri = Uri.parse("Android.resource://com.example.myapp/" + R.raw.my_movie");
mp.setDataSourceUri(this, uri);
2
Aleks G

Meiner Meinung nach werde ich Sie bitten, Ihren Standort Ihrer Mediendateien << SONG PATH oder MOVIE PATH >> zu überprüfen. Ich habe mit dieser Ausnahme konfrontiert, die ich durch korrekte "SONG PATH" überwunden habe.

2
SAWAUNG

Ich hatte ein ähnliches Problem. Ich hatte eine Zip-Datei, die komprimierte Sounddateien enthielt. Um sie an MediaPlayer weitergeben zu können, mussten sie unkomprimiert werden. Wenn ich sie im Cache-Verzeichnis der Anwendung abgelegt habe (context.getCacheDir()), gab MediaPlayer den gleichen Fehler zurück, den Sie beschrieben haben.

Aber als ich sie auf einem externen Speicher (Environment.getExternalStorageDirectory()) ablegte, funktionierte alles.

2
srgtuszy

erstmal danke für ihren code, die offene rohressource hat mir bei meinem problem geholfen.

Es tut mir leid, dass ich keine eindeutige Antwort auf Ihr Problem habe. Aufgrund des API-Beispiels im SDK und meines Mediaplayers in meinem Projekt sollte ich jedoch prüfen, ob die Datei ordnungsgemäß geöffnet wird.

andernfalls müssen Sie möglicherweise die Anzeige vor der Vorbereitung einstellen:

mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getDeclaredLength());
            mMediaPlayer.setDisplay(holder);
            mMediaPlayer.prepare();

das sind die einzigen Ideen, die ich habe

ich hoffe es hilft

Jason

1
Jason Rogers

Ich habe die beste und klarste Lösung für diesen Fehler gefunden: Java.io.IOException: Prepare failed.: status=0x1

Hinweis

wenn Sie von Ihrer SD-Karte lesen möchten und diesen Fehler erhalten haben, sind Sie nicht eingestellt
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE"/> in Ihrem Manifast.

Anmerkung 2

wenn Sie von url spielen möchten und diesen Fehler erhalten haben, können Sie setDataSource folgendermaßen einstellen: https://www.Android.com entfernen Sie einfach S aus http wie folgt http://www.Android.com

1
erfan

In meinem Fall war es nur ein Dateiname, den er nicht mochte:
/storage/emulated/0/appname/2018-03-12T11: 52: 08Z.wav
Die Bindestriche und Doppelpunkte wurden entfernt, und die Ausnahme verschwand.

1
Ben

Wenn Sie mit Remote-URLs arbeiten, verwenden Sie den folgenden Code, um die mit MediaPlayer kompatible kodierte URL zu erhalten.

public String getEncodedURL(String urlStr) throws Exception 
{
            URL url = new URL(urlStr);
            URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
            urlStr = uri.toASCIIString();
            return urlStr;
}
1
Rakesh Patil

Zur Wiedergabe einer Video- oder Audiodatei im Ordner raw verwenden Sie Folgendes:

mMediaPlayer = MediaPlayer.create(this, R.raw.a_video_or_audio_file);
mMediaPlayer.start(); 

kein Aufruf von prepare () bei Verwendung von MediaPlayer.create (Context, R.raw.some_resource_file)

0
TouchBoarder

das Abspielen von MP3-Dateien anstelle von Wmva wurde behoben. Anscheinend ist das bei API 19 kein Problem 

0
sam winston