--- title: AudioContext.decodeAudioData() slug: Web/API/BaseAudioContext/decodeAudioData tags: - API - Audio - AudioContext - BaseAudioContext - Method - Reference - Web Audio API - decodeAudioData translation_of: Web/API/BaseAudioContext/decodeAudioData original_slug: Web/API/AudioContext/decodeAudioData ---
{{ APIRef("Web Audio API") }}
decodeAudioData()
は {{ domxref("BaseAudioContext") }} のメソッドで、 {{domxref("ArrayBuffer")}} に書き込まれた音声ファイルデータを非同期にデコードするために使用されます。この場合、 ArrayBuffer
は {{domxref("XMLHttpRequest")}} と {{domxref("FileReader")}} から読み込まれます。デコードされた {{domxref("AudioBuffer")}} は {{domxref("AudioContext")}} のサンプリングレートにリサンプリングされ、コールバックやプロミスに渡されます。
この方法は、オーディオトラックから Web Audio API 用のオーディオソースを作成する際に推奨される方法です。この方法は、音声ファイルの断片的なデータではなく、完全なファイルデータに対してのみ動作します。
古いコールバック構文:
baseAudioContext.decodeAudioData(ArrayBuffer, successCallback, errorCallback);
新しいプロミスベースの構文:
Promise<decodedData> baseAudioContext.decodeAudioData(ArrayBuffer);
なし、または decodedData で満足する {{domxref("Promise") }} オブジェクトで.
ここでは最初に古いコールバックベースのシステムを、次に新しいプロミスベースの構文を取り上げます。
この例では、 getData()
関数は XHR を使用して音声トラックを読み込み、リクエストの responseType
を arraybuffer
に設定して、レスポンスとして配列バッファーを返すようにして、それを audioData
変数に格納しています。それからこのバッファーを decodeAudioData()
関数に渡します。成功したコールバックは、デコードに成功した PCM データを受け取り、 {{ domxref("AudioContext.createBufferSource()") }} で作成した {{ domxref("AudioBufferSourceNode") }} に入れ、ソースを {{domxref("AudioContext.destination") }} に接続してループするように設定します。
ボタンは単に getData()
を実行して、それぞれトラックの読み込みと再生、停止を行うだけです。ソースの stop()
メソッドが呼ばれると、ソースは消滅します。
// 変数の定義 var audioCtx = new (window.AudioContext || window.webkitAudioContext)(); var source; var pre = document.querySelector('pre'); var myScript = document.querySelector('script'); var play = document.querySelector('.play'); var stop = document.querySelector('.stop'); // 音声トラックの読み込みには XHR を使い、 // decodeAudioData でデコードし、バッファーに格納する // そして、そのバッファーを source に設定する function getData() { source = audioCtx.createBufferSource(); var request = new XMLHttpRequest(); request.open('GET', 'viper.ogg', true); request.responseType = 'arraybuffer'; request.onload = function() { var audioData = request.response; audioCtx.decodeAudioData(audioData, function(buffer) { source.buffer = buffer; source.connect(audioCtx.destination); source.loop = true; }, function(e){ console.log("Error with decoding audio data" + e.err); }); } request.send(); } // 音声の停止と再生を行うボタン play.onclick = function() { getData(); source.start(0); play.setAttribute('disabled', 'disabled'); } stop.onclick = function() { source.stop(0); play.removeAttribute('disabled'); } // pre要素にスクリプトを設定する pre.innerHTML = myScript.innerHTML;
ctx.decodeAudioData(audioData).then(function(decodedData) { // デコードしたデータをここで使う });
仕様 | 状態 | 備考 |
---|---|---|
{{SpecName('Web Audio API', '#dom-baseaudiocontext-decodeaudiodata', 'decodeAudioData()')}} | {{Spec2('Web Audio API')}} |
{{Compat("api.BaseAudioContext.decodeAudioData")}}