2011-04-03 13 views

Respuesta

10

Terminé usando VideoView.setOnPreparedListener. Esto fue suficiente para cubrir mi problema (botón de reproducción dibujable para pausar)

1

Por lo que yo sé, no hay ningún evento enviado cuando el vídeo comienza a reproducirse en VideoView, pero puede piense en dos opciones:

  1. Cree usted mismo una versión de VideoView que envíe eventos en esos casos.
  2. Uso MediaController (que es por defecto en VideoView)

Si desea una opción de seguir - se puede obtener la fuente de VideoView from here

-1

Otra forma de detectar si la video-vista comenzó es usando videoView.getCurrentPosition(). getCurrentPosition() devuelve 0 si la transmisión no se inició.

protected Runnable playingCheck = new Runnable() { 
     public void run() { 
      while (true) { 
       if (vw.getCurrentPosition() != 0) { 
        // do what you want when playing started 
        break; 
       } else { 
        try { 
         Thread.sleep(250); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
    }; 

luego llamar a:

new Thread(playingCheck).start(); 
+1

OMG, por favor no ir por este camino! Estás encuestando por un tiempo (verdad). Esto es realmente malo – edoardotognoni

+0

Estoy de acuerdo con @edoardotognoni –

+0

el punto clave de la respuesta no es la parte de bucle, sino el método getCurrentPosition(). Solo quería llamar a esta función periódicamente para detectar si el video se inició o no. puede usar diferentes estructuras para operaciones periódicas si lo desea. pero como dije, no es la parte importante del problema "es mi video iniciado" –

-1

Por favor, intente esto:

final Handler h = new Handler(); 
       h.postDelayed(new Runnable() { 
        public void run() { 
          if (videoView.getCurrentPosition() != 0) { 
           ((ProgressBar) rootView.findViewById(R.id.pgStreaming)).setVisibility(View.GONE); 
          } else { 
           h.postDelayed(this, 250); 
          } 
        } 
       }, 250); 
9

Hay un gran artículo sobre MediaPlayer aquí - http://www.malmstein.com/blog/2014/08/09/how-to-use-a-textureview-to-display-a-video-with-custom-media-player-controls/

Puede establecer infoListener en su VideoView

setOnInfoListener(new MediaPlayer.OnInfoListener() { 
    @Override 
    public boolean onInfo(MediaPlayer mp, int what, int extra) { 

     if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) { 
      // Here the video starts 
      return true; 
     } 
     return false; 
    } 
+1

Gracias, pero desafortunadamente requiere API> 16 –

2

aceptado La respuesta aquí no es 100% exacta.

En ocasiones, la preparación se realiza 3 segundos antes de que se muestre el primer fotograma. Sugiero tener una devolución de llamada en ese evento (MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START)

  mMediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() { 
      @Override 
      public boolean onInfo(MediaPlayer mediaPlayer, int i, int i1) { 
       if (i == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START){ 
        //first frame was bufered - do your stuff here 
       } 
       return false; 
      } 
     }); 

ver información multimedia documantaion para más devoluciones de llamada de información/advertencia: https://developer.android.com/reference/android/media/MediaPlayer.html#MEDIA_INFO_VIDEO_RENDERING_START

Cuestiones relacionadas