2010-09-21 33 views
22

He estado realmente golpeando mi cabeza contra la mesa tratando de conseguir que la clase MediaPlayer intente reproducir videos codificados con h.264 en Android 2.1. Mi código es bastante simple:Android MediaPlayer arrojando "Prepare failed .: status = 0x1" en 2.1, funciona en 2.2

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

Esto siempre produce 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 al prepare(), que en realidad se llama por 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 - problema muy frustrante de hecho. Sin embargo, he encontrado que al crear un 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.

+0

¿Has probado ese código si almacenas tu archivo en la tarjeta SD y pasas por su propio camino? – Pedriyoo

+0

es demasiado tarde, pero supongo que el constructor de mediaplayer tiene una sobrecarga que requiere resourceId – Samuel

Respuesta

12

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 el Caché.

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

Por favor, vea 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

+0

No estoy trabajando en la misma empresa que ya tenía este problema, por lo que no puedo decir con certeza si la solución solucionaría este problema. Sin embargo, voy a marcar esto como la respuesta correcta, ya que es el mejor recurso que he visto hasta ahora en este error bastante oscuro. –

+0

No creo que el blog exista más. Por favor ingrese la respuesta aquí. –

+0

Logré sacar el blog de un sitio de archivo. Una vez que eres uno, la web es para siempre. –

1

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

Disculpa, no tengo una respuesta definitiva a tu problema, pero basándome en el ejemplo de la API de medios en el SDK y en mi reproductor de medios en mi proyecto, sugiero verificar que el archivo se abra correctamente.

de otro modo, tal vez necesites configurar la pantalla antes de preparar 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

creo que sirve

Jason

+0

hola, estoy enfrentando el mismo problema. Mi código como este --- MediaPlayer mMediaPlayer = new MediaPlayer(); String PATH_TO_FILE = this.getFilesDir() + "/ Organic_chemistry/new_audio.mp3"; \t \t \t mMediaPlayer.setDataSource (PATH_TO_FILE); mMediaPlayer.prepare(); –

5

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

0

Sé que esto puede ser demasiado tarde. Me las arreglé para utilizar el video de los recursos como este:

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

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.

+0

También los coloqué en el almacenamiento externo (Environment.getExternalStorageDirectory()), todo comenzó a funcionar. –

2

En mi opinión voy a pedirle que vuelva a su ubicación de sus archivos de medios < PATH < SONG o ruta PELÍCULA >>. Me encontré con esta excepción, yo he vencido por correcta "PATH SONG"

23

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

} 
+4

GRACIAS MUCHO, esta parte del código "fis.getFD()" salvó mi día –

+0

Solo un recordatorio para los archivos locales. Si MediaPlayer.setDataSource (String path) tiene un error de preparación, esta solución tampoco funciona. Como en la lógica de fondo de MediaPlayer.setDataSource (String path), también está utilizando setDataSource (FileDescriptor fd). – Hexise

7

Sé que llego tarde aquí, pero espero que esto ayude a alguien más. He solucionado este problema configurando una devolución de llamada setOnCompletionListener que libera explícitamente el objeto MediaPlayer después de que los medios se terminan de reproducir.

no puedo tomar el crédito por esta solución, ya que fue publicada originalmente por Ronny aquí: How do you detect when a sound file has finished?

Pero ya que esta es la primera respuesta cuando la búsqueda de Android 0x1 + Error en el estado aquí está mi código que resuelto este problema para mí:

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

sí, mp.release(); debe ser llamado. Gracias. – SalutonMondo

0

para reproducir un archivo de vídeo o audio ubicado en el uso carpeta prima :

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

hay necesidad de llamar a preparar() cuando utilice MediaPlayer.create (Contexto, R.raw.some_resource_file)

1

initilize el nombre del archivo, ejemplo MediaPlayer:

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

de juego/archivo de audio a partir de res/directorio prima:

 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 detener el audioFile:

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

me pareció mejor y solución clara para este error: java.io.IOException: Prepare failed.: status=0x1

Nota

si usted quiere leer desde la tarjeta SD y se produjo el error no está ajustada a su
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> en su Manifast.

Nota 2

si su son quiera jugar desde URL y consiguió que el error tal vez su están situados setDataSource que desea: https://www.android.com acaba de quitar S desde http así: http://www.android.com

1

Si se trata con URL remota, utilice 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; 
} 
Cuestiones relacionadas