Web Audio API reprise à partir de la pause
J'ai souvent lu qu'il n'est pas possible de mettre en pause/reprendre des fichiers audio avec le Web Audio API.
Mais maintenant, j'ai vu un exemple où ils sont réellement possible de mettre en pause et reprendre la lecture. J'ai essayé de comprendre ce que la façon dont ils l'ont fait. J'ai pensé que peut-être source.looping = false
est la clé, mais il n'était pas.
Pour l'instant mon audio est toujours re-jouer dès le début.
C'est mon code actuel
var context = new (window.AudioContext || window.webkitAudioContext)();
function AudioPlayer() {
this.source = context.createBufferSource();
this.analyser = context.createAnalyser();
this.stopped = true;
}
AudioPlayer.prototype.setBuffer = function(buffer) {
this.source.buffer = buffer;
this.source.looping = false;
};
AudioPlayer.prototype.play = function() {
this.source.connect(this.analyser);
this.analyser.connect(context.destination);
this.source.noteOn(0);
this.stopped = false;
};
AudioPlayer.prototype.stop = function() {
this.analyser.disconnect();
this.source.disconnect();
this.stopped = true;
};
Quelqu'un sait quoi faire, pour le faire fonctionner?
OriginalL'auteur Dan Lee | 2012-07-16
Vous devez vous connecter pour publier un commentaire.
Sans perdre de temps à vérifier la source de ton exemple, je dirais que vous aurez envie d'utiliser le noteGrainOn méthode de la AudioBufferSourceNode (https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#methodsandparams-AudioBufferSourceNode)
Juste garder une trace de comment loin dans le tampon que vous étiez lorsque vous avez appelé note-off est détectée, puis faire noteGrainOn à partir de là, lors de la reprise sur un nouveau AudioBufferSourceNode.
N'a que faire du sens?
EDIT:
Voir les commentaires ci-dessous pour la mise à jour des appels d'API.
noteGrainOn()
dans l'exemple (toujours pas à comprendre comment il le fait, tout de même). Mais de toute façon, cela fonctionne comme un charme, alors je vais prendre cela comme un accepté de répondre. Merci 🙂noteGrainOn() a été rebaptisé dans la spec, comme on l'a noteOn() -- les deux sont maintenant play(), avec ou sans un grain de décalage argument. N'ai pas vu ce encore pris en charge, si.
c'est en fait
start
(avec ou sans argumentsstart(howSoonRelativeToCurrentTime, fromSecondInBuffer, forDuration)
) et il semble que cela fonctionne dans Chrome Canarystart
etstop
ne peut être utilisé qu'une seule fois: w3.org/TR/webaudio/#methodsandparams-AudioBufferSourceNode, mais il est possible de faire une nouvelleAudioBufferSourceNode
de la mêmeAudioBuffer
et de commencer à la position où le dernier était à l'arrêt (avec unoffset
).OriginalL'auteur Oskar Eriksson
Oskar réponse et ayke commentaire sont très utiles, mais j'ai été absent un exemple de code. J'ai donc écrit un: http://jsfiddle.net/v3syS/2/ j'espère que cela aide.
OriginalL'auteur imbrizi
Dans les navigateurs actuels (Chrome 43, Firefox 40) il y a maintenant "suspendre" et "resume" méthodes disponibles pour AudioContext:
(modifié le code d'exemple de https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/suspend)
OriginalL'auteur schellmax
L'absence d'un haut-pause fonctionnalité dans le WebAudio API semble comme une erreur majeure pour moi. Peut-être, dans l'avenir, il sera possible de le faire à l'aide de l'prévues MediaElementSource, ce qui vous permettra de brancher un élément (prise en charge de pause) de Web Audio. Pour l'instant, la plupart des solutions de contournement semblent être fondées sur la mémorisation de temps de lecture (tel que décrit dans le imbrizi de réponse). Une telle solution a des problèmes lors de la boucle des sons (la mise en oeuvre de la boucle instantanés ou pas?), et quand vous vous permettent de modifier dynamiquement le playbackRate de sons (comme la fois une incidence sur le timing). Une autre, tout aussi hack-ish et techniquement incorrect, mais beaucoup plus simple solution de contournement, vous pouvez utiliser est:
Malheureusement, 0 n'est pas une valeur valide pour playbackRate (qui serait en fait la pause le son). Toutefois, pour de nombreuses raisons pratiques, certains de très faible valeur, comme 0.000001, est assez proche, et qu'il ne produira aucun son audible.
Ce n'est pas une bonne idée, comme vous allez empêcher le navigateur de nettoyage non utilisé des tampons audio. C'est un peu maladroit de travailler avec l'API, comme il est, mais il est conçu de cette façon pour des raisons de performance et de l'efficacité de mémoire. Une petite bibliothèque d'encapsulation comme dans la Fpo question est une meilleure approche.
OriginalL'auteur jonas echterhoff
Mise à JOUR: Ceci est valable uniquement pour Chrome. Firefox (v29) n'a pas encore de mettre en œuvre les
MediaElementAudioSourceNode.mediaElement
propriété.En supposant que vous avez déjà la AudioContext de référence et de source de média (par exemple, via
AudioContext.createMediaElementSource()
appel de méthode), vous pouvez appelerMediaElement.play()
etMediaElement.pause()
votre source, par exemplePas besoin de hacks et des solutions de contournement, il est pris en charge.
Si vous travaillez avec un
<audio>
balise comme source, vous ne devez pas appeler pause directement sur l'élément audio dans votre fichier JavaScript, qui permet d'arrêter la lecture.OriginalL'auteur Kovács Imre
En 2017, à l'aide de ctx.currentTime fonctionne bien pour garder la trace du point dans la chanson. Le code ci-dessous utilise un bouton (songStartPause) qui permet de basculer entre un play & bouton pause. J'ai utilisé des variables globales pour des raisons de simplicité. La variable musicStartPoint assure le suivi de ce moment, vous êtes dans la chanson. La musique de l'api permet de suivre de temps en secondes.
Définir votre initiale musicStartPoint à 0 (début de la chanson)
Utilisation du ctx.currentTime pour soustraire le temps de la fin de la chanson à partir de quand ça a commencé, et l'ajout de ce laps de temps si loin que vous étiez dans la chanson initialement.
De chargement/fonctions de lecture.
Enfin, la fonction de lecture dit la chanson de commencer à l'musicStartPoint (et à jouer immédiatement), et définit également la songOnTime variable.
*Note: je sais, ça peut paraître un nettoyant pour le jeu de songOnTime dans la fonction de clic, mais je suppose que cela a du sens pour saisir le code de temps aussi proche que possible de la src.démarrer, juste comme la façon dont nous prenons le temps de pause aussi proche que possible de la src.stop.
OriginalL'auteur user3597313
Je n'ai pas suivi la discussion, mais je le ferai bientôt. J'ai simplement dirigé sur HAL démo pour comprendre. Pour ceux qui, maintenant, fais comme moi, je voudrais dire
1 - comment faire de ce code de travail maintenant.
2 - une astuce pour obtenir pause/play, à partir de ce code.
1 : remplacer noteOn(xx) avec start(xx) et de mettre les url valide dans son.load(). Je pense que c'est tout ce que j'ai fait. Vous obtiendrez quelques erreurs dans la console qui sont assez directive. Les suivre. Ou pas : parfois, vous pouvez les ignorer, il travaille maintenant : c'est lié à l'-webkit préfixe dans une certaine fonction. De nouveaux sont donnés.
2 : à un certain point, quand il fonctionne, vous pouvez suspendre le son.
Il va travailler. Mais, comme chacun le sait, une nouvelle pression sur jouer permettrait de lever une erreur. En conséquence, le code de cette.play() après le mauvais source_.start(0) n'est pas exécutée.
J'ai simplement fermé les dans un try/catch :
Et ça fonctionne : vous pouvez utiliser play/pause.
Je tiens à mentionner que cette HAL simulation est vraiment incroyable. Suivez ces étapes simples, ça vaut le coup !
OriginalL'auteur Artatum
Pour chrome fixer, chaque fois que vous voulez jouer du son, de la définir comme:
OriginalL'auteur Pan Bouradas