Android MediaPlayer arrojando “Prepare failed .: status = 0x1” en 2.1, funciona en 2.2

Realmente me he golpeado la cabeza contra la mesa intentando que la clase MediaPlayer intente reproducir videos codificados con h.264 en Android 2.1. Mi código es bastante simple:

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

Esto siempre arroja una excepción en prepare() , con el texto java.io.IOException: Prepare failed.: status=0x1 . Obtuve un poco más de información usando MediaPlayer.create() con un URI, que también arroja a prepare() , que en realidad recibe el nombre de MediaPlayer.create() , con el mensaje Command PLAYER_PREPARE completed with an error or info PVMFErrResourceConfiguration .

El mismo código funciona perfectamente en Froyo (2.2). Los videos en sí juegan bien en la aplicación de reproductor de video. ¿Alguien tiene quizás una sugerencia útil que podría ayudar a resolver este problema?

Editar : Todavía no hay solución, un problema muy frustrante. Sin embargo, he descubierto que al crear una VideoView y configurar el URI para el video en bruto funciona. Esto es muy desconcertante, ya que lanzará exactamente el mismo URI a través de una clase de MediaPlayer.

No sé si este es su problema, pero acabo de encontrar una solución al problema descrito anteriormente por Tuszy. Pude leer el archivo que estaba creando desde el almacenamiento externo pero no desde la memoria caché.

La solución es que los permisos de lectura y escritura al escribir el archivo son diferentes.

Por favor, ve esta excelente explicación en este blog que encontré.

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

enter image description here

enter image description here

Esta es mi solución:

 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) { } } } 

Sé que llegué tarde pero espero que esto ayude a otra persona. He setOnCompletionListener este problema configurando una setOnCompletionListener llamada setOnCompletionListener que libera explícitamente el objeto MediaPlayer una vez que los medios se terminan de reproducir.

No me puedo atribuir el mérito de esta solución, ya que Ronny la publicó originalmente aquí: ¿cómo se detecta cuando un archivo de sonido ha terminado?

Pero dado que esta es la primera respuesta cuando busco Android + Failed Status 0x1 aquí está mi código que me solucionó este problema:

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

Si está utilizando varias instancias de MediaPlayer , asegúrese de haber ejecutado release() en un recurso antes de intentar usarlo en una instancia diferente.

Tuve un problema similar. Tenía un archivo zip que contenía archivos de sonido que estaban comprimidos. Para pasarlos a MediaPlayer , necesitaban ser descomprimidos. Cuando los coloqué dentro del directorio de caché de la aplicación ( context.getCacheDir() ), MediaPlayer devolvió el mismo error que usted describió.

Pero cuando los coloqué en el almacenamiento externo ( Environment.getExternalStorageDirectory() ), todo comenzó a funcionar.

En mi opinión, le pediré que compruebe la ubicación de sus archivos multimedia << SONG PATH o MOVIE PATH >>. Enfrenté esta excepción, la supere por “SONG PATH” correcta

primero gracias por su código, el recurso sin procesar abierto me ayudó con mi problema.

Lamento no tener una respuesta definitiva a su problema, pero basándome en el ejemplo de la API api en el SDK y en mi reproductor multimedia en mi proyecto, le sugiero que compruebe que el archivo se abre correctamente.

de lo contrario, tal vez necesite configurar la pantalla antes de prepararla como tal:

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

esas son las únicas ideas que tengo

Espero eso ayude

Jason

iniciar la instancia de fileName, mediaPlayer:

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

para reproducir / iniciar el archivo de audio desde el directorio res / raw:

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

finalmente deteniendo el archivo de audio:

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

Si está trabajando con una URL remota, use el código siguiente para obtener la URL codificada compatible con MediaPlayer.

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

Encontré la solución mejor y más clara para este error: java.io.IOException: Prepare failed.: status=0x1

Nota

si quieres leer de tu tarjeta SD y obtuviste este error, no estás configurado
en tu Manifast.

Nota 2

si quieres jugar desde url y obtuviste ese error, tal vez tu set setDataSource este setDataSource : https://www.android.com solo elimina S de http como este http://www.android.com

Para reproducir un archivo de video o audio ubicado en la carpeta sin formato, use:

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

no es necesario llamar a prepare () cuando se utiliza MediaPlayer.create (Context, R.raw.some_resource_file)

Sé que esto puede ser demasiado tarde. Logré usar video de recursos como este:

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

En mi caso, era solo un nombre de archivo que no le gustaba:
/storage/emulated/0/appname/2018-03-12T11:52:08Z.wav
Se eliminaron los guiones y los dos puntos, y la excepción desapareció.