HTML5 オーディオがサウンドを生成し始める正確な瞬間をキャッチする必要があります。
見た目ほど単純ではないことがわかりました。
onplay
またはonplaying
イベントが発生したときにオーディオの再生が開始されることを期待できますか? とんでもない。少なくとも WebKit ファミリでは、この時点で正確に発火するブラウザ イベントはないようです。Chrome、Safari、Firefox では onplay
、onplaying
イベントは単にoncanplay
!
その事実を証明する簡単なテストを用意しました。これは、すべてのイベントが既に起動された後、ある程度の時間 (100 ミリ秒から 400 ミリ秒以上) 後にオーディオが実際に再生を開始することを示しています。
コンソールログを見ると、耳と耳でこれに気付くことができます。ログではcurrentTime
、15msごとに出力します。実際のオーディオの状態を正しく反映しているようで、イベントが発生した後に 10 ~ 40 のポーリングを変更し始めます。play
そのため、が起動された後もオーディオはフリーズしたままです。
テスト コードは次のようになります。
var audioEl = new Audio('http://www.w3schools.com/tags/horse.ogg');
audioEl.oncanplay = function () {
console.log('oncanplay');
audioEl.currentTime = 1;
console.log('ready state is: ' + audioEl.readyState);
audioEl.play();
}
audioEl.oncanplay = function () {
console.log('oncanplay again');
}
audioEl.onplay = function() {
console.log('onplay -----------------');
}
audioEl.onplaying = function() {
console.log('onplaying ----------------');
}
setInterval(function () {
console.log(audioEl.currentTime);
}, 15);
Jsフィドル
ビジュアル アニメーションと正確に同期させるには、オーディオの再生が開始される正確な瞬間を知る必要があります。
もちろん、クイックポーリングを使用して、この瞬間を大まかに見つけることができます。これは、リアルタイム アプリ、特にモバイルでのパフォーマンスにとって非常に悪いものです。
誰かがこれに対するより良い解決策を知っているかどうか尋ねています。2014 年になっても、HTML オーディオの実装はまだ不十分なようです :(