Capturer des images à partir de vidéos en HTML5 et JavaScript
Je veux capturer une image à partir de la vidéo toutes les 5 secondes.
C'est mon code JavaScript:
video.addEventListener('loadeddata', function() {
var duration = video.duration;
var i = 0;
var interval = setInterval(function() {
video.currentTime = i;
generateThumbnail(i);
i = i+5;
if (i > duration) clearInterval(interval);
}, 300);
});
function generateThumbnail(i) {
//generate thumbnail URL data
var context = thecanvas.getContext('2d');
context.drawImage(video, 0, 0, 220, 150);
var dataURL = thecanvas.toDataURL();
//create img
var img = document.createElement('img');
img.setAttribute('src', dataURL);
//append img in container div
document.getElementById('thumbnailContainer').appendChild(img);
}
Le problème que j'ai est la 1ère deux images générées sont les mêmes et la durée de 5 secondes, l'image n'est pas généré. J'ai trouvé que la vignette est généré avant l'image vidéo de l'heure est affichée dans < video>
tag.
Par exemple, lorsque video.currentTime = 5
, image de image de 0 est générée. Ensuite, l'image vidéo de saut à l'heure 5s. Alors, quand video.currentTime = 10
, image de image 5s est généré.
- Qu'est-ce que theCanvas sur votre generateThumbnail fonction? Pouvez vous s'il vous plaît fournir les balises html, pour cette question, pour être le plus utile? Je suis en train de faire la même chose, mais je ne suis pas sûr de savoir comment theCanvas doivent être déclarés sur la page. Merci!
- Salut Lin, avez-vous encore le code source de cette question, on vous a demandé? pouvez-vous nous fournir un lien?
Vous devez vous connecter pour publier un commentaire.
Cause
Le problème est que la recherche de la vidéo (par la définition c'est
currentTime
) est asynchrone.Vous avez besoin pour écouter la
seeked
événement ou à défaut de quoi elle risque de prendre la réelle image actuelle qui est probablement votre ancienne valeur.Comme il est asynchrone, vous ne devez pas utiliser le
setInterval()
comme il est asynchrone trop et vous ne serez pas en mesure de synchroniser correctement lorsque l'image suivante a pour objectif d'. Il n'est pas nécessaire d'utilisersetInterval()
que nous allons utiliser leseeked
événement à la place qui permettra de garder le tout est synchronisé.Solution
Par ré-écriture du code un peu, vous pouvez utiliser le
seeked
de l'événement pour aller à travers la vidéo de la capture de la bonne image que cet événement nous assure que nous sommes en fait au niveau de l'image, nous avons demandé par le réglage de lacurrentTime
propriété.Exemple
Ajouter ce gestionnaire d'événement pour la partie:
Démo ici
video.currentTime = i;
ne déclenche aucun cherché le cas pour moi.