16

Web Audio APIで音声ファイルを一時停止/再開できないという記事をよく読みます。
しかし今、実際に一時停止と再開を可能にした例を見ました。彼らがどのようにそれをしたのかを理解しようとしました。多分鍵だと思っsource.looping = falseたが、そうではなかった。
今のところ、私のオーディオは常に最初から再生されています。

これは私の現在のコードです

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;
};

それを機能させるために何をすべきか知っている人はいますか?

4

9 に答える 9

6

サンプルのソースを確認するのに時間をかけずに、AudioBufferSourceNode の noteGrainOn メソッドを使用することをお勧めします ( https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/ specification.html#methodsandparams-AudioBufferSourceNode )

noteOff を呼び出したときにバッファのどこまで進んだかを追跡し、新しい AudioBufferSourceNode で再開するときにそこから noteGrainOn を実行します。

それは理にかなっていますか?

編集: 更新された API 呼び出しについては、以下のコメントを参照してください。

EDIT 2, 2019: 更新された API 呼び出しについては MDN を参照してください。https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode/start

于 2012-07-16T14:45:55.983 に答える
0

WebAudio API に一時停止機能が組み込まれていないことは、私には大きな見落としのように思えます。おそらく、将来的には、要素 (一時停止をサポートする) を Web オーディオに接続できるようにする、計画されている MediaElementSource を使用してこれを行うことが可能になるでしょう。今のところ、ほとんどの回避策は再生時間を記憶することに基づいているようです (imbrizi の回答で説明されているように)。このような回避策には、サウンドをループするとき (実装がギャップレスでループするかどうか)、およびサウンドの再生速度を動的に変更できるようにするときに問題があります (両方ともタイミングに影響するため)。もう 1 つの、同様にハッキング的で技術的に正しくありませんが、使用できるはるかに簡単な回避策は次のとおりです。

source.playbackRate = paused?0.0000001:1;

残念ながら、0 は PlaybackRate の有効な値ではありません (実際にはサウンドが一時停止します)。ただし、多くの実用的な目的では、0.000001 などの非常に低い値で十分に近く、可聴出力は生成されません。

于 2014-01-09T09:29:27.713 に答える
0

更新: これは Chrome でのみ有効です。Firefox (v29) はまだMediaElementAudioSourceNode.mediaElementプロパティを実装していません。

すでに AudioContext 参照とメディア ソース (AudioContext.createMediaElementSource()メソッド呼び出しなど) を持っていると仮定すると、ソースに対してMediaElement.play()andを呼び出すことができます。MediaElement.pause()

source.mediaElement.pause();
source.mediaElement.play();

ハックや回避策は必要ありません。サポートされています。タグをソースとして使用している場合<audio>、JavaScript の audio 要素で直接 pause を呼び出さないでください。再生が停止します。

于 2014-05-27T13:26:13.807 に答える
0

私は完全な議論に従っていませんでしたが、すぐに追跡します。理解するために、HAL デモに向かいました。私のような人のために、1 - このコードを今すぐ機能させる方法を教えてください。2 - このコードから一時停止/再生を取得するためのトリック。

1 : noteOn(xx) を start(xx) に置き換え、有効な URL を sound.load() に入れます。私がやってきたことはそれだけだと思います。コンソールにかなり指示的ないくつかのエラーが表示されます。それらに従う。かどうか: それらを無視できる場合もありますが、現在は機能しています: 一部の関数の -webkit プレフィックスに関連しています。新しいものが与えられます。2 : ある時点で、それが機能するときに、サウンドを一時停止したい場合があります。それが動作します。しかし、誰もが知っているように、プレイを新たに押すとエラーが発生します。その結果、問題のある source_.start(0) の後の this.play() 内のコードは実行されません。これらの行を単に try/catch で囲みました:

      this.play = function() {
    analyser_ = context_.createAnalyser();

    // Connect the processing graph: source -> analyser -> destination
    source_.connect(analyser_);
    analyser_.connect(context_.destination);
  try{
    source_.start(0);
  }
  catch(e){
    this.playing = true;

    (function callback(time) {
      processAudio_(time);
      reqId_ = window.webkitRequestAnimationFrame(callback);
    })();
  }

そしてそれは機能します:再生/一時停止を使用できます。このHAL シミュレーションは本当に素晴らしいと言いたいです。これらの簡単な手順に従ってください。それだけの価値があります。

于 2018-07-21T08:49:34.587 に答える