web-dev-qa-db-fra.com

Définition de la granularité de l'événement audio HTML5 'TimeUpDate'

J'essaie de créer une fonction de boucle simple à l'aide de HTML5 audio et d'avoir une solution très primitive comme suit:

$(audio).bind('timeupdate', function() {
  if (audio.currentTime >= 26){
    var blah = audio.currentTime; 
    audio.currentTime = 23;
    console.log(blah);
  }
})

Cela fonctionne bien mais le seul problème ici est que l'événement TimeUpdate ne déclenche pas de manière très systématique. Par exemple, la console.log ci-dessus renvoyée: 26.14031982421875

26.229642868041992

26.13462257385254

26.21796226501465

...etc. (Vous avez l'idée de l'idée.

De toute évidence, cela ne fonctionnera pas pour une application où le calendrier est important (applications musicales). Donc, la solution évidente pour moi serait d'augmenter la granularité avec laquelle l'événement TIMUPDate est déclenché. Je n'ai pas pu trouver des documents d'API ... mais aimerais savoir s'il y a un moyen de le faire.

27
udit

Je suis désolé, mais c'est comme ça que ça marche. À partir de Spécifications HTML5 :

Toutes les 15 à 250 ms, ou chaque fois que la position du contrôleur de média du MediaController change le moins souvent, l'agent utilisateur doit faire la queue une tâche pour déclencher un événement simple nommé Temps-up à la carte MediaController.

Aussi,

L'événement ne doit donc pas être tiré plus rapidement que environ 66Hz ou plus lentement que 4Hz (en supposant que les gestionnaires d'événements ne prennent pas plus de 250 ms à courir). Les agents utilisateur sont encouragés à faire varier la fréquence de l'événement en fonction de la charge du système et du coût moyen du traitement de l'événement à chaque fois, de sorte que les mises à jour de l'interface utilisateur ne sont plus fréquentes que l'agent utilisateur ne puisse pas gérer confortablement lors de la décodage de la vidéo.

Si vous lisez via la spécification, vous pouvez avoir l'idée que timeupdate événement est une sorte d'événement "meilleur effort". Il va tirer quand il peut et toujours aussi longtemps qu'il n'affecte pas trop la performance.

Vous pouvez filtrer les événements qui se jettent de temps en temps pour lisser les heures d'arrivée, mais je crains que cela ne soit pas possible de faire le contraire.

29
jbalsas

Il convient de noter que vous CAN Lisez la propriété actuelle d'une vidéo beaucoup plus souvent. Si le temps est vraiment critique et que vous pouvez vivre avec un peu d'incertitude, vous pouvez essayer cela à la place.

Cependant, il est beaucoup moins élégant que d'utiliser son propre événement timeupdate.

setInterval(function () {
    console.log(audio.currentTime); // will get you a lot more updates.
}, 30);

Dans ce cas, vous devrez gérer vous-même l'intervalle vous-même, assurez-vous de l'effacer avant nulling l'élément audio. Mais c'est est une possibilité.

J'utilise cette approche sur un élément vidéo, mais cela devrait également s'appliquer ici.

44
amenthes