Que le chargement de la vidéo dans VideoView sans jouer instantanément
J'ai une question est-il possible dans Android pour charger les données vidéo dans un VideoView sans instantanément commencer à jouer? Si oui, comment pourrais-je le faire?
VideoView ne démarre pas automatiquement la lecture, au moins si vous avez un MediaController ci-joint. Vous devez appeler start() de l'avoir commencer la lecture. Donc, si vous ne le souhaitez pas, il pour commencer la lecture, ne pas appeler start().
Le seul problème que j'ai maintenant c'est que la Vidéo ne montre pas du tout dans la vue, ce que je veux dire, c'est que je voudrais qu'il s'affiche (uniquement la première image) et ont des commandes (lecture/pause, stop, avance et retour rapide) juste en dessous... MediaController est une fenêtre pop-up chose: l'utilisateur doit taper votre VideoView pour qu'il apparaisse. Si vous voulez toujours visible contrôles, vous avez probablement à faire vous-même. Voir github.com/commonsguy/vidtry pour un projet à l'aide de MediaPlayer et un SurfaceView avec un "contrôleur". À l'égard de la première image, autre que de commencer la lecture, vous n'avez aucun moyen de forcer cette image à afficher, autant que je sache.
Je pensais aussi à montrer un thunbnail comme sghael déclaré. Mais je pense que cela pourrait entraîner une diminution de la performance.
Donc ce que je fais maintenant est juste appeler
videoView.seekTo(1);
de transmettre de la vidéo à la première milliseconde. Cela fonctionne très bien pour moi et c'est rapide à mettre en œuvre.
c'est de l'argent! 🙂 Cela ne marchera pas car la vidéo doit être en état de lecture. seekTo(1) semble être important pour moi. Sans la recherche de ma vidéo affiche une image aléatoire, généralement de l'image 1 sec plus tard, au tout début quand j'ai invoqué start()
Je voulais aussi mon VideoView à être dans un état de pause quand l'activité commence. Je ne pouvais pas trouver un moyen simple d'avoir la VideoView montrer la première (non noir) image de la vidéo.
Comme une solution de contournement, j'ai créé une image bitmap de vignette de la vidéo de la ressource, et puis placez la vignette dans le fond du VideoView sur de début de l'activité. Puis, lorsque la Vidéo commence à jouer, vous avez seulement besoin de la valeur null à l'arrière-plan (ou autre de votre jeu vidéo est caché derrière votre image d'arrière-plan).
Bitmap thumbAsBitmap =null;BitmapDrawable thumbAsDrawable =null;privateString current;privatevoid setupVideo(){try{
setVideoFilePath();if(current ==null|| current.length()==0){Toast.makeText(PreviewMessage.this,"File URL/path is empty",Toast.LENGTH_LONG).show();}else{
keepScreenOn();
mVideoView.setVideoPath(getDataSource(current));
mVideoView.setOnCompletionListener(this);//create and place a thumbnail for the start state
thumbAsBitmap =ThumbnailUtils.createVideoThumbnail(current,MediaStore.Images.Thumbnails.MINI_KIND);
thumbAsDrawable =newBitmapDrawable(thumbAsBitmap);
mVideoView.setBackgroundDrawable(thumbAsDrawable);
mVideoView.pause();
isPlaying =false;}}catch(Exception e){if(mVideoView !=null){
mVideoView.stopPlayback();}}}
Alors où votre playbutton est, vous pouvez faire quelque chose comme
mPlay.setOnClickListener(newOnClickListener(){publicvoid 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;}}});
J'ai été en utilisant le MediaController pour mon bouton de lecture, alors j'ai utilisé le lien ci-dessous réponse combiné avec cette image d'arrière-plan pour ma solution.
j'ai trouvé il possible par le démarrage de la vidéo, en attendant de 1 milliseconde et la mise en pause:
mediaController =newMediaController(this);//set the path for video here Uri video =Uri.parse(tempPath);//set the VideoView id in xml file here
vv_item =(VideoView) findViewById(R.id.itemdetails_vv_item);
vv_item.setMediaController(mediaController);
vv_item.setVideoURI(video);
vv_item.setOnPreparedListener(newOnPreparedListener(){publicvoid onPrepared(MediaPlayer mp){//first starting the video, when loaded
vv_item.start();//then waiting for 1 millisecondtry{Thread.sleep(1);}catch(InterruptedException e){// TODO Auto-generated catch block
e.printStackTrace();}//then pausing the video. i guess it's the first frame
vv_item.pause();//showing the control buttons here
mediaController.show();}});
J'ai trouvé que faire juste VideoView.seekTo(n) n'est pas suffisant sur tous les périphériques pour afficher la vidéo de la première image.
Si tout ce que vous devez faire est de montrer la première image, mais pas la lecture de la vidéo, ensuite il vous suffit de faire ce qui est utile pour rendre une vidéo de vignette:
Cependant, fiable pour afficher la première image dans le cas où vous voulez jouer la vidéo à un certain point, après avoir rendu, comme à partir d'une interaction de l'utilisateur, ma solution est d'enregistrer un OnPreparedListener, et ensuite appeler start(). J'ai également inscrire un OnInfoListener de sorte que je peux être averti lorsque le rendu commence. J'ai ensuite vérifier si l'info est en effet un rendu de début de l'événement", et je vérifie si c'est la première fois que le VideoView a commencé rendu. Si oui, je pause() et puis seekTo(0).
Voici à quoi cela ressemblerait à:
privatevoid showFirstFrame(finalVideoView videoView,Uri uri){
videoView.setVideoURI(uri);finalAtomicBoolean showedFirstFrame =newAtomicBoolean(false);
videoView.setOnInfoListener(newMediaPlayer.OnInfoListener(){@Overridepublicboolean onInfo(MediaPlayer mp,int what,int extra){//If this is our first time starting video rendering, pause and show first frameif(what ==MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START
&& showedFirstFrame.compareAndSet(false,true)){
videoView.pause();
videoView.seekTo(0);}returnfalse;}});
videoView.setOnPreparedListener(newMediaPlayer.OnPreparedListener(){@Overridepublicvoid onPrepared(MediaPlayer mp){
videoView.start();}});}
VideoView
ne démarre pas automatiquement la lecture, au moins si vous avez unMediaController
ci-joint. Vous devez appelerstart()
de l'avoir commencer la lecture. Donc, si vous ne le souhaitez pas, il pour commencer la lecture, ne pas appelerstart()
.MediaController
est une fenêtre pop-up chose: l'utilisateur doit taper votreVideoView
pour qu'il apparaisse. Si vous voulez toujours visible contrôles, vous avez probablement à faire vous-même. Voir github.com/commonsguy/vidtry pour un projet à l'aide deMediaPlayer
et unSurfaceView
avec un "contrôleur". À l'égard de la première image, autre que de commencer la lecture, vous n'avez aucun moyen de forcer cette image à afficher, autant que je sache.OriginalL'auteur CommonsWare
Je pensais aussi à montrer un thunbnail comme sghael déclaré. Mais je pense que cela pourrait entraîner une diminution de la performance.
Donc ce que je fais maintenant est juste appeler
de transmettre de la vidéo à la première milliseconde. Cela fonctionne très bien pour moi et c'est rapide à mettre en œuvre.
Cela ne marchera pas car la vidéo doit être en état de lecture.
seekTo(1)
semble être important pour moi. Sans la recherche de ma vidéo affiche une image aléatoire, généralement de l'image 1 sec plus tard, au tout début quand j'ai invoquéstart()
OriginalL'auteur Kai
Je voulais aussi mon VideoView à être dans un état de pause quand l'activité commence. Je ne pouvais pas trouver un moyen simple d'avoir la VideoView montrer la première (non noir) image de la vidéo.
Comme une solution de contournement, j'ai créé une image bitmap de vignette de la vidéo de la ressource, et puis placez la vignette dans le fond du VideoView sur de début de l'activité. Puis, lorsque la Vidéo commence à jouer, vous avez seulement besoin de la valeur null à l'arrière-plan (ou autre de votre jeu vidéo est caché derrière votre image d'arrière-plan).
Alors où votre playbutton est, vous pouvez faire quelque chose comme
OriginalL'auteur sghael
J'ai été en utilisant le MediaController pour mon bouton de lecture, alors j'ai utilisé le lien ci-dessous réponse combiné avec cette image d'arrière-plan pour ma solution.
Événement pour VideoView l'état de lecture ou MediaController play/pause
OriginalL'auteur Sean Moore
OriginalL'auteur Hardik Vora
j'ai trouvé il possible par le démarrage de la vidéo, en attendant de 1 milliseconde et la mise en pause:
OriginalL'auteur mironov
J'ai trouvé que faire juste
VideoView.seekTo(n)
n'est pas suffisant sur tous les périphériques pour afficher la vidéo de la première image.Si tout ce que vous devez faire est de montrer la première image, mais pas la lecture de la vidéo, ensuite il vous suffit de faire ce qui est utile pour rendre une vidéo de vignette:
Cependant, fiable pour afficher la première image dans le cas où vous voulez jouer la vidéo à un certain point, après avoir rendu, comme à partir d'une interaction de l'utilisateur, ma solution est d'enregistrer un
OnPreparedListener
, et ensuite appelerstart()
. J'ai également inscrire unOnInfoListener
de sorte que je peux être averti lorsque le rendu commence. J'ai ensuite vérifier si l'info est en effet un rendu de début de l'événement", et je vérifie si c'est la première fois que leVideoView
a commencé rendu. Si oui, jepause()
et puisseekTo(0)
.Voici à quoi cela ressemblerait à:
OriginalL'auteur hansonchris