VideoView activa OnPreparedListener demasiado pronto para HLS
Quiero mostrar al usuario ProgressDialog mientras espera que VideoView comience a jugar HLS. Trato de usar OnPreparedListener para esto, pero se dispara a principios (después de descargar el archivo m3u8, no cuando el video comenzó).
VideoView player = (VideoView) findViewById(R.id.player); String httpLiveUrl = "http://example.com/playlist.m3u8"; player.setVideoURI(Uri.parse(httpLiveUrl)); player.setMediaController(new MediaController(this)); player.requestFocus(); player.setOnPreparedListener(new OnPreparedListener() { public void onPrepared(MediaPlayer mp) { progress.dismiss(); } }); progress.show(); player.start();
No encontré otro listner adecuado … ¿Puede ser alguien sabe sloution?
- Android - Transmisión adaptativa de velocidad de bits. (HLS) Calidad del flujo
- La URL de streaming en vivo de Android http usando mediaplayer
- ¿El reproductor de medios de Android suministra id de sesión en los encabezados de peticiones HTTP?
- Http Live Streaming en Android 4 (Ice Cream Sandwich)
- Jugar HLS en Android (comparar alternativas)
- Transmisión de vídeo en directo desde el dispositivo Android al servidor
- MediaPlayer Framework en GingerBread y soporte de streaming en vivo HTTP de Apple
- Reproducir vídeo m3u8 en android
- Desarrolla reproductor de video en android para apoyar HLS
- Widevine DRM en Android 4.X
- Cómo reproducir el archivo de audio Mp3 desde el servidor
- Añadir codec de vídeo a Android
- Tipo de video mime de Android HLS
Gracias a todos. He resuelto mi problema con el siguiente hack:
videoView.setOnPreparedListener(new OnPreparedListener() { public void onPrepared(MediaPlayer mp) { final Handler handler = new Handler(); videoPositionThread = new Runnable() { public void run() { try { int duration = videoView.getCurrentPosition(); if (!(videoPosition == duration && videoView.isPlaying())) { progress.dismiss(); } videoPosition = duration; handler.postDelayed(videoPositionThread, 1000); } catch (IllegalArgumentException e) { Log.d(TAG, e.getMessage(), e); } } }; handler.postDelayed(videoPositionThread, 0); } });
He experimentado el mismo problema, y acaba de encontrar una solución para mis necesidades. Tal vez esto funcione para usted, también. Por lo menos está probado y funciona en Android 2.2, 2.3 y 4.2.
La idea es verificar periódicamente si la posición actual de videoView es mayor que cero. Es una modificación de la respuesta de mikhail. Gracias a mikhail, también 🙂
public class VideoViewActivity extends Activity { // Declare variables ProgressDialog pDialog; VideoView videoview; Runnable videoPositionThread; // Insert your Video URL String VideoURL = "enter your video rtsp url here"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.videoview_main); videoview = (VideoView) findViewById(R.id.VideoView); pDialog = new ProgressDialog(VideoViewActivity.this); pDialog.setTitle("Android Video Streaming Tutorial"); pDialog.setMessage("Buffering..."); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); Uri video = Uri.parse(VideoURL); videoview.setVideoURI(video); videoview.start(); final Handler handler = new Handler(); videoPositionThread = new Runnable() { public void run() { int currentPosition = videoview.getCurrentPosition(); if (currentPosition > 0) pDialog.dismiss(); else handler.postDelayed(videoPositionThread, 1000); } }; handler.postDelayed(videoPositionThread, 0); } }
- Intent.resolveActivity! = Null pero el lanzamiento de la intención lanza una excepción de ActivityNotFound
- Cómo buscar un valor en firebase Android