6
votes

Loading vidéo uniquement dans VideoView sans jouer instantanément

J'ai une question est possible dans Android de charger les données vidéo dans un videoView sans qu'il commence instantanément à jouer? Si oui, comment pourrais-je faire ça?


0 commentaires

7 Réponses :


4
votes

videoView ne démarre pas la lecture automatiquement, au moins si vous avez un mediacontroller ci-joint. Vous devez appeler start () pour qu'il commence à lire la lecture. Par conséquent, si vous ne voulez pas qu'il démarre la lecture, n'appelle pas start () .


4 commentaires

Le seul problème que j'ai maintenant, c'est que la vidéo ne s'affiche pas du tout dans la vue, ce que je veux dire, c'est que j'aimerais qu'il apparaisse (seulement la première image) et que vous avez des contrôles (jouer / pause, arrêter, avancer et en arrière) juste sous elle ...


MediaController est une chose contextuelle - L'utilisateur doit appuyer sur votre videoView pour qu'il apparaisse. Si vous voulez des contrôles toujours visibles, vous devez probablement le faire vous-même. Voir GITUB.COM/COMMONSGUY/VIDTRY pour un projet utilisant MediaPlayer et un Surfaceview avec un panneau "Controller" personnalisé. En ce qui concerne la première image, autre que la lecture de départ, vous n'avez aucun moyen de forcer ce cadre à afficher, Afaik.


Comment puis-je savoir quand la vidéo est chargée? Donc, que je peux gérer une autre action ou montrer quelque chose à l'utilisateur.


@XAIF: Je ne sais pas ce que vous considérez "chargé" pour signifier, mais il y a développeur.android.com/reference/android/widget/...



7
votes

J'ai aussi voulu que ma vidéoView soit dans un état de pause lorsque l'activité a commencé. Je n'ai pas pu trouver un moyen simple d'afficher le premier cadre (non noir) de la vidéo.

En tant que solution de contournement, j'ai créé une vignette bitmap à partir de la ressource vidéo, puis placez cette vignette comme l'arrière-plan sur la vidéosView sur l'activité Démarrer. Ensuite, lorsque la vidéo commence à jouer, vous n'avez besoin que de l'arrière-plan (sinon que votre vidéo de lecture est cachée derrière votre image d'arrière-plan). P>

    mPlay.setOnClickListener(new OnClickListener() {
        public void onClick(View view) {
            if(!isPlaying){
                keepScreenOn();
                mPlay.setText("Pause");

                // make sure to null the background so you can see your video play
                mVideoView.setBackgroundDrawable(null);

                mVideoView.start();
                isPlaying = true;
            } else {
                mPlay.setText("Play");
                mVideoView.pause();
                isPlaying = false;
            }
        }
    });


0 commentaires

0
votes

J'utilisais le MediaController pour mon bouton de lecture, donc j'ai utilisé la réponse de la liaison ci-dessous combinée à ce bitmap de fond pour ma solution.

événement pour videoView Playback Etat ou MediaController Play / Pause < / a>


0 commentaires

0
votes

Je vous suggère pour le code suivant dans lequel je suis exécuté mon application avec succès

Le code est comme suit: p>

fichier XML: p>

<manifest>
    ...
    <uses-sdk...  />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_VIDEO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />

    <application>...</application>

</manifest>


0 commentaires

15
votes

Je pensais aussi à montrer un thunbnail comme Sharael indiqué. Mais je pense que cela pourrait entraîner une performance réduite.

Alors, ce que je fais maintenant, c'est juste appeler xxx

pour transmettre la vidéo sur la première milliseconde. Cela fonctionne bien pour moi et est rapide à mettre en œuvre.


2 commentaires

Cela ne fonctionnera pas car la vidéo doit être en état de lecture.


CECKTO (1) Semble être important pour moi. Sans la recherche de ma vidéo affichera une image aléatoire, généralement le cadre 1 sec ultérieure, au tout début lorsque j'ai appelé start ()



0
votes

Je l'ai trouvé possible en démarrant la vidéo en attendant 1 milliseconde et en pause: xxx


0 commentaires

1
votes

J'ai trouvé que juste faire videoview.seekto (n) code> n'est pas suffisant sur tous les périphériques pour afficher la première image de la vidéo.

Si tout ce que vous devez faire est de montrer le premier Cadre, mais ne jouez pas la vidéo, vous pouvez simplement faire cela, ce qui est utile pour rendre la vignette de la vidéo: p> xxx pré>

Cependant, pour montrer de manière fiable la première image dans les cas où Vous souhaitez lire la vidéo à un moment donné après le rendu, par exemple à partir d'une interaction utilisateur, ma solution consiste à enregistrer un onpreparedlistener code>, puis appelez start () code>. J'inscrit également un Oninfolistener code> afin que je puisse être averti lorsque le rendu commence. Je vérifie ensuite si l'info est en effet un événement "Start de rendu", et je vérifie si c'est la première fois que le videoView code> a commencé à rendu. Si oui, i pause () code> puis chercheto (0) code>. P>

Voici comment cela regarderait: P>

private void showFirstFrame(final VideoView videoView, Uri uri) {
  videoView.setVideoURI(uri);

  final AtomicBoolean showedFirstFrame = new AtomicBoolean(false);

  videoView.setOnInfoListener(new MediaPlayer.OnInfoListener() {
    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
      // If this is our first time starting video rendering, pause and show first frame
      if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START
          && showedFirstFrame.compareAndSet(false, true)) {
        videoView.pause();
        videoView.seekTo(0);
      }

      return false;
    }
  });

  videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
      videoView.start();
    }
  });
}


0 commentaires