java - reproducir - reproductor de musica en android studio
Android MediaPlayer: a veces no se reproduce ningún vídeo aunque se reproduzca audio (5)
Estoy desarrollando una aplicación para Android y estoy usando el MediaPlayer
del SDK de Android para reproducir algunos videos en mi aplicación. Cuando reproduzco el video en mi aplicación, aproximadamente una de cada cinco veces, el audio se reproduce sin video. No es un simple error de codificación porque la mayoría de las veces el video se reproduce perfectamente.
He considerado que una condición de carrera en mi código causó el error. Sin embargo, agregué varias declaraciones de depuración y todo parece estar configurado correctamente cuando el video no se reproduce.
He escaneado la web y SO tratando de encontrar soluciones, pero ninguna ha sido adecuada (ver más abajo).
¿Alguien se ha encontrado con este tipo de problema antes? Si asi es, ¿Qué hiciste?
Preguntas similares:
Video de MediaPlayer no reproducido
Android Media Player muestra audio pero no hay video
Video de Android, escuchar sonido pero no video
Algunos más detalles:
- Me he encontrado con este error en dos teléfonos. En un Samsung Charge, el video se reproduce el 80% del tiempo y el 20% del tiempo hay audio pero no video. En un cometa T-Mobile es mucho peor; El video solo se reproduce alrededor del 10% del tiempo.
- No es un problema con el archivo, probé varios archivos de video y codecs y obtengo los mismos problemas.
- No es un problema con el medio de almacenamiento. Intenté reproducir el video cuando estaba almacenado en el almacenamiento interno y la tarjeta SD, ninguno de ellos hace la diferencia. Incluso he intentado leer algunos de los archivos antes de reproducirlos, con la esperanza de que el sistema los almacene en caché, pero eso tampoco parece ayudar.
Actualizar:
He estado depurando esto y mirando a través de logcat. Descubrí que cuando el video funciona, algo como lo siguiente aparece en logcat:
09-28 00:09:03.651: VERBOSE/PVPlayer(10875): setVideoSurface(0x65638)
Pero cuando el video no se reproduce, parece que hay una entrada nula:
09-28 00:03:35.284: VERBOSE/PVPlayer(10875): setVideoSurface(0x0)
Actualización 2:
Cuando el video no se reproduce, la función MediaPlayer.OnInfoListener con parámetros es what==MEDIA_ERROR_UNKNOWN(0x1)
y extra==35
. Miré a través del código base de Android para tratar de determinar qué significa un error desconocido 35. Encontré el archivo pv_player_interface.h, que indica que el código de error 35 corresponde a algo llamado PVMFInfoTrackDisable
. Busqué en Google ese término que me llevó a un archivo llamado pvmf_return_codes.pdf
. Ese archivo me dio la siguiente explicación ininteligible:
4.34. PVMFInfoTrackDisable
Notificación de que la pista particular está deshabilitada. Este es en una base por pista. Para formatos de audio / video sin comprimir, durante el proceso de selección de pistas disponibles en el contenido, si el decodificador no es compatible con la pista, se envía un evento PVMFInfoTrackDisable. El evento, si es necesario, se enviará una vez por pista.
Siento que he recorrido un largo camino, pero no estoy más cerca de encontrar una respuesta ... todavía estoy investigando.
He estado estudiando este error 2 semanas, y he entendido más o menos el problema real. Por supuesto que estoy hablando del mensaje de The Evil Info 35 . Si has encontrado este maravilloso error extraño, ahora puedes ser feliz y dispararle a algunos vendedores como Samsung: D ...
El problema se produce porque el usuario no puede ver la vista de la superficie (actividad en el tabhost o la función de pausa de activación, a veces no está enfocada, a veces no está al frente (quizás)).
Esto se debe a que, si se restablece, el video se ejecuta correctamente, ya que se enfoca o tal vez otra actividad / objeto no se superponga.
Cuando algo de eso sucede, el reproductor multimedia cree que no puede ver el video o que no se puede reproducir, y deshabilita la pista de video, lo que le da el peor dolor de cabeza en su vida laboral mientras escucha la pista de música.
Veremos el siguiente error, buena suerte. :RE
La pregunta fundamental es: antes de que SurfaceCreated invoque inicie la reproducción de video, cuando el soporte no esté listo para MediaPlayer, ¡de modo que solo escuche el sonido pero no pueda ver la imagen!
La forma correcta es:
Resolví el problema, aunque de una manera totalmente pirata. Hay dos problemas en realidad:
El mensaje de información malvada 35: encontré que ocasionalmente se llama a MediaPlayer.OnInfoListener con extra == 35. Cuando esto sucede, estás jodido y el video no se reproducirá correctamente. No tengo idea de lo que lo causa. La única solución que encontré fue intentar reiniciar el video y repetir todo el proceso de preparación de Async nuevamente. La reproducción de video usualmente funciona la segunda vez.
Tamaño del video no establecido: Incluso después de que se emita (o se prepare de manera equivalente) el tamaño del video, no se puede establecer el tamaño del video MediaPlayer.OnPreparedListener. El tamaño del video generalmente se establecerá en un par de milisegundos después de preparar las devoluciones, pero por unos momentos se encuentra en un estado nebuloso. Si llama a MediaPlayer.start () antes de establecer el tamaño del video, a veces la reproducción fallará (pero no siempre). Existen dos soluciones potenciales para esto: (1) sondeo MediaPlayer.getVideoHeight () o getVideoWidth () hasta que no sean cero o (2) espere hasta que se llame a OnVideoSizeChangedListener. Solo después de uno de estos dos eventos, debe llamar a start ().
Con estas dos correcciones, la reproducción de video es mucho más consistente. Es muy probable que estos problemas sean fallos en mis teléfonos (Samsung Charge y un T-Mobile Comet), por lo que no me sorprendería si hay problemas diferentes pero similares en otros teléfonos.
Siguiendo las sugerencias de Speedplane se me ocurrió el siguiente código. Si MediaPlayer.getVideoHeight () devuelve 0 en onPrepared, entonces demoro 1 segundo y lo intento de nuevo. Ahora, si no juega la primera vez, usualmente jugará 1 segundo más tarde. Aunque lo he visto tomar varios intentos.
private void videoPlayer(String path){
if (mMediaController == null)
{
mMediaController = new MediaController(this);
mVideoView.setMediaController(mMediaController);
}
if (!mMediaController.isShowing())
mMediaController.show();
getWindow().setFormat(PixelFormat.TRANSLUCENT);
mVideoView.setVideoPath(path);
mVideoView.requestFocus();
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(final MediaPlayer mp) {
mVideoView.seekTo(mImageSeek);
if (mp.getVideoHeight() == 0) {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mVideoView.stopPlayback();
mMediaController = null;
videoPlayer(mImageFilepath);
}
}, 1000);
} else
mVideoView.start();
}
});
}
También tuve ese problema en mi Desire HD aproximadamente 1 o 2 veces. Probé muchas cosas pero el error siempre estuvo ahí. Después de todo, elegí instalar una rom personalizada en mi dispositivo. Después funcionó perfectamente y nunca más tuve este problema.
Sé que no es el tipo de respuesta que te gustaría escuchar, pero no encontré otra alma.
Aquí encontrarás roms personalizadas para tu dispositivo: Desarrolladores XDA
Espero poder ayudarte
Saludos cordiales y felices películas.
safari =)